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.
 
 
 

476 lines
16 KiB

<?php
/*
| Snicker The first native FlatFile Comment Plugin 4 Bludit
| @file ./system/class.comments-index.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 CommentsIndex extends dbJSON{
/*
| DATABASE FIELDS
*/
protected $dbFields = array(
"title" => "", // Comment Title
"excerpt" => "", // Comment Excerpt (142)
"status" => "", // Comment Status
"page_uuid" => "", // Comment Page UUID
"parent_uid" => "", // Comment Parent UID
"author" => "", // Comment Author (bludt::username or guest::uuid)
"date" => "" // Comment Date
);
/*
| CONSTRUCTOR
| @since 0.1.0
*/
public function __construct(){
parent::__construct(DB_SNICKER_INDEX);
if(!file_exists(DB_SNICKER_INDEX)){
$this->db = array();
$this->save();
}
}
/*
| OVERWRITE :: EXISTS
| @since 0.1.0
*/
public function exists($uid){
return array_key_exists($uid, $this->db);
}
/*
| HELPER :: LIMIT LIST
| @since 0.1.0
*/
private function limitList($list, $page, $limit){
if($limit == -1){
return $list;
}
$offset = $limit * (max($page, 1) - 1);
$count = min(($offset + $limit - 1), count($list));
if($offset < 0 || $offset > $count){
return false;
}
return array_slice($list, $offset, $limit, true);
}
/*
| DATA :: GET PENDING INDEX
| @since 0.1.0
|
| @param bool TRUE to just return the keys, FALSE to return the complete array.
|
| @return array All pending comments with basic comment data as ARRAY.
*/
public function getPending($keys = false){
$db = array();
foreach($this->db AS $key => $value){
if(!isset($value["status"]) || empty($value["status"])){
continue;
}
if($value["status"] === "pending"){
$db[$key] = $value;
}
}
if($keys){
return array_keys($db);
}
return $db;
}
/*
| DATA :: GET APPROVED INDEX
| @since 0.1.0
|
| @param bool TRUE to just return the keys, FALSE to return the complete array.
|
| @return array All approved comments with basic comment data as ARRAY.
*/
public function getApproved($keys = false){
$db = array();
foreach($this->db AS $key => $value){
if(!isset($value["status"]) || empty($value["status"])){
continue;
}
if($value["status"] === "approved"){
$db[$key] = $value;
}
}
if($keys){
return array_keys($db);
}
return $db;
}
/*
| DATA :: GET REJECTED INDEX
| @since 0.1.0
|
| @param bool TRUE to just return the keys, FALSE to return the complete array.
|
| @return array All rejected comments with basic comment data as ARRAY.
*/
public function getRejected($keys = false){
$db = array();
foreach($this->db AS $key => $value){
if(!isset($value["status"]) || empty($value["status"])){
continue;
}
if($value["status"] === "rejected"){
$db[$key] = $value;
}
}
if($keys){
return array_keys($db);
}
return $db;
}
/*
| DATA :: GET SPAM INDEX
| @since 0.1.0
|
| @param bool TRUE to just return the keys, FALSE to return the complete array.
|
| @return array All spam comments with basic comment data as ARRAY.
*/
public function getSpam($keys = false){
$db = array();
foreach($this->db AS $key => $value){
if(!isset($value["status"]) || empty($value["status"])){
continue;
}
if($value["status"] === "spam"){
$db[$key] = $value;
}
}
if($keys){
return array_keys($db);
}
return $db;
}
/*
| DATA :: COUNT COMMENTS
| @since 0.1.0
|
| @param multi A single comment status as STRING, multiple as ARRAY.
| Use `null` to count all comments.
|
| @return int The number of comments of the respective index.
*/
public function count($status = array("approved")){
if($status === null){
return count($this->db);
}
if(!is_array($status)){
$status = array($status);
}
$count = 0;
foreach($this->db AS $key => $value){
if(!isset($value["status"]) || empty($value["status"])){
continue;
}
if(in_array($value["status"], $status)){
$count++;
}
}
return $count;
}
/*
| DATA :: GET COMMENT
| @since 0.1.0
|
| @param string The desired comment UID.
|
| @return multi The comment index array on success, FALSE on failure
*/
public function getComment($uid){
return array_key_exists($uid, $this->db)? $this->db[$uid]: false;
}
/*
| DATA :: LIST COMMENTS
| @since 0.1.0
|
| @param multi A single comment status as STRING, multiple as ARRAY.
| @param int The current comment page number, starting with 1.
| @param int The number of comments to be shown per page.
|
| @return array The respective unique comment IDs as ARRAY, FALSE on failure.
*/
public function getList($status = array("approved"), $page = 1, $limit = -1){
if($status === null){
return count($this->db);
}
if(!is_array($status)){
$status = array($status);
}
// Get List
$list = array();
foreach($this->db AS $key => $value){
if(!isset($value["status"]) || empty($value["status"])){
continue;
}
if(in_array($value["status"], $status)){
$list[] = $key;
}
}
return $this->limitList($list, $page, $limit);
}
/*
| DATA :: LIST COMMENTS BY UUID
| @since 0.1.0
|
| @param multi A single page UUID as STRING, multiple as ARRAY.
| @param int The current comment page number, starting with 1.
| @param int The number of comments to be shown per page.
|
| @return array The respective unique comment IDs as ARRAY, FALSE on failure.
*/
public function getListByUUID($uuid, $page = 1, $limit = -1){
if(!is_array($uuid)){
$uuid = array($uuid);
}
// Get List
$list = array();
foreach($this->db AS $key => $value){
if(!isset($value["page_uuid"]) || empty($value["page_uuid"])){
continue;
}
if(in_array($value["page_uuid"], $uuid)){
$list[] = $key;
}
}
return $this->limitList($list, $page, $limit);
}
/*
| DATA :: LIST COMMENTS BY PARENT
| @since 0.1.0
|
| @param multi A single comment UID as STRING.
| @param int The current comment page number, starting with 1.
| @param int The number of comments to be shown per page.
|
| @return array The respective unique comment IDs as ARRAY, FALSE on failure.
*/
public function getListByParent($uid, $page = 1, $limit = -1){
if(!is_string($uid) || !$this->exists($uid)){
return array();
}
// Get List
$list = array($uid);
foreach($this->db AS $key => $value){
if(!isset($value["parent_uid"]) || empty($value["parent_uid"])){
continue;
}
if($value["parent_uid"] === $uid){
$list[] = $key;
}
}
return $this->limitList($list, $page, $limit);
}
/*
| DATA :: LIST COMMENTS BY USER
| @since 0.1.0
|
| @param string A single username, unique user id or eMail address.
| @param int The current comment page number, starting with 1.
| @param int The number of comments to be shown per page.
|
| @return array The respective unique comment IDs as ARRAY, FALSE on failure.
*/
public function getListByUser($string, $page = 1, $limit = -1){
global $users, $SnickerUsers;
// Get Member / Guest
$guest = false;
$member = false;
if(Valid::email($string)){
if(($user = $users->getByEmail($string)) !== false){
$member = "bludit::{$user}";
}
} else {
if($users->exists($string)){
$member = "bludit::{$string}";
}
}
if(($user = $SnickerUsers->get($string)) !== false){
$guest = "guest::{$user["uuid"]}";
}
if(!$member && !$guest){
return array();
}
// Get List
$list = array();
foreach($this->db AS $key => $value){
if(!isset($value["author"]) || empty($value["author"])){
continue;
}
if($value["author"] == $member || $value["author"] == $guest){
$list[] = $key;
}
}
return $this->limitList($list, $page, $limit);
}
/*
| DATA :: SEARCH COMMENTS BY TITLE & EXCERPT
| @since 0.1.0
|
| @param string The string to be searched.
| @param int The current comment page number, starting with 1.
| @param int The number of comments to be shown per page.
|
| @return array The respective unique comment IDs as ARRAY, FALSE on failure.
*/
public function searchComments($search, $page = 1, $limit = -1){
$list = array();
foreach($this->db AS $key => $value){
if(isset($value["title"]) && stripos($value["title"], $search) !== false){
$list[] = $key;
} else if(isset($value["excerpt"]) && stripos($value["excerpt"], $search) !== false){
$list[] = $key;
}
}
return $this->limitList($list, $page, $limit);
}
/*
| HANDLE :: ADD COMMENT
| @since 0.1.0
|
| @param string The unique comment ID.
| @param array The comment array.
|
| @return bool TRUE if everything is fluffy, FALSE if not.
*/
public function add($uid, $comment){
$row = array();
foreach($this->dbFields AS $field => $value){
if(isset($comment[$field])){
$final = is_string($comment[$field])? Sanitize::html($comment[$field]): $comment[$field];
} else {
$final = $value;
}
settype($final, gettype($value));
$row[$field] = $final;
}
// Format Excerpt
$row["excerpt"] = strip_tags($comment["comment"]);
if(strlen($row["excerpt"]) > 142){
$row["excerpt"] = substr($row["excerpt"], 0, 139) . "...";
}
// Insert and Return
$this->db[$uid] = $row;
$this->sortBy();
if($this->save() !== true){
Log::set(__METHOD__, "error-update-db");
return false;
}
return true;
}
/*
| HANDLE :: UPDATE COMMENT
| @since 0.1.0
|
| @param string The unique comment ID.
| @param array The comment array.
|
| @return bool TRUE if everything is fluffy, FALSE if not.
*/
public function edit($uid, $comment){
if(!$this->exists($uid)){
$this->log(__METHOD__, "error-comment-uid", array($uid));
return false;
}
$data = $this->db[$uid];
// Loop Fields
$row = array();
foreach($this->dbFields AS $field => $value){
if(isset($comment[$field])){
$final = is_string($comment[$field])? Sanitize::html($comment[$field]): $comments[$field];
} else {
$final = $data[$field];
}
settype($final, gettype($value));
$row[$field] = $final;
}
// Format Excerpt
$row["excerpt"] = strip_tags($comment["comment"]);
if(strlen($row["excerpt"]) > 142){
$row["excerpt"] = substr($row["excerpt"], 0, 139) . "...";
}
// Update and Return
$this->db[$uid] = $row;
if($this->save() !== true){
Log::set(__METHOD__, "error-update-db");
return false;
}
return true;
}
/*
| HANDLE :: DELETE COMMENT
| @since 0.1.0
|
| @param string The unique comment ID.
|
| @return bool TRUE if everything is fluffy, FALSE if not.
*/
public function delete($uid){
if(!$this->exists($uid)){
return false;
}
unset($this->db[$uid]);
if($this->save() !== true){
Log::set(__METHOD__, "error-update-db");
return false;
}
return true;
}
/*
| INTERNAL :: SORT COMMENTS
| @since 0.1.0
|
| @return bool TRUE
*/
public function sortBy(){
global $SnickerPlugin;
if($SnickerPlugin->getValue("frontend_order") === "date_asc"){
uasort($this->db, function($a, $b){
return $a["date"] > $b["date"];
});
} else if($SnickerPlugin->getValue("frontend_order") === "date_desc"){
uasort($this->db, function($a, $b){
return $a["date"] < $b["date"];
});
}
return true;
}
}