function _retreat($params) { $user = $params['user']; $channel = $params['channel']; $inchannels = DB::get()->col('SELECT name FROM channels WHERE user_id = :user_id', array('user_id' => $user->id)); $join = 'office:' . $user->username; $joinalias = $this->_room_alias($join); foreach ($inchannels as $partchan) { DB::get()->query('DELETE FROM channels WHERE name = :name AND user_id = :user_id;', array('name' => $partchan, 'user_id' => $user->id)); if (preg_match('%^search:(?P<criteria>.+)$%i', $partchan, $searchmatches)) { DB::get()->query("DELETE FROM options WHERE name = :name AND grouping = 'searches' AND user_id = :user_id;", array('name' => $searchmatches['criteria'], 'user_id' => $user->id)); } else { if ($partchan != $join) { Status::create()->data("{$user->username} has retreated to <a href=\"#\" onclick=\"joinRoom('" . addslashes($join) . "');return false;\">{$joinalias}</a> from {$partchan}")->type('part')->channel($partchan)->insert(); } } } DB::get()->query('INSERT INTO channels (name, user_id, last) VALUES (:name, :user_id, NOW());', array('name' => $join, 'user_id' => $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' => $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}', $joinalias, $herald); $msg = htmlspecialchars($herald); Status::create()->data($msg)->type('join')->cssclass($cssclass)->channel($join)->js($js)->insert(); Immediate::create()->laststatus()->js('setRoom("' . addslashes($join) . '");'); return true; }
function _minibar($params) { $watch = $params['watch']; $user = Auth::user(); $widgets = DB::get()->results("SELECT * FROM options WHERE grouping = 'widgets' AND user_id = :user_id", array('user_id' => $user->id)); foreach ($widgets as $widget) { $data = unserialize($widget->value); if ($data['name'] == 'minibar') { $data['rooms'][] = $watch; $widget->value = serialize($data); $widget->update('options', 'id'); Immediate::create()->js("reloadWidgets();addSystem({user_id:{$user->id}, data: 'Added \\'" . addslashes($watch) . "\\' to minibar.', cssclass: 'ok', username: '******', nickname: '{$user->nickname}', status: " . microtime(true) . ", js:''}, '#notices');do_scroll();"); return true; } } $lastwidgetid = DB::get()->val("SELECT MAX(id) FROM options"); if (!$lastwidgetid) { $lastwidgetid = 0; } $lastwidgetid++; $data = array('name' => 'minibar', 'params' => '', 'rooms' => array($watch)); DB::get()->query("INSERT INTO options (name, grouping, value, user_id) VALUES (:name, 'widgets', :value, :user_id);", array('name' => $lastwidgetid, 'value' => serialize($data), 'user_id' => $user->id)); Immediate::create()->js("reloadWidgets();addSystem({user_id:{$user->id}, data: 'Added \\'" . addslashes($watch) . "\\' as minibar widget.', cssclass: 'ok', username: '******', nickname: '{$user->nickname}', status: " . microtime(true) . ", js:''}, '#notices');do_scroll();"); return true; }
function _externals($params) { $p2 = $params; $p2['user'] = $p2['user']->std(); $p2['chaturl'] = 'http://' . $_SERVER['HTTP_HOST'] . '/'; $body = json_encode($p2); $user = $params['user']; //Immediate::debug(htmlspecialchars(print_r($params,1)));return false; $externals = DB::get()->col("SELECT value FROM options WHERE grouping = 'external'"); foreach ($externals as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // The URL. curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // Maximum number of redirections to follow. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follow 302's and the like. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Return the data from the stream. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 1); curl_setopt($ch, CURLOPT_POST, true); // POST mode. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('p' => $body))); // Immediate::create() // ->js("addSystem({user_id:{$user->id}, data: '" . addslashes($body) . "', cssclass: 'error', username: '******', nickname: '{$user->nickname}', status: " . microtime(true) . ", js:''}, '#notices');do_scroll();"); $response = curl_exec($ch); if (curl_errno($ch) !== 0) { Immediate::create()->js("addSystem({user_id:{$user->id}, data: 'External \\'" . addslashes($url) . "\\' failed, with a curl error, " . curl_errno($ch) . ".', cssclass: 'error', username: '******', nickname: '{$user->nickname}', status: " . microtime(true) . ", js:''}, '#notices');do_scroll();"); } elseif (curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) { //die('Not 200 response code'); Immediate::create()->js("addSystem({user_id:{$user->id}, data: 'External \\'" . addslashes($url) . "\\' failed, with HTTP error code " . curl_getinfo($ch, CURLINFO_HTTP_CODE) . ".', cssclass: 'error', username: '******', nickname: '{$user->nickname}', status: " . microtime(true) . ", js:''}, '#notices');do_scroll();"); } else { Immediate::debug(htmlspecialchars($response)); //return false; try { $xml = new SimpleXMLElement($response); foreach ($xml->result as $result) { $status = Status::create(); foreach ($result->attributes() as $k => $v) { switch ($k) { case 'append': break; case 'user': $remote_user = DB::get()->val("SELECT id FROM users WHERE username = ?", array($v)); if (!$remote_user) { $remote_user = min(-1, DB::get()->val("SELECT min(id) FROM users") - 1); DB::get()->query("INSERT INTO users (id, username) VALUES (?, ?)", array($remote_user, $v)); DB::get()->query("UPDATE users SET id = ? WHERE username = ?", array($remote_user, $v)); } $status->user_id = $remote_user; break; default: $status->{$k} = $v; break; } } $status->data((string) $result); if (isset($result['append']) && $result['append'] == 'pre') { $status->insert(); } else { $this->statuses[] = $status; } if ($xml['silent'] == 'true') { return true; } } } catch (Exception $e) { Immediate::debug('RESPONSE: ' . htmlspecialchars($response)); } } curl_close($ch); return false; } }
function _closedrawer($params) { $user = $params['user']; $channel = $params['channel']; $drawerid = $params['drawerid']; DB::get()->query("DELETE FROM drawers WHERE id = :drawerid AND user_id = :user_id;", array('drawerid' => $drawerid, 'user_id' => $user->id)); Immediate::create()->js("refreshDrawers();commandstatus(false);"); return true; }
function _timecard_action($params) { $user = $params['user']; list($action, ) = explode(' ', $params['action']); $drawervisible = DB::get()->val("SELECT id FROM drawers WHERE indexed = 'timecard' AND user_id = :user_id", array('user_id' => $user->id)); if (!$drawervisible) { DB::get()->query("INSERT INTO drawers (user_id, message, indexed, cssclass) VALUES (:user_id, :msg, 'timecard', 'timecard');", array('user_id' => $user->id, 'msg' => '<div>Processing...</div>')); } switch ($action) { case 'process': Immediate::create()->js('refreshDrawers(function(){$(\'#timecard_save,#timecard_process\').remove();$(\'#timecard_data\').load(\'/ajax/process_timecard\');return false;});'); break; case 'save': Immediate::create()->js('refreshDrawers(function(){$(\'#timecard_save,#timecard_process\').remove();$(\'#timecard_data\').load(\'/ajax/save_timecard\',{timecard:$(\'#timecard_data textarea\').val()});return false;});'); break; case 'alias': list($action, $from, $to) = explode(' ', $params['action']); if ($from == '' || $to == '') { Immediate::error('The syntax of this command is: @?alias {project code alias} {project code}'); } else { DB::get()->query("DELETE FROM options WHERE user_id = :user_id and grouping = 'time alias' and name = :name", array('user_id' => $user->id, 'name' => $from)); DB::get()->query("INSERT INTO options (user_id, grouping, name, value) VALUES (:user_id, 'time alias', :name, :value)", array('user_id' => $user->id, 'name' => $from, 'value' => $to)); Immediate::ok('Set alias "' . htmlspecialchars($from) . '" to point to "' . htmlspecialchars($to) . '".'); } } return true; }
public static function error($msg) { Immediate::create()->js("addSystem({user_id:0, data: '" . str_replace("\n", '\\n', addslashes($msg)) . "', cssclass: 'error', username: '', nickname: '', status: " . microtime(true) . ", js:''}, '#notices');do_scroll();"); }
function _karma($params) { $user = $params['user']; $channel = $params['channel']; $matches = $params['matches']; $word = trim(strtolower($matches['word']), '"'); $md5w = md5($word); $points = DB::get()->row('select sum(karma) as s, sum(abs(karma)) as b, sum(karma / abs(karma)) as v, std(karma) as d, var_pop(karma) as v from karma where word = ?', array($word)); $lastvote = DB::get()->row('SELECT time_to_sec(timediff(now(),lastvote)) as t, karma FROM karma WHERE word = ? and user_id = ?', array($word, $user->id)); if ($lastvote && $lastvote->t < 30) { Immediate::create()->laststatus()->js("\$('#mainscroller .karma_{$md5w} .inner.active .voters').html('You are voting too fast! Wait " . (30 - $lastvote->t) . " seconds.').effect('highlight', {}, 1500);"); return true; } if ($lastvote && abs($lastvote->karma) > $points->b - abs($lastvote->karma) && $points->v > 2) { Immediate::create()->laststatus()->js("\$('#mainscroller .karma_{$md5w} .inner.active .voters').html('You have voted more than everyone else <em>combined</em>. You win!').effect('highlight', {}, 1500);"); return true; } $kpoints = $points->s; if (DB::get()->val('SELECT count(word) FROM karma WHERE word = ? and user_id = ?', array($word, $user->id)) == 0) { switch ($matches['karma']) { case '++': $kpoints++; $bmsg = 'Added one karma point to "' . htmlspecialchars($matches['word']) . '", totaling ' . $kpoints . ' points.'; DB::get()->query('INSERT INTO karma (word, karma, user_id, direction) VALUES (?, ?, ?, 1)', array($word, 1, $user->id)); break; case '--': $kpoints--; $bmsg = 'Subtracted one karma point from "' . htmlspecialchars($matches['word']) . '", totaling ' . $kpoints . ' points.'; DB::get()->query('INSERT INTO karma (word, karma, user_id, direction) VALUES (?, ?, ?, -1)', array($word, -1, $user->id)); break; case '~~': $kpoints--; $bmsg = 'You didn\'t vote on "' . htmlspecialchars($matches['word']) . '" to begin with. The total is still ' . $kpoints . ' points.'; DB::get()->query('INSERT INTO karma (word, karma, user_id, direction) VALUES (?, ?, ?, 0)', array($word, -1, $user->id)); break; case '??': $bmsg = '"' . htmlspecialchars($matches['word']) . '" has ' . $kpoints . ' karma points -- you have not voted.'; if ($points->b == 0) { return false; } break; } } else { $oldkarma = DB::get()->val('SELECT karma FROM karma WHERE word = ? and user_id = ?', array($word, $user->id)); switch ($matches['karma']) { case '++': $kpoints++; $bmsg = 'Added one karma point to "' . htmlspecialchars($matches['word']) . '", totaling ' . $kpoints . ' points.'; DB::get()->query('UPDATE karma SET karma = karma + 1, lastvote = now(), direction = 1 WHERE word = ? and user_id = ?', array($word, $user->id)); break; case '--': $kpoints--; $bmsg = 'Subtracted one karma point from "' . htmlspecialchars($matches['word']) . '", totaling ' . $kpoints . ' points.'; DB::get()->query('UPDATE karma SET karma = karma - 1, lastvote = now(), direction = -1 WHERE word = ? and user_id = ?', array($word, $user->id)); break; case '~~': $kpoints -= $oldkarma; $bmsg = 'Removing your vote on "' . htmlspecialchars($matches['word']) . '", now totaling ' . $kpoints . ' points.'; DB::get()->query('DELETE FROM karma WHERE word = ? and user_id = ?', array($word, $user->id)); break; case '??': $bmsg = '"' . htmlspecialchars($matches['word']) . '" has ' . $kpoints . ' karma points -- you have already voted (' . $oldkarma . ').'; break; } } $points = DB::get()->row('select sum(karma) as s, sum(karma / abs(karma)) as v, std(karma) as d, var_pop(karma) as v from karma where word = ?', array($word)); $hword = htmlspecialchars($word); $bmsg = '<div class="word">' . $hword . '</div><button class="voteup" onclick="send(\'' . addslashes($hword) . '++\');">++</button><button class="votedown" onclick="send(\'' . addslashes($hword) . '--\');">--</button>'; $bmsg = '<div class="inner">loading</div>'; Status::create()->data($bmsg)->channel($channel)->type('notice')->cssclass('karma karma_' . md5($word))->js('apply_karma("' . $md5w . '", "' . $hword . '");')->insert(); return true; }