Beispiel #1
0
 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);
 }