summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMalf Furious <m@lfurio.us>2017-06-04 00:51:21 -0400
committerMalf Furious <m@lfurio.us>2017-06-04 00:51:21 -0400
commit767f0b5559472828c09be7de50c80f017cc0540a (patch)
treeef930862023b63939bb98e01d7ab8b4c91371d62
parent6b69e5a8f85ebdf92b84e3330bea306d4a90a115 (diff)
downloadscrott-767f0b5559472828c09be7de50c80f017cc0540a.tar.gz
scrott-767f0b5559472828c09be7de50c80f017cc0540a.zip
mesg: Add mesg class
-rw-r--r--app/class/mesg.class.php249
1 files changed, 249 insertions, 0 deletions
diff --git a/app/class/mesg.class.php b/app/class/mesg.class.php
new file mode 100644
index 0000000..f9766ca
--- /dev/null
+++ b/app/class/mesg.class.php
@@ -0,0 +1,249 @@
+<?php
+
+/*
+ * SCROTT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * For more information, please refer to UNLICENSE
+ */
+
+require_once "class/object.class.php";
+require_once "class/user.class.php";
+require_once "class/pad.class.php";
+
+/*
+ * This class models issue activity, private messaging, pad discussions,
+ * and system and object log messages.
+ */
+class mesg extends object
+{
+ /*
+ * Constructor
+ */
+ public function __construct(?string $guid = NULL)
+ {
+ $this->fields['mesgs'] = array(
+ "guid",
+ "author",
+ "mesg",
+ "attachment",
+ );
+
+ parent::__construct($guid);
+
+ try
+ {
+ $this->expectType("log");
+ }
+ catch (Exception $e)
+ {
+ $this->expectType("mesg");
+ }
+ }
+
+ /*
+ * Initialize a new regular message.
+ */
+ public static function initNew(string $message, user $author, object $parent) : mesg
+ {
+ $mesg = new mesg();
+ $mesg->setOwner($author);
+ $mesg->setParent($parent);
+ $mesg->name = "message " . $mesg->guid;
+ $mesg->objtype = "mesg";
+ $mesg->setAuthor($author);
+ $mesg->mesg = $message;
+ $mesg->saveObj();
+ return $mesg;
+ }
+
+ /*
+ * Initialize a new pad discussion thread.
+ */
+ public static function initNewDiscussion(string $name, string $message, user $author,
+ pad $parent) : mesg
+ {
+ $mesg = new mesg();
+ $mesg->setOwner($author);
+ $mesg->setParent($parent);
+ $mesg->name = $name;
+ $mesg->objtype = "mesg";
+ $mesg->setAuthor($author);
+ $mesg->mesg = $message;
+ $mesg->saveObj();
+ return $mesg;
+ }
+
+ /*
+ * Initialize a new private message (user-to-user).
+ */
+ public static function initNewPM(string $name, string $message, user $author,
+ user $rcpt) : mesg
+ {
+ $mesg = new mesg();
+ $mesg->setOwner($rcpt);
+ $mesg->setParent($rcpt);
+ $mesg->name = $name;
+ $mesg->objtype = "mesg";
+ $mesg->setAuthor($author);
+ $mesg->mesg = $message;
+ $mesg->saveObj();
+ return $mesg;
+ }
+
+ /*
+ * Initialize a new log message.
+ */
+ public static function initNewLog(string $message, user $author, object $parent) : mesg
+ {
+ $owner = $parent->getOwner();
+
+ if (!$owner)
+ $owner = $parent;
+
+ $mesg = new mesg();
+ $mesg->setOwner($owner);
+ $mesg->setParent($parent);
+ $mesg->name = "log " . $mesg->guid;
+ $mesg->objtype = "log";
+ $mesg->setAuthor($author);
+ $mesg->mesg = $message;
+ $mesg->saveObj();
+ return $mesg;
+ }
+
+ /*
+ * Initialize a new admin log message.
+ */
+ public static function initNewAdminLog(string $message, user $author) : mesg
+ {
+ $mesg = new mesg();
+ $mesg->saveObj(); // need to get a guid
+ $mesg->name = "admin log " . $mesg->guid;
+ $mesg->objtype = "log";
+ $mesg->setAuthor($author);
+ $mesg->mesg = $message;
+ $mesg->saveObj();
+ return $mesg;
+ }
+
+ /*
+ * Get an array of messages in the admin log, between two timestamps.
+ * With no arguments, the entire log is returned. Results are sorted
+ * in reverse chronological order.
+ */
+ public static function getAdminLog_ordByDatetime(?string $after = NULL,
+ ?string $before = NULL) : array
+ {
+ $query = "SELECT guid FROM objects WHERE objtype = 'log' AND " .
+ "parent = '' ";
+
+ if ($after)
+ $query += "AND created >= '" . database::esc($after) . "' ";
+
+ if ($before)
+ $query += "AND created < '" . database::esc($before) . "' ";
+
+ $query += "ORDER BY created DESC";
+ $res = database::query($query);
+
+ $log = array();
+
+ foreach ($res as $l)
+ $log[] = new mesg($l['guid']);
+
+ return $log;
+ }
+
+ /*
+ * Get the author of this message. This user either actually wrote
+ * this message, or caused it to be generated.
+ */
+ public function getAuthor() : user
+ {
+ if (!isset($this->author) || $this->author == "")
+ return NULL;
+
+ return new user($this->author);
+ }
+
+ /*
+ * Set the author of this message. This should usually only be done
+ * while constructing a new message or to clear out references to
+ * a user that got removed.
+ */
+ public function setAuthor(user $author) : void
+ {
+ $this->author = $author->guid;
+ $this->saveObj();
+ }
+
+ /*
+ * Check whether this message has been seen by the given user
+ */
+ public function seenBy(user $viewer) : bool
+ {
+ $query = "SELECT * FROM views WHERE guid = '" . database::esc($this->guid) . "' " .
+ "AND viewer = '" . database::esc($viewer->guid) . "'";
+ $res = database::query($query);
+
+ return count($res) > 0;
+ }
+
+ /*
+ * Mark this message as seen by the given user
+ */
+ public function markSeen(user $viewer) : void
+ {
+ if (!$this->seenBy($viewer))
+ {
+ $query = "INSERT INTO views (guid, viewer) VALUES ('" .
+ database::esc($this->guid) . "', '" . database::esc($viewer->guid) . "')";
+ database::query($query);
+ }
+ }
+
+ /*
+ * Format message (if auto generated), and insert HTML linebreaks (<br />)
+ * at message newlines.
+ */
+ public function renderMesg() : string
+ {
+ if ($this->objtype == "log")
+ $mesg = sprintf($this->mesg, $this->getAuthor()->getDisplayName());
+ else
+ $mesg = $this->mesg;
+
+ return nl2br($mesg);
+ }
+
+ /*
+ * Get the URL to this message's attachment. If no file is attached,
+ * NULL is returned.
+ */
+ public function getAttachment() : ?string
+ {
+ if (!is_file("dynmic/attach/" . $this->guid))
+ return NULL;
+
+ return ar() . "/df.php?d=attach&f=" . $this->guid;
+ }
+
+ /*
+ * Set the attached file for this message. Should typically be done
+ * during new message creation and not changed afterward. Returns
+ * false if there is a problem saving the attachment.
+ */
+ public function setAttachment(array $file) : bool
+ {
+ $path = "dynmic/attach/" . $this->guid;
+ return saveFile($file, $path, self::ATTACH_MAXSIZE);
+ }
+}
+
+?>