*
* .
* .
* .
*
*/
class Thread {
public $tid;
public $name;
public $lastseen = array();
public $lastpost;
public $first_pid;
public $first_title;
public $first_user;
public $first_date;
public $last_pid;
public $last_title;
public $last_user;
public $last_date;
public $numposts;
public $numunread;
public function show()
{
global $fid, $current_user;
global $users;
$str = "";
$jumptonew = "";
$newcls = " thread_nonew";
if($this->lastseen[$current_user->uid] < $this->lastpost) {
$newcls = " thread_new";
$jumptonew = "#firstunread";
}
$str .= "
\n";
$str .= "
\n";
$str .= "
tid . $jumptonew."\">" . $this->name . "\n";
$str .= "
".$this->numposts." posts";
if($this->numunread != 0) {
$str .= " (".$this->numunread." unread)";
}
$str .= "\n";
$str .= "
Last post: ".
date("j. M Y - G:i", $this->lastpost)."\n";
$user = $users->getUser($this->first_user);
$str .= "
By ".$user->name;
$str .= " at ". date("j. M Y - G:i", $this->first_date)."\n";
$str .= "
\n";
return $str;
}
public function processPost($pid, $title, $user, $date)
{
global $current_user;
$this->numposts++;
if($this->lastseen[$current_user->uid] < $date) {
$this->numunread++;
}
if($date < $this->first_date || $this->first_date == -1) {
$this->first_pid = $pid;
$this->first_title = $title;
$this->first_user = $user;
$this->first_date = $date;
}
if($date > $this->last_date || $this->last_date == -1) {
$this->last_pid = $pid;
$this->last_title = $title;
$this->last_user = $user;
$this->last_date = $date;
}
}
private function loadLastSeen($lastseen)
{
if($lastseen == "") return;
$list = explode(",", $lastseen);
foreach($list as $l) {
$pair = explode("=", $l);
if($pair[0] != "" && $pair[1] != "") {
$this->lastseen[$pair[0]] = $pair[1];
}
}
}
public function Thread($tid, $name, $lastpost, $lastseen)
{
$this->numunread = 0;
$this->numposts = 0;
$this->first_date = -1;
$this->last_date = -1;
$this->tid = $tid;
$this->name = $name;
$this->lastpost = $lastpost;
if($this->lastpost == "") $this->lastpost = 0;
$this->loadLastSeen($lastseen);
}
}
class Threads {
private $dir;
public $threads = array();
public function add($thread) {
// $key = $thread->name;
// $key = sprintf("%d-%d", $thread->lastpost, $thread->tid);
// $key = sprintf("%d", $thread->lastpost);
$key = $thread->lastpost . "-" . $thread->tid;//name;
// echo "[" . $key . "]";
$this->threads[$key] = $thread;
}
public function write()
{
/*
$fp = fopen($this->file, "w");
$block = TRUE;
flock($fp, LOCK_EX, $block); // do an exclusive lock
fwrite($fp, "\n");
fwrite($fp, "\n");
foreach($this->members as $member) {
fwrite($fp, " id, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " name=\"" .
htmlspecialchars($member->name, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " description=\"" .
htmlspecialchars($member->description, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " image=\"" .
htmlspecialchars($member->image, ENT_QUOTES, "UTF-8") . "\">\n");
fwrite($fp, " \n");
}
fwrite($fp, "\n");
fclose($fp);
*/
}
/*
public function deleteForumUser($id)
{
if($this->members[$id]) {
unset($this->members[$id]);
// $this->write();
} else {
echo "ERROR: User! ".$id." does not exist!
\n";
return false;
}
return true;
}
*/
public function getThread($tid)
{
$thread = $this->threads[$tid];
return $thread;
}
public function getLatestThread()
{
$tid = -1;
$last = -1;
foreach($this->threads as $thread) {
if($thread->lastpost > $last) {
$last = $thread->lastpost;
$tid = $thread->tid;
}
}
if($tid != -1) return $this->getThread($tid);
return NULL;
}
public function show()
{
$str = "";
foreach($this->threads as $thread) {
$str .= $thread->show();
}
return $str;
}
public function newStuff()
{
global $current_user;
foreach($this->threads as $thread) {
if($thread->lastseen[$current_user->uid] < $thread->lastpost) return true;
}
return false;
}
private function recurser($parentpost, $element, $thread)
{
if($element->tagName != "post") return;
$thread->processPost($element->getAttribute('pid'),
$element->getAttribute('title'),
$element->getAttribute('user'),
$element->getAttribute('date'));
foreach($element->childNodes as $child) {
if($child->tagName == "post")
$this->recurser($post, $child, $thread);
}
}
private function read()
{
$dh = opendir($this->dir);
while($file = readdir($dh)) {
if($file == "." || $file == "..") continue;
$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->load($this->dir . "/" . $file);
$threads = $dom->getElementsByTagName('thread');
foreach($threads as $f) {
$thread = new Thread($f->getAttribute('tid'),
$f->getAttribute('name'),
$f->getAttribute('lastpost'),
$f->getAttribute('lastseen'));
foreach($f->childNodes as $child) {
$this->recurser(false, $child, $thread);
}
$this->add($thread);
}
}
}
public function Threads($dir)
{
$this->dir = $dir;
$this->read();
krsort($this->threads);
}
}
?>