diff options
Diffstat (limited to 'forum/utils/posts.php')
| -rw-r--r-- | forum/utils/posts.php | 254 | 
1 files changed, 254 insertions, 0 deletions
diff --git a/forum/utils/posts.php b/forum/utils/posts.php new file mode 100644 index 0000000..c301852 --- /dev/null +++ b/forum/utils/posts.php @@ -0,0 +1,254 @@ +<?php + +include_once($UTIL_DIR . "/convert.php"); +include_once($UTIL_DIR . "/threads.php"); +include_once($UTIL_DIR . "/parser.php"); + +class Post { +	public $pid; +	public $user; +	public $title; +	public $date; +	public $message; +	public $replies = array(); + +	public function write($fp, $indent) +	{ +		fwrite($fp, $indent . "<post pid=\"" . $this->pid . "\"\n"); +		fwrite($fp, $indent . "      user=\"" . $this->user . "\"\n"); +		fwrite($fp, $indent . "      title=\"" . convert_xml($this->title) . "\"\n"); +		fwrite($fp, $indent . "      date=\"" . $this->date . "\">\n"); +		fwrite($fp, $indent . "  <message>" . convert_xml($this->message) . "</message>\n"); + +		foreach($this->replies as $reply) { +			$reply->write($fp, $indent . "  "); +		} +		 +		fwrite($fp, $indent . "</post>\n"); +	} + +	public function add($post) { +		$key = $post->pid; +		$this->replies[$key] = $post; +	} + +	public function getPost($pid) +	{ +		$result = false; + +		foreach($this->replies as $post) { +			if($post->pid == $pid) return $post; +			$result = $post->getPost($pid); +			if($result) return $result; +		} + +		return $result; +	} + +	public function show($indent = "", $recurse = true) +	{ +		global $users, $fid, $tid, $current_user, $client_is_mobile_device; +		$user = $users->getUser($this->user); + +		echo $indent . "<div class=\"post\">\n"; +		if($client_is_mobile_device) { +			$avatar = "mobileavatar.gif"; +		} else { +			if($user->avatar) $avatar = $user->avatar; +			else $avatar = "default.gif"; +		} +		echo $indent . "  <img class=\"avatar\" alt=\"avatar\" src=\"gfx/avatars/" . $avatar . "\"/>\n"; +		if(!$client_is_mobile_device) { +			echo $indent . "  <div class=\"id\">ID: " . $this->pid . "</div>\n"; +			echo $indent . "  <div class=\"title\">Title: " . convert_xml($this->title) . "</div>\n"; +		} +		echo $indent . "  <div class=\"user\">"; +		if(!$client_is_mobile_device) echo "UserID: "; +		echo $user->name . "</div>\n"; +		echo $indent . "  <div class=\"date\">"; +		if(!$client_is_mobile_device) echo "Date: "; +		echo date("j. M Y - G:i", $this->date) . "</div>\n"; +		echo $indent . "  <div class=\"message\">\n"; +		echo parse($this->message, $indent . "    ") . "\n"; +		echo $indent . "  </div>\n"; +		echo $indent . "  <div class=\"buttons\">\n"; + +		if($current_user->uid == $this->user) { +			echo $indent . +				"    <a href=\"?mode=editor&task=edit&fid=".$fid. +				"&tid=".$tid. +				"&pid=".$this->pid."\">"; +			echo "<img alt=\"edit\" src=\"gfx/btn_edit.gif\"/></a>\n"; +		} + +		echo $indent . +			"    <a href=\"?mode=editor&task=quote&fid=".$fid. +			"&tid=".$tid. +			"&pid=".$this->pid."\">"; +		echo "<img alt=\"quote\" src=\"gfx/btn_quote.gif\"/></a>\n"; + +		echo $indent . +			"    <a href=\"?mode=editor&task=reply&fid=".$fid. +			"&tid=".$tid. +			"&pid=".$this->pid."\">"; +		echo "<img alt=\"reply\" src=\"gfx/btn_reply.gif\"/></a>\n"; + +		echo $indent . "  </div>\n"; +		echo $indent . "  <div class=\"replies\">\n"; + +		if($recurse) { +			foreach($this->replies as $reply) { +				$reply->show($indent . "    "); +			} +		} + +		echo $indent . "  </div>\n"; +		echo $indent . "</div>\n"; +	} + +	public function Post($pid, $title, $user, $date, $message = "") +	{ +		$this->pid = $pid; +		$this->title = $title; +		$this->user = $user; +		$this->date = $date; +		$this->message = $message; +	} +} + +class Posts { +	private $file; +	private $posts = array(); +	public $thread; +	private $posts_linear = array(); +	private $maxkey = 0; +	 +	public function nextkey() { +		$this->maxkey++; +		return $this->maxkey; +	} + +	public function add($post) { +		$key = $post->pid; +		$this->posts[$key] = $post; +	} +	 +	public function write() +	{ +		$fp = fopen($this->file, "w"); + +		$block = TRUE; +		flock($fp, LOCK_EX, $block); // do an exclusive lock + +		fwrite($fp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + +		if($this->thread->lastseen) { +			foreach($this->thread->lastseen as $key => $value) { +				if($lastseenstr != "") $lastseenstr .= ","; +				$lastseenstr .= $key . "=" . $value; +			} +		} + +		fwrite($fp, "<thread tid=\"" . $this->thread->tid . "\"\n"); +		fwrite($fp, "        name=\"" . convert_xml($this->thread->name) . "\"\n"); +		fwrite($fp, "        lastpost=\"" . $this->thread->lastpost . "\"\n"); +		fwrite($fp, "        lastseen=\"" . $lastseenstr . "\">\n"); + +		foreach($this->posts as $post) { +			$post->write($fp, "  "); +		} + +		fwrite($fp, "</thread>\n"); + +		fclose($fp); +	} + +	public function getPost($pid) +	{ +		$result = false; + +		foreach($this->posts as $post) { +			if($post->pid == $pid) return $post; +			$result = $post->getPost($pid); +			if($result) return $result; +		} + +		return $result; +	} + +	public function show() +	{ +		global $current_user; +		echo "<h1 id=\"top\">" . $this->thread->name . "</h1>"; +		 +		/* // Recursive +		foreach($this->posts as $post) { +			$post->show(); +		} +		*/ +		 +		// Linear +		foreach($this->posts_linear as $post) { +			$post->show("", false); +		} +		 +		$this->thread->lastseen[$current_user->uid] = time(); + +		$this->write(); + +		echo "<p><a href=\"#top\">Back to the top</a></p>"; +	} + +	private function recurser($parentpost, $element) +	{ +		if($element->tagName != "post") return; + +		$post = new Post($element->getAttribute('pid'), +										 $element->getAttribute('title'), +										 $element->getAttribute('user'), +										 $element->getAttribute('date')); + +		$this->posts_linear[$post->date . "-" . $post->pid] = $post; + +		if($post->pid > $this->maxkey) $this->maxkey = $post->pid; +		 +		if($parentpost) $parentpost->add($post); +		else $this->add($post); + +		foreach($element->childNodes as $child) { +			if($child->tagName == "post") +				$this->recurser($post, $child); +			if($child->tagName == "message") +				$post->message = $child->textContent; +		} +	} + +	private function read() +	{ +		$dom = new DomDocument; +		$dom->resolveExternals = FALSE; +		$dom->substituteEntities = FALSE; +		$dom->preserveWhiteSpace = FALSE; +		$dom->load($this->file); +		 +		$thread = $dom->documentElement; +		$this->thread = new Thread($thread->getAttribute('tid'), +															 $thread->getAttribute('name'), +															 $thread->getAttribute('lastpost'), +															 $thread->getAttribute('lastseen')); +		foreach($thread->childNodes as $child) { +			$this->recurser(false, $child); +		} + +		// The linear list should be sorted. +		sort($this->posts_linear); +	} + +	public function Posts($file) +	{ +		$this->file = $file; +		if(file_exists($this->file))	$this->read(); +	} + +} +?>  | 
