function _response($channel) { $user = Auth::user(); $issearch = false; if (preg_match('%search:(?P<criteria>.+)%i', $channel, $searchmatches)) { $issearch = true; } preg_match('%(?P<roomtype>\\w+):(?P<criteria>.+)%i', $channel, $searchmatches); $searchmatches['roomtype'] = isset($searchmatches['roomtype']) ? $searchmatches['roomtype'] : ''; $searchmatches['criteria'] = isset($searchmatches['criteria']) ? $searchmatches['criteria'] : ''; if (DB::get()->val("SELECT count(*) FROM channels WHERE user_id = :user_id", array('user_id' => Auth::user_id())) == 0) { $join = 'bar'; //$user->username; $allowedchannels = DB::get()->col("SELECT room FROM options WHERE grouping = 'Permissions' AND name = 'allowedchannel' AND user_id = :user_id", array('user_id' => $user->id)); if ($allowedchannels) { $join = reset($allowedchannels); } DB::get()->query("INSERT INTO channels (name, user_id, active) VALUES (:join, :user_id, 1);", array('join' => $join, 'user_id' => Auth::user_id())); if (!($herald = DB::get()->val("SELECT value FROM options WHERE user_id = :user_id AND name = :name AND grouping = :grouping", array('user_id' => Auth::user_id(), 'name' => 'Herald', 'grouping' => 'Identity')))) { $herald = '{$nickname} has joined {$room}'; } $js = ''; $cssclass = ''; $packed = Plugin::call('herald', array('herald' => $herald, 'js' => $js, 'cssclass' => $cssclass)); extract($packed); $herald = str_replace('{$nickname}', $user->nickname, $herald); $herald = str_replace('{$room}', $this->_room_alias($join), $herald); $msg = htmlspecialchars($herald); Status::create()->data($msg)->type('join')->channel($join)->cssclass($cssclass)->js($js)->insert(); } DB::get()->query('UPDATE channels SET active = 0 WHERE user_id = :user_id', array('user_id' => Auth::user_id())); DB::get()->query('UPDATE channels SET active = 1, last = NOW() WHERE name = :channel AND user_id = :user_id', array('channel' => $channel, 'user_id' => Auth::user_id())); $laststatus = Immediate::get_status(); $obj = new StdClass(); $obj->comet_change = false; $obj->status = $laststatus; $obj->reported_status = 0; $obj->chanbar = $this->chanbar(); $obj->channels = DB::get()->col("SELECT name FROM channels WHERE user_id = :user_id ORDER BY name ASC", array('user_id' => Auth::user_id())); $obj->channel = DB::get()->val("SELECT name FROM channels WHERE user_id = :user_id and active = 1", array('user_id' => Auth::user_id())); $obj->jsdate = filemtime(dirname(__FILE__) . '/../../js/sp.js'); switch (strtolower($searchmatches['roomtype'])) { case 'search': $crit = DB::get()->val("SELECT value FROM options WHERE user_id = :user_id AND grouping = 'searches' AND name = :name", array('user_id' => $user->id, 'name' => $searchmatches['criteria'])); $obj->crit = $crit; $sql = ''; $params = array('user_id' => Auth::user_id(), 'crit' => $crit, 'searchchannel' => $obj->channel); $criteria = $this->_get_search_sql($sql, $params, $crit); $obj->updates = DB::get()->results($sql, $params, 'StdClass'); $insert = new stdClass(); $insert->status = 0; $insert->type = 'system'; $insert->channel = ''; $insert->data = 'Search Criteria: ' . $criteria; $insert->msgtime = 0; $insert->user_id = 0; $insert->cssclass = 'searchheader'; $insert->js = ''; $insert->user_to = ''; $insert->received = ''; $obj->updates[] = $insert; break; case 'office': $officeuser = $this->_userstr($searchmatches['criteria']); $qp = array('channel' => $obj->channel, 'user_id' => Auth::user_id()); if ($officeuser->id == $user->id) { $append = "((type = 'direct' AND user_to = :user_id AND presence.user_id <> :user_id) OR (user_to = :user_id) OR (user_to = 0)) AND (type <> 'notice')"; } else { $append = "((type = 'direct' AND user_to = :user_id and presence.user_id = :office_user) OR (user_to = 0)) AND (type <> 'notice')"; $qp['office_user'] = $officeuser->id; } $obj->updates = DB::get()->results("\nSELECT\n\tpresence.*,\n\tusers.username,\n\toptions.value as nickname,\n\tchannels.active as active\nFROM\n\tpresence\nLEFT JOIN\n\tusers\n\tON presence.user_id = users.id\nLEFT JOIN\n\toptions\n\tON options.user_id = users.id AND options.name = 'Nickname' AND options.grouping = 'Identity'\nLEFT JOIN\n\tchannels\n\tON channels.user_id = :user_id \n\tAND channels.name = presence.channel\nWHERE\n\t(channel = :channel OR channel = '')\n\tAND\n\t(\n\t\t{$append}\n\t)\nORDER BY\n\tstatus DESC\nLIMIT 100\n\t\t\t", $qp, 'StdClass'); break; default: $updates = Plugin::call('response', false, $searchmatches['roomtype'], $searchmatches['criteria']); if ($updates) { $obj->updates = $updates; } else { $obj->updates = DB::get()->results("\nSELECT\n\tpresence.*,\n\tusers.username,\n\toptions.value as nickname\nFROM\n\tpresence\nLEFT JOIN\n\tusers\n\tON presence.user_id = users.id\nLEFT JOIN\n\toptions\n\tON options.user_id = users.id AND options.name = 'Nickname' AND options.grouping = 'Identity'\nWHERE\n\t(channel = :channel OR channel = '')\n\tAND\n\t(\n\t\t(user_to = 0)\n\t\tOR\n\t\t(user_to = :user_id and isnull(received))\n\t)\nORDER BY\n\tstatus DESC\nLIMIT 100\n\t\t\t\t\t", array('channel' => $obj->channel, 'user_id' => Auth::user_id()), 'StdClass'); } break; } DB::get()->query('UPDATE presence SET received = msgtime, msgtime = NOW() WHERE isnull(received) AND user_to = :user_id', array('user_id' => Auth::user_id())); foreach ($obj->updates as $k => $v) { $obj->updates[$k]->msgtime = date('Y-m-d H:i:s', strtotime($obj->updates[$k]->msgtime) + intval((string) Option::get('Time', 'Zone Offset')) * 3600); } $obj->updates = array_reverse($obj->updates); $obj->names = DB::get()->results('select channels.name, users.id, username, pingtime, last, active, value as nickname from channels, sessions, users, options where channels.user_id = users.id AND users.id = sessions.user_id and pingtime > now() - 120000 and channels.name = :channel and options.user_id = users.id and options.grouping = "Identity" and options.name="Nickname";', array('channel' => $obj->channel), 'StdClass'); $obj->namebar = $this->namebar(); $obj->namebarmd5 = md5($obj->namebar); $obj->sups = DB::get()->val('SELECT count(*) as ct FROM presence, channels WHERE presence.channel = channels.name AND presence.msgtime > channels.last AND channels.active = 0 AND channels.user_id = :user_id AND presence.user_id <> :user_id AND presence.type <> "status"', array('user_id' => Auth::user_id())); $obj->drawers = DB::get()->results('SELECT * FROM drawers WHERE (channel = :channel OR isnull(channel) OR channel = "") AND user_id = :user_id ORDER BY added DESC;', array('channel' => $obj->channel, 'user_id' => Auth::user_id()), 'StdClass'); $obj->decor = DB::get()->assoc("SELECT name, value FROM options WHERE room = :channel AND grouping = 'decor';", array('channel' => $obj->channel)); $obj = Plugin::call('response_obj', $obj, $searchmatches['roomtype'], $searchmatches['criteria']); Immediate::set_status(); return json_encode($obj); }