You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
494 lines
15 KiB
494 lines
15 KiB
<?php
|
|
/*
|
|
| Snicker The first native FlatFile Comment Plugin 4 Bludit
|
|
| @file ./system/class.comment.php
|
|
| @author SamBrishes <sam@pytes.net>
|
|
| @version 0.1.2 [0.1.0] - Alpha
|
|
|
|
|
| @website https://github.com/pytesNET/snicker
|
|
| @license X11 / MIT License
|
|
| @copyright Copyright © 2019 SamBrishes, pytesNET <info@pytes.net>
|
|
*/
|
|
if(!defined("BLUDIT")){ die("Go directly to Jail. Do not pass Go. Do not collect 200 Cookies!"); }
|
|
|
|
class Comment{
|
|
/*
|
|
| CONSTRUCTOR
|
|
| @since 0.1.0
|
|
|
|
|
| @param multi The unique comment id or FALSE.
|
|
| @param multi The unique page comment ID.
|
|
*/
|
|
public function __construct($uid, $uuid){
|
|
$this->vars["uid"] = $uid;
|
|
if($uid === false){
|
|
$row = array(
|
|
"type" => "comment",
|
|
"depth" => 1,
|
|
"title" => "",
|
|
"comment" => "",
|
|
"rating" => [0, 0],
|
|
"page_uuid" => "",
|
|
"parent_uid" => "",
|
|
"author" => "",
|
|
"subscribe" => false,
|
|
"date" => "",
|
|
"dateModified" => "",
|
|
"dateAudit" => "",
|
|
"custom" => array()
|
|
);
|
|
} else {
|
|
$comments = new Comments($uuid);
|
|
if(Text::isEmpty($uid) || !$comments->exists($uid)){
|
|
// @todo Throw Error
|
|
}
|
|
$row = $comments->getCommentDB($uid);
|
|
}
|
|
|
|
// Set Class
|
|
foreach($row AS $field => $value){
|
|
if(strpos($field, "date") === 0){
|
|
$this->vars["{$field}Raw"] = $value;
|
|
} else {
|
|
$this->vars[$field] = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
| PUBLIC :: GET VALUE
|
|
| @since 0.1.0
|
|
|
|
|
| @param string The unique field key.
|
|
| @param multi The default value, which should return if the field key doesnt exist.
|
|
|
|
|
| @multi multi The respective field value on success, $default otherwise.
|
|
*/
|
|
public function getValue($field, $default = false){
|
|
if(isset($this->vars[$field])){
|
|
return $this->vars[$field];
|
|
}
|
|
return $default;
|
|
}
|
|
|
|
/*
|
|
| PUBLIC :: SET FIELD
|
|
| @since 0.1.0
|
|
|
|
|
| @param string The unique field key.
|
|
| @param multi The respective field value, which you want to set.
|
|
|
|
|
| @return bool TRUE
|
|
*/
|
|
public function setField($field, $value = NULL){
|
|
if(is_array($field)){
|
|
foreach($field AS $k => $v){
|
|
$this->setField($k, $v);
|
|
}
|
|
return true;
|
|
}
|
|
$this->vars[$field] = $value;
|
|
return true;
|
|
}
|
|
|
|
|
|
/*
|
|
| FIELD :: COMMENT RAW
|
|
| @since 0.1.0
|
|
|
|
|
| @return string The (sanitized) raw content on success, FALSE on failure.
|
|
*/
|
|
public function commentRaw(){
|
|
return $this->getValue("comment");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: COMMENT
|
|
| @since 0.1.0
|
|
|
|
|
| @return string The (sanitized) content on success, FALSE on failure.
|
|
*/
|
|
public function comment(){
|
|
$content = $this->getValue("comment");
|
|
if(sn_config("comment_markup_html")){
|
|
$content = Sanitize::htmlDecode($content);
|
|
}
|
|
if(sn_config("comment_markup_markdown")){
|
|
$parsedown = new Parsedown();
|
|
$content = $parsedown->text($content);
|
|
}
|
|
return $content;
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET UID
|
|
| @since 0.1.0
|
|
*/
|
|
public function uid(){
|
|
return $this->getValue("uid");
|
|
}
|
|
public function key(){
|
|
return $this->getValue("uid");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET (COMMENT FILE) PATH
|
|
| @since 0.1.0
|
|
*/
|
|
public function path(){
|
|
return PATH_PAGES . $this->getValue("page_key") . DS . "comments";
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET (COMMENT FILE) PATH / FILE
|
|
| @since 0.1.0
|
|
*/
|
|
public function file(){
|
|
return $this->path() . DS . "c_" . $this->getValue("uid") . ".php";
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET TYPE
|
|
| @since 0.1.0
|
|
*/
|
|
public function type(){
|
|
return $this->getValue("type");
|
|
}
|
|
public function isComment(){
|
|
return $this->getValue("type") === "comment";
|
|
}
|
|
public function isReply(){
|
|
return $this->getValue("type") === "reply";
|
|
}
|
|
public function isPingback(){
|
|
return $this->getValue("type") === "pingback";
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET DEPTH
|
|
| @since 0.1.0
|
|
*/
|
|
public function depth(){
|
|
return (int) $this->getValue("depth");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: TITLE
|
|
| @since 0.1.0
|
|
|
|
|
| @param bool TRUE to sanitize the content, FALSE to return it plain.
|
|
|
|
|
| @return string The respective comment title as STRING.
|
|
*/
|
|
public function title($sanitize = true){
|
|
if($sanitize){
|
|
return Sanitize::html($this->getValue("title"));
|
|
}
|
|
return $this->getValue("title");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET STATUS
|
|
| @since 0.1.0
|
|
*/
|
|
public function status(){
|
|
return $this->getValue("status");
|
|
}
|
|
public function isPending(){
|
|
return $this->getValue("status") === "pending";
|
|
}
|
|
public function isPublic(){
|
|
return $this->getValue("status") === "approved";
|
|
}
|
|
public function isApproved(){
|
|
return $this->getValue("status") === "approved";
|
|
}
|
|
public function isRejected(){
|
|
return $this->getValue("status") === "rejected";
|
|
}
|
|
public function isSpam(){
|
|
return $this->getValue("status") === "spam";
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET RATING
|
|
| @since 0.1.0
|
|
*/
|
|
public function rating(){
|
|
return $this->getValue("rating");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET LIKE
|
|
| @since 0.1.0
|
|
*/
|
|
public function like(){
|
|
$rating = $this->getValue("rating");
|
|
if(is_array($rating) && count($rating) >= 1){
|
|
return $rating[0];
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET DISLIKE
|
|
| @since 0.1.0
|
|
*/
|
|
public function dislike(){
|
|
$rating = $this->getValue("rating");
|
|
if(is_array($rating) && count($rating) >= 2){
|
|
return $rating[1];
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET PAGE KEY
|
|
| @since 0.1.0
|
|
*/
|
|
public function page_key(){
|
|
return $this->getValue("page_key");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET PAGE UUID
|
|
| @since 0.1.0
|
|
*/
|
|
public function page_uuid(){
|
|
return $this->getValue("page_uuid");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET PARENT UID
|
|
| @since 0.1.0
|
|
*/
|
|
public function parent_uid(){
|
|
return $this->getValue("parent_uid");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET PARENT
|
|
| @since 0.1.0
|
|
*/
|
|
public function parent(){
|
|
global $comments;
|
|
if($comments->exists($this->getValue("parent_uid"))){
|
|
return new Comment($this->getValue("parent_uid"));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET CHILDREN
|
|
| @since 0.1.0
|
|
|
|
|
| @param multi The single comment status which should return, multiple as ARRAY.
|
|
| Use `null` to return each children comment.
|
|
| @param string The return type, which allows the following strings:
|
|
| "uids" Return just the respective UID / keys
|
|
| "keys" Return just the respective UID / keys
|
|
| "objects" Return single Comment instances
|
|
| "arrays" Return the unformatted DB arrays
|
|
|
|
|
| @return multi FALSE on error, the respective array on succes.
|
|
*/
|
|
public function children($status = "approved", $return = "objects"){
|
|
global $comments;
|
|
|
|
// Check Parameter
|
|
if(is_string($status)){
|
|
$status = array($status);
|
|
}
|
|
if(!is_array($status) && $status !== null){
|
|
return false;
|
|
}
|
|
|
|
// Get Children
|
|
$return = array();
|
|
foreach($this->getDB(false) AS $uid => $value){
|
|
if($value["parent"] !== $this->getValue("uid")){
|
|
continue;
|
|
}
|
|
if(is_array($status) && !in_array($value["status"], $status)){
|
|
continue;
|
|
}
|
|
|
|
if($return === "uids" || $return == "keys"){
|
|
$return[] = $uid;
|
|
} else if($return === "objects"){
|
|
$return[$uid] = new Comment($uid);
|
|
} else {
|
|
$return[$uid] = $value;
|
|
}
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET UUID
|
|
| @since 0.1.0
|
|
*/
|
|
public function uuid(){
|
|
return $this->getValue("uuid");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET USERNAME
|
|
| @since 0.1.0
|
|
*/
|
|
public function username(){
|
|
global $L, $users, $SnickerUsers;
|
|
|
|
list($type, $id) = array_pad(explode("::", $this->getValue("author"), 2), 2, null);
|
|
switch($type){
|
|
case "bludit":
|
|
if(!$users->exists($id)){
|
|
break;
|
|
}
|
|
$user = new User($id);
|
|
return $user->nickname();
|
|
case "guest":
|
|
if(!$SnickerUsers->exists($id)){
|
|
break;
|
|
}
|
|
return $SnickerUsers->db[$id]["username"];
|
|
case "unknown":
|
|
return $L->g("Unknown User");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET EMAIL
|
|
| @since 0.1.0
|
|
*/
|
|
public function email(){
|
|
global $L, $users, $SnickerUsers;
|
|
|
|
list($type, $id) = array_pad(explode("::", $this->getValue("author"), 2), 2, null);
|
|
switch($type){
|
|
case "bludit":
|
|
if(!$users->exists($id)){
|
|
break;
|
|
}
|
|
$user = new User($id);
|
|
return $user->email();
|
|
case "guest":
|
|
if(!$SnickerUsers->exists($id)){
|
|
break;
|
|
}
|
|
return $SnickerUsers->db[$id]["email"];
|
|
case "unknown":
|
|
return "unknown@" . $_SERVER["SERVER_NAME"];
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
| FIELD :: SUBSCRIBE
|
|
| @since 0.1.0
|
|
*/
|
|
public function subscribe(){
|
|
return $this->getValue("subscribe");
|
|
}
|
|
public function hasSubscribed(){
|
|
return $this->getValue("subscribe") === true;
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET AVATAR
|
|
| @since 0.1.0
|
|
*/
|
|
public function avatar($size = "64"){
|
|
$user = $this->username();
|
|
$email = md5(strtolower(trim($this->email())));
|
|
$avatar = $this->avatar_url($size);
|
|
|
|
// Force Profile Picture
|
|
$force = false;
|
|
if(sn_config("frontend_avatar_users")){
|
|
$force = (strpos($avatar, DOMAIN_UPLOADS_PROFILES) !== false);
|
|
}
|
|
|
|
// Return IMG Tag
|
|
if(sn_config("frontend_avatar") === "identicon" && !$force){
|
|
return '<img src="'.$avatar.'" width="'.$size.'px" height="'.$size.'px" data-identicon="'.$email.'" alt="'.$user.'" />';
|
|
}
|
|
return '<img src="'.$avatar.'" width="'.$size.'px" height="'.$size.'px" alt="'.$user.'" />';
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET AVATAR URL
|
|
| @since 0.1.0
|
|
*/
|
|
public function avatar_url($size = "64"){
|
|
global $users;
|
|
|
|
// Return Profile Picture
|
|
if(sn_config("frontend_avatar_users") && strpos($this->getValue("author"), "bludit") === 0){
|
|
$username = substr($this->getValue("author"), strlen("bludit::"));
|
|
if($users->exists($username)){
|
|
$user = new User($username);
|
|
if(($avatar = $user->profilePicture()) !== false){
|
|
return $avatar;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return Gravatar
|
|
if(sn_config("frontend_avatar") === "gravatar"){
|
|
$hash = md5(strtolower(trim($this->email())));
|
|
return "https://www.gravatar.com/avatar/{$hash}?s={$size}&d=" . sn_config("frontend_gravatar");
|
|
}
|
|
|
|
// Return Identicon
|
|
if(sn_config("frontend_avatar") === "identicon"){
|
|
$hash = md5(strtolower(trim($this->email())));
|
|
$ident = new Identicon\Identicon();
|
|
return $ident->getImageDataUri($hash, $size);
|
|
}
|
|
|
|
// Return Mystery Man
|
|
return SNICKER_DOMAIN . "includes/img/default-avatar.jpg";
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET / FORMAT DATE
|
|
| @since 0.1.0
|
|
|
|
|
| @param string The respective format, which should be used for the output.
|
|
|
|
|
| @return string The formatted Date Output.
|
|
*/
|
|
public function date($format = false, $type = "date"){
|
|
global $site;
|
|
$date = $this->getValue("{$type}Raw");
|
|
return Date::format($date, DB_DATE_FORMAT, ($format? $format: $site->dateFormat()));
|
|
}
|
|
public function dateModified($format = false){
|
|
return $this->date($format, "dateModified");
|
|
}
|
|
public function dateAudit($format = false){
|
|
return $this->date($format, "dateAudit");
|
|
}
|
|
|
|
/*
|
|
| FIELD :: GET CUSTOM
|
|
| @since 0.1.0
|
|
|
|
|
| @param string The respective custom key, to get the value.
|
|
| Use `null` to get all custom values.
|
|
|
|
|
| @return multi The custom value, all customs as ARRAY or FALSE on failure.
|
|
*/
|
|
public function custom($key = NULL){
|
|
$custom = $this->getValue("custom");
|
|
if($key !== null){
|
|
if(array_key_exists($key, $custom)){
|
|
return $custom[$key];
|
|
}
|
|
return false;
|
|
}
|
|
return $custom;
|
|
}
|
|
}
|
|
|