public static function ghost_command($nick, $ircdata = array()) { $unick = $ircdata[0]; $password = $ircdata[1]; // get the parameters. if (trim($unick) == '' || trim($password) == '') { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_SYNTAX_RE, array('help' => 'GHOST')); return false; } // invalid syntax if (!isset(core::$nicks[$unick])) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_NOT_IN_USE, array('nick' => $unick)); return false; // nickname isn't in use } if ($user = services::user_exists($unick, false, array('display', 'pass', 'salt'))) { if ($user->pass == sha1($password . $user->salt) || core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified')) !== false) { ircd::kill(core::$config->nickserv->nick, $unick, 'GHOST command used by ' . core::get_full_hostname($nick)); core::alog(core::$config->nickserv->nick . ': GHOST command used on ' . $unick . ' by ' . core::get_full_hostname($nick)); } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_PASSWORD); // password isn't correct } } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ISNT_REGISTERED, array('nick' => $unick)); return false; // doesn't even exist.. } }
public static function list_command($nick, $ircdata = array()) { $term = $ircdata[0]; $limit = $ircdata[1]; $mode = isset($ircdata[2]) ? strtolower($ircdata[2]) : ''; if (!core::$nicks[$nick]['ircop'] || services::user_exists($nick, true, array('display', 'identified')) === false) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_ACCESS_DENIED); return false; } // they've gotta be identified and opered.. if (trim($term) == '' || trim($limit) == '' || isset($mode) && !in_array($mode, array('', 'suspended'))) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INVALID_SYNTAX_RE, array('help' => 'INFO')); return false; } // invalid syntax if (!preg_match('/([0-9]+)\\-([0-9]+)/i', $limit)) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INVALID_SYNTAX_RE, array('help' => 'LIST')); return false; } // invalid syntax $total = database::select('chans', array('id')); $total = database::num_rows($total); $chans = self::_find_match($term, $mode, $limit); // try and find a match if (database::num_rows($chans) == 0) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_LIST_BOTTOM, array('num' => 0, 'total' => $total)); return false; } // no channels? services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_LIST_TOP); services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_LIST_TOP2); // top of the list while ($channel = database::fetch($chans)) { $false_chan = $channel->channel; if (!isset($channel->channel[18])) { $y = strlen($channel->channel); for ($i = $y; $i <= 17; $i++) { $false_chan .= ' '; } } // this is just a bit of fancy fancy, so everything displays neat if ($channel->suspended == 0) { $info = chanserv::get_flags($channel->channel, 'd'); } else { $info = $channel->suspend_reason; } // suspend reason, or description? services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_LIST_ROW, array('chan' => $false_chan, 'info' => $info)); } // loop through the channels services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_LIST_BOTTOM, array('num' => database::num_rows($chans) == 0 ? 0 : database::num_rows($chans), 'total' => $total)); }
public static function list_command($nick, $ircdata = array()) { $term = $ircdata[0]; $limit = $ircdata[1]; $mode = isset($ircdata[2]) ? strtolower($ircdata[2]) : ''; if (!core::$nicks[$nick]['ircop'] || services::user_exists($nick, true, array('display', 'identified')) === false) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ACCESS_DENIED); return false; } // they've gotta be identified and opered.. if (trim($term) == '' || trim($limit) == '' || isset($mode) && !in_array($mode, array('', 'suspended'))) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_SYNTAX_RE, array('help' => 'LIST')); return false; } // invalid syntax if (!preg_match('/([0-9]+)\\-([0-9]+)/i', $limit)) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_SYNTAX_RE, array('help' => 'LIST')); return false; } // invalid syntax $total = database::select('users', array('id')); $total = database::num_rows($total); $nicks = self::_find_match($term, $mode, $limit); // try and find a match if (database::num_rows($nicks) == 0) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_LIST_BOTTOM, array('num' => 0, 'total' => $total)); return false; } // no nicks? services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_LIST_TOP); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_LIST_TOP2); // top of list. while ($user = database::fetch($nicks)) { $false_nick = $user->display; if (!isset($user->display[18])) { $y = strlen($user->display); for ($i = $y; $i <= 17; $i++) { $false_nick .= ' '; } } // this is just a bit of fancy fancy, so everything displays neat if ($user->suspended == 0) { $hostmask = explode('!', $user->last_hostmask); $info = $hostmask[1]; } else { $info = $user->suspend_reason; } services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_LIST_ROW, array('nick' => $false_nick, 'info' => $info)); } // loop through the nicks services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_LIST_BOTTOM, array('num' => database::num_rows($nicks) == 0 ? 0 : database::num_rows($nicks), 'total' => $total)); }
public function main(&$ircdata, $startup = false) { if (ircd::on_msg(&$ircdata, core::$config->operserv->nick)) { $nick = core::get_nick(&$ircdata, 0); $query = substr(core::get_data_after(&$ircdata, 3), 1); // convert to lower case because all the tingy wags are in lowercase $query = strtolower($query); if (core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified') !== false)) { operserv::get_help($nick, $query); } } // only hook to the privmsg towards OperServ }
public static function register_command($nick, $ircdata = array()) { $chan = core::get_chan(&$ircdata, 0); $desc = core::get_data_after(&$ircdata, 1); // get the channel. if ($user = services::user_exists($nick, true, array('display', 'id'))) { if (trim($desc) == '' || $chan == '' || $chan[0] != '#' || stristr($channel, ' ')) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INVALID_SYNTAX_RE, array('help' => 'INFO')); // wrong syntax return false; } if (services::chan_exists($chan, array('channel')) !== false) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_REGISTERED_CHAN, array('chan' => $chan)); return false; } // check if its registered? if (!strstr(core::$chans[$chan]['users'][$nick], 'o')) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_NEED_CHAN_OP, array('chan' => $chan)); return false; } // we need to check if the user trying to register it has +o // if not we tell them to GET IT! $chan_info = array('channel' => $chan, 'timestamp' => core::$network_time, 'last_timestamp' => core::$network_time, 'topic' => core::$chans[$chan]['topic'], 'topic_setter' => core::$chans[$chan]['topic_setter']); $rflags = core::$config->chanserv->default_flags; $rflags = str_replace('d', '', $rflags); $rflags = str_replace('u', '', $rflags); $rflags = str_replace('e', '', $rflags); $rflags = str_replace('w', '', $rflags); $rflags = str_replace('m', '', $rflags); $rflags = str_replace('t', '', $rflags); // ignore parameter flags database::insert('chans', $chan_info); database::insert('chans_levels', array('channel' => $chan, 'target' => $user->display, 'flags' => 'Ftfrsqao')); database::insert('chans_flags', array('channel' => $chan, 'flags' => $rflags . 'd', 'desc' => $desc)); // create the channel! WOOOH services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_CHAN_REGISTERED, array('chan' => $chan)); core::alog(core::$config->chanserv->nick . ': ' . $chan . ' registered by ' . core::get_full_hostname($nick)); // logchan core::alog('register_command(): ' . $chan . ' registered by ' . core::get_full_hostname($nick), 'BASIC'); // log what we need to log. if ($channel = services::chan_exists($chan, array('channel', 'topic', 'suspended'))) { chanserv::_join_channel(&$channel); // join the channel } // does the channel exist? } else { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_UNREGISTERED); return false; // ph00s aint even registered.. } }
public static function drop_command($nick, $ircdata = array()) { $unick = core::get_nick(&$ircdata, 0); $password = $ircdata[1]; // get the nick. if (trim($unick) == '' || trim($password) == '' && (!core::$nicks[$nick]['ircop'] || services::user_exists($nick, true, array('display', 'identified')) === false)) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_SYNTAX_RE, array('help' => 'DROP')); return false; } // invalid syntax if (services::is_root($unick) && !services::is_root($nick)) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ACCESS_DENIED); return false; } // is a non-root trying to drop a root? if ($user = services::user_exists($unick, false, array('id', 'display', 'pass', 'salt', 'suspended'))) { if ($user->suspended == 1) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_SUSPEND_1, array('nick' => $user->display)); return false; } // are they suspended? if ($user->pass == sha1($password . $user->salt) || core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified')) !== false) { database::delete('users', array('display', '=', $user->display)); database::delete('users_flags', array('nickname', '=', $user->display)); // delete the users record database::delete('chans_levels', array('target', '=', $user->display)); // also delete this users channel access. core::alog(core::$config->nickserv->nick . ': ' . $user->display . ' has been dropped by ' . core::get_full_hostname($nick)); // logchan it core::alog('drop_command(): ' . $user->display . ' has been dropped by ' . core::get_full_hostname($nick), 'BASIC'); // log what we need to log. if (isset(core::$nicks[$user->display])) { ircd::on_user_logout($nick->display); } // if the nick is being used unregister it, even though it shouldn't be? services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_NICK_DROPPED, array('nick' => $user->display)); // let the nick know the account has been dropped. } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_PASSWORD); // password isn't correct } } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ISNT_REGISTERED, array('nick' => $unick)); return false; // doesn't even exist.. } }
public static function logout_command($nick, $ircdata = array()) { // no parameter commands ftw. if ($user = services::user_exists($nick, false, array('display', 'id', 'identified', 'vhost'))) { if ($user->identified == 1) { ircd::on_user_logout($nick); // here we set unregistered mode database::update('users', array('identified' => 0, 'last_timestamp' => core::$network_time), array('display', '=', $nick)); // unidentify them services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_LOGGED_OUT); // let them know core::alog(core::$config->nickserv->nick . ': ' . core::get_full_hostname($nick) . ' logged out of ' . core::$nicks[$nick]['nick']); // and log it. } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_NOT_IDENTIFIED); // not even identified } } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_UNREGISTERED); // unregistered nick name } }
public static function info_command($nick, $ircdata = array()) { $chan = core::get_chan(&$ircdata, 0); // get the channel. if ($chan == '' || $chan[0] != '#') { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INVALID_SYNTAX_RE, array('help' => 'INFO')); return false; // wrong syntax } // make sure they've entered a channel if (!($channel = services::chan_exists($chan, array('channel', 'timestamp', 'last_timestamp', 'suspended', 'suspend_reason')))) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_UNREGISTERED_CHAN, array('chan' => $chan)); return false; } // make sure the channel exists if ($channel->suspended == 1) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_SUSPENDED_1, array('chan' => $channel->channel)); services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_SUSPENDED_2, array('reason' => $channel->suspend_reason)); } else { $founder = database::select('chans_levels', array('id', 'channel', 'target', 'flags'), array('channel', '=', $chan)); $founders = ''; while ($f_row = database::fetch($founder)) { if (strpos($f_row->flags, 'F') !== false) { $founders .= $f_row->target . ', '; } } // get the founder(s) services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_1, array('chan' => $channel->channel)); services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_2, array('nicks' => substr($founders, 0, -2))); $desc = chanserv::get_flags($channel->channel, 'd'); if ($desc != null) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_3, array('desc' => $desc)); } // description? if (core::$chans[$chan]['topic'] != '') { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_4, array('topic' => core::$chans[$chan]['topic'])); } // topic $email = chanserv::get_flags($channel->channel, 'e'); if ($email != null) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_5, array('email' => $email)); } // is there an email? $url = chanserv::get_flags($channel->channel, 'u'); if ($url != null) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_6, array('url' => $url)); } // or a url? services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_7, array('time' => date("F j, Y, g:i a", $channel->timestamp))); services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_8, array('time' => date("F j, Y, g:i a", $channel->last_timestamp))); $modelock = chanserv::get_flags($channel->channel, 'm'); if ($modelock != null) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_9, array('mode_lock' => $modelock)); } // is there a mode lock? $entrymsg = chanserv::get_flags($channel->channel, 'w'); if ($entrymsg != null) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_10, array('entrymsg' => $entrymsg)); } // is there an entry msg? $list = ''; if (chanserv::check_flags($channel->channel, array('T'))) { $list .= 'Topiclock, '; } if (chanserv::check_flags($channel->channel, array('K'))) { $list .= 'Keeptopic, '; } if (chanserv::check_flags($channel->channel, array('G'))) { $list .= 'Guard, '; } if (chanserv::check_flags($channel->channel, array('S'))) { $list .= 'Secure, '; } if (chanserv::check_flags($channel->channel, array('F'))) { $list .= 'Fantasy'; } if (substr($list, -2, 2) == ', ') { $list = substr($list, 0, -2); } // compile our list of options if ($list != '') { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_11, array('options' => $list)); } // if our list doesn't equal '', eg. empty show the info. if (core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified')) !== false && core::$config->chanserv->expire != 0) { $expiry_time = core::$config->chanserv->expire * 86400; services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INFO_12, array('time' => date("F j, Y, g:i a", $channel->last_timestamp + $expiry_time))); } // if the nick in question has staff powers, we show the expiry times. } }
public static function get_help($hook, &$nick, &$command) { // not too sure how to deal with this, probably will // let this function do the looping and just send it // straight to the client? if (services::check_mask_ignore($nick) === true) { return false; } // this is basically to check if we have // an ignored user, via their hostmask, or their nickname. if ($hook == 'chanserv') { $bot = core::$config->chanserv->nick; } if ($hook == 'nickserv') { $bot = core::$config->nickserv->nick; } if ($hook == 'operserv') { $bot = core::$config->operserv->nick; } // what we sending from? $commands = explode(' ', $command); if (strtolower($commands[0]) != 'help' || trim($command) == '') { return false; } // is it actually a help command? >.< $count = (isset(self::$prefix[$hook][$command]) ? count(self::$prefix[$hook][$command]) : 0) + (isset(self::$helpv[$hook][$command]) ? count(self::$helpv[$hook][$command]) : 0) + (isset(self::$suffix[$hook][$command]) ? count(self::$suffix[$hook][$command]) : 0); if (!isset(self::$helpv[$hook][$command]) || $count == 0) { services::communicate($bot, $nick, 'No help available for ' . $command . '.'); return false; } // does the array even exist? if (isset(self::$prefix[$hook][$command])) { foreach (self::$prefix[$hook][$command] as $line => $meta_data) { $meta = unserialize($meta_data); services::communicate($bot, $nick, $meta['info']); } } // is there a prefix? foreach (self::$helpv[$hook][$command] as $line => $meta_data) { $meta = unserialize($meta_data); if ($meta['oper_help'] && (services::user_exists($nick, true, array('display', 'identified')) !== false && core::$nicks[$nick]['ircop'])) { services::communicate($bot, $nick, $meta['info']); } elseif (!$meta['oper_help']) { services::communicate($bot, $nick, $meta['info']); } } // display the main stuff if (isset(self::$suffix[$hook][$command])) { foreach (self::$suffix[$hook][$command] as $line => $meta_data) { $meta = unserialize($meta_data); services::communicate($bot, $nick, $meta['info']); } } // is there a suffix? }
public static function check_levels($nick, $chan, $flags, $force = true, $ident = true, $return = false, $or_check = true) { if ($ident && !($user = services::user_exists($nick, true, array('id', 'display')))) { return false; } // they aint even identified.. $user_flags_q = database::select('chans_levels', array('id', 'channel', 'target', 'flags', 'reason'), array('channel', '=', $chan)); // get our flags records $hostname = core::get_full_hostname($nick); // generate a hostname while ($chan_flags = database::fetch($user_flags_q)) { if ($or_check && core::$nicks[$nick]['override']) { return true; } // is override enabled for this user? if ($nick == $chan_flags->target || $force && (strpos($chan_flags->target, '@') !== false && services::match($hostname, $chan_flags->target))) { foreach ($flags as $flag) { if (strpos($chan_flags->flags, $flag) !== false) { if ($return) { return $chan_flags->reason; } else { return true; } } // hurrah, we've found a match! } // loop through the flags, if we find a match, return true continue; } // only trigger if this is the user we are in question of. } // loop through the flag records return false; }
public static function vhost_command($nick, $ircdata = array()) { $mode = $ircdata[0]; if (strtolower($mode) == 'set') { $host = $ircdata[2]; $unick = $ircdata[1]; // some variables. if (trim($unick) == '') { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_INVALID_SYNTAX_RE, array('help' => 'VHOST')); return false; } // are we missing nick? invalid syntax if so. if (!($user = services::user_exists($unick, false, array('display', 'id', 'identified', 'vhost')))) { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_ISNT_REGISTERED, array('nick' => $unick)); return false; } // is the nick registered? if (substr_count($host, '@') == 1) { $realhost = $host; $new_host = explode('@', $host); $ident = $new_host[0]; $host = $new_host[1]; } elseif (substr_count($host, '@') > 1) { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_INVALID_HOSTNAME); return false; } else { $realhost = $host; } // check if there is a @ if (services::valid_host($host) === false) { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_INVALID_HOSTNAME); return false; } // is the hostname valid? database::update('users', array('vhost' => $realhost), array('display', '=', $user->display)); core::alog(core::$config->operserv->nick . ': vHost for ' . $unick . ' set to ' . $realhost . ' by ' . $nick); services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_VHOST_SET, array('nick' => $unick, 'host' => $realhost)); // update it and log it if (isset(core::$nicks[$unick]) && $user->identified == 1) { if (substr_count($realhost, '@') == 1) { ircd::setident(core::$config->operserv->nick, $unick, $ident); ircd::sethost(core::$config->operserv->nick, $unick, $host); } else { ircd::sethost(core::$config->operserv->nick, $unick, $host); } } // we need to check if the user is online and identified? } elseif (strtolower($mode) == 'del') { $unick = $ircdata[1]; // some variables. if (trim($unick) == '') { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_INVALID_SYNTAX_RE, array('help' => 'VHOST')); return false; } // are we missing nick? invalid syntax if so. if (!($user = services::user_exists($unick, false, array('display', 'id', 'identified', 'vhost')))) { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_ISNT_REGISTERED, array('nick' => $unick)); return false; } // is the nick registered? if ($user->vhost == '') { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_NO_VHOST, array('nick' => $unick)); return false; } // is there a vhost?! database::update('users', array('vhost' => ''), array('display', '=', $user->display)); core::alog(core::$config->operserv->nick . ': vHost for ' . $unick . ' deleted by ' . $nick); services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_VHOST_DELETED, array('nick' => $unick)); // update and logchan } elseif (strtolower($mode) == 'list') { $limit = $ircdata[1]; // get limit. if (trim($limit) == '') { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_INVALID_SYNTAX_RE, array('help' => 'VHOST')); return false; } // invalid syntax if (!preg_match('/([0-9]+)\\-([0-9]+)/i', $limit)) { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_INVALID_SYNTAX_RE, array('help' => 'VHOST')); return false; } // invalid syntax $total = database::select('users', array('id'), array('vhost', '!=', '')); $total = database::num_rows($total); // get the total $limit = database::quote($limit); $s_limit = explode('-', $limit); $offset = $s_limit[0]; $max = $s_limit[1]; // split up the limit and stuff ^_^ $users_q = database::select('users', array('display', 'vhost'), array('vhost', '!=', ''), '', array($offset => $max)); // get the vhosts if (database::num_rows($users_q) == 0) { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_VHOST_LIST_B, array('num' => database::num_rows($users_q), 'total' => $total)); return false; } // no vhosts services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_VHOST_LIST_T); services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_VHOST_LIST_T2); // list top. while ($users = database::fetch($users_q)) { $false_nick = $users->display; if (!isset($users->display[18])) { $y = strlen($users->display); for ($i = $y; $i <= 17; $i++) { $false_nick .= ' '; } } // this is just a bit of fancy fancy, so everything displays neat services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_VHOST_LIST_R, array('nick' => $false_nick, 'info' => $users->vhost)); } // loop through em, show the vhosts services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_VHOST_LIST_B, array('num' => database::num_rows($users_q) == 0 ? 0 : database::num_rows($users_q), 'total' => $total)); // end of list. } else { services::communicate(core::$config->operserv->nick, $nick, &operserv::$help->OS_INVALID_SYNTAX_RE, array('help' => 'VHOST')); return false; // invalid syntax. } }
public function main(&$ircdata, $startup = false) { if (ircd::on_connect(&$ircdata)) { $nick = core::get_nick(&$ircdata, core::$config->server->ircd == 'inspircd12' ? 4 : 3); if ($user = services::user_exists($nick, false, array('display', 'suspended'))) { if ($user->suspended == 1) { $random_nick = 'Unknown' . rand(10000, 99999); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_SUSPEND_1, array('nick' => $user->display)); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_NICK_CHANGE, array('nick' => $random_nick)); ircd::svsnick($nick, $random_nick, core::$network_time); } } // check if the nick is suspended etc. } // trigger on connect if (ircd::on_nick_change(&$ircdata)) { $nick = core::get_nick($ircdata, 2); // get the nicknames if ($user = services::user_exists($nick, false, array('display', 'suspended'))) { if ($user->suspended == 1) { $random_nick = 'Unknown' . rand(10000, 99999); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_SUSPEND_1, array('nick' => $user->display)); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_NICK_CHANGE, array('nick' => $random_nick)); ircd::svsnick($nick, $random_nick, core::$network_time); } } // check if the nick is suspended etc. } // trigger on nick change }
public static function confirm_command($nick, $ircdata = array()) { $code = $ircdata[0]; if (trim($code) == '') { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_SYNTAX_RE, array('help' => 'CONFIRM')); return false; } // wrong syntax if (!($user = services::user_exists($nick, false, array('display', 'id')))) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_UNREGISTERED); return false; } // unregistered $code_array = database::select('validation_codes', array('nick', 'code'), array('nick', '=', $nick, 'AND', 'code', '=', $code)); if (database::num_rows($code_array) == 0) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_PASSCODE); } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_VALIDATED); // let them know. database::update('users', array('validated' => 1), array('id', '=', $user->id)); // user is now validated. database::delete('validation_codes', array('nick', '=', $nick, 'AND', 'code', '=', $code)); // delete the code now that we've validated them core::alog(core::$config->nickserv->nick . ': ' . $nick . ' activated'); // logchan } // no passcode found }
public function main(&$ircdata, $startup = false) { if (ircd::on_connect(&$ircdata)) { $nick = core::get_nick(&$ircdata, core::$config->server->ircd == 'inspircd12' ? 4 : 3); // get nick if ($user = services::user_exists($nick, false, array('display', 'identified', 'validated', 'last_hostmask', 'suspended'))) { if ($user->validated == 0 && $user->suspended == 0) { ircd::on_user_logout($nick); // they shouldn't really have registered mode services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_AWAITING_VALIDATION); } elseif ($user->identified == 0 && $user->suspended == 0) { self::_registered_nick($nick, $user); } elseif ($user->identified == 1 && $user->last_hostmask == core::get_full_hostname($nick)) { ircd::on_user_login($nick); if (!$startup) { core::alog(core::$config->nickserv->nick . ': ' . core::$nicks[$nick]['ident'] . '@' . core::$nicks[$nick]['host'] . ' automatically identified for ' . $nick); } } else { self::_registered_nick($nick, $user); } } // is the user existing? } // on connect let them know that they're using // an identified nickname if (ircd::on_nick_change(&$ircdata)) { $nick = core::get_nick($ircdata, 2); $old_nick = core::$nicks[$nick]['onick']; // get the nicknames timer::remove(array('ns_identify', 'secured_callback', array($old_nick))); // remove the secured timer. if there is one ircd::on_user_logout($nick); // we remove the registered mode if ($user = services::user_exists($nick, false, array('display', 'identified', 'validated', 'last_hostmask', 'suspended'))) { if ($user->validated == 0 && $user->suspended == 0) { ircd::on_user_logout($nick); // they shouldn't really have registered mode services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_AWAITING_VALIDATION); } elseif ($user->identified == 0 && $user->suspended == 0) { self::_registered_nick($nick, $user); } elseif ($user->identified == 1 && $user->last_hostmask == core::get_full_hostname($nick)) { ircd::on_user_login($nick); core::alog(core::$config->nickserv->nick . ': ' . core::$nicks[$nick]['ident'] . '@' . core::$nicks[$nick]['host'] . ' automatically identified for ' . $nick); } else { self::_registered_nick($nick, $user); } } // is the new nick registered? let them know } if (ircd::on_quit(&$ircdata)) { $nick = core::get_nick(&$ircdata, 0); timer::remove(array('ns_identify', 'secured_callback', array($nick))); // remove the secured timer. if there is one database::update('users', array('identified' => 0, 'last_timestamp' => core::$network_time), array('display', '=', $nick)); // change nick to unidentified imo } }
public static function sapass_command($nick, $ircdata = array()) { $unick = core::get_nick(&$ircdata, 0); $new_pass = $ircdata[1]; $conf_pass = $ircdata[2]; // new password. if (!($user = services::user_exists($unick, false, array('display', 'id', 'identified', 'salt')))) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ISNT_REGISTERED, array('nick' => $unick)); return false; } // find out if our user is registered if (services::is_root($unick) && !services::is_root($nick)) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ACCESS_DENIED); return false; } // is a non-root trying to change a root's password? if (!core::$nicks[$nick]['ircop'] || services::user_exists($nick, true, array('display', 'identified')) === false) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ACCESS_DENIED); return false; } // do we have access to do this? if (strtolower($new_pass) == strtolower($unick)) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_PASSWORD_NICK_U); return false; } // are they using a reasonable password, eg. != their nick, lol. if ($new_pass != $conf_pass) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_PASSWORD_DIFF); return false; } // the passwords are different database::update('users', array('pass' => sha1($new_pass . $user->salt)), array('display', '=', $unick)); // we update the password here, with the users salt. services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_NEW_PASSWORD_U, array('nick' => $unick, 'pass' => $new_pass)); // let them know core::alog(core::$config->nickserv->nick . ': ' . core::get_full_hostname($nick) . ' changed the password for ' . $unick); // logchan }
public static function saflags_command($nick, $ircdata = array()) { $unick = core::get_nick(&$ircdata, 0); $flags = $ircdata[1]; $param = core::get_data_after(&$ircdata, 2); $rparams = explode('||', $param); // get the channel. if (!($user = services::user_exists($unick, false, array('display', 'id', 'identified', 'salt')))) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ISNT_REGISTERED, array('nick' => $unick)); return false; } // find out if our user is registered if (services::is_root($unick) && !services::is_root($nick)) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ACCESS_DENIED); return false; } // is a non-root trying to change a root's password? if (!core::$nicks[$nick]['ircop'] || services::user_exists($nick, true, array('display', 'identified')) === false) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ACCESS_DENIED); return false; } // do we have access to do this? $flag_a = array(); foreach (str_split($flags) as $flag) { if (strpos(self::$flags, $flag) === false) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_FLAGS_UNKNOWN, array('flag' => $flag)); return false; } // flag is invalid. $flag_a[$flag]++; // plus if ($flag_a[$flag] > 1 || $flag != '-' && $flag != '+') { $flag_a[$flag]--; } // check for dupes } // check if the flag is valid $flags = ''; foreach ($flag_a as $flag => $count) { $flags .= $flag; } // reconstruct the flags $flag_array = mode::sort_modes($flags, false); // sort our flags up foreach (str_split(self::$p_flags) as $flag) { $param_num = strpos($flag_array['plus'], $flag); if ($param_num !== false) { $params[$flag] = trim($rparams[$param_num]); } // we do! } // check if we have any paramtized flags, eg +me foreach (str_split($flag_array['plus']) as $flag) { // paramtized flags (lowercase) ones come first // ----------- +e ----------- // if ($flag == 'e') { self::set_flag($nick, $unick, '+e', $params['e']); // +e the target in question } elseif ($flag == 'u') { self::set_flag($nick, $unick, '+u', $params['u']); // +u the target in question } elseif ($flag == 'S') { self::set_flag($nick, $unick, '+S', ''); // +S the target in question } elseif ($flag == 'P') { self::set_flag($nick, $unick, '+P', ''); // +P the target in question } // ----------- +P ----------- // } foreach (str_split($flag_array['minus']) as $flag) { // paramtized flags (lowercase) ones come first // ----------- -e ----------- // if ($flag == 'e') { self::set_flag($nick, $unick, '-e', $params['e']); // -e the target in question } elseif ($flag == 'u') { self::set_flag($nick, $unick, '-u', $params['u']); // -u the target in question } elseif ($flag == 'S') { self::set_flag($nick, $unick, '-S', ''); // -S the target in question } elseif ($flag == 'P') { self::set_flag($nick, $unick, '-P', ''); // -P the target in question } // ----------- -P ----------- // } if (isset(self::$set[$unick])) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_FLAGS_SET, array('flag' => self::$set[$unick], 'target' => $unick)); unset(self::$set[$unick]); } // send back the target stuff.. if (isset(self::$already_set[$unick])) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_FLAGS_ALREADY_SET, array('flag' => self::$already_set[$unick], 'target' => $unick)); unset(self::$already_set[$unick]); } // send back the target stuff.. if (isset(self::$not_set[$unick])) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_FLAGS_NOT_SET, array('flag' => self::$not_set[$unick], 'target' => $unick)); unset(self::$not_set[$unick]); } // send back the target stuff.. }
public function main(&$ircdata, $startup = false) { foreach (modules::$list as $module => $data) { if ($data['type'] == 'operserv') { modules::$list[$module]['class']->main(&$ircdata, $startup); // loop through the modules for operserv. } } if (ircd::on_msg(&$ircdata, core::$config->operserv->nick)) { $nick = core::get_nick(&$ircdata, 0); $command = substr(core::get_data_after(&$ircdata, 3), 1); // convert to lower case because all the tingy wags are in lowercase core::alog(core::$config->operserv->nick . ': ' . $nick . ': ' . $command); // logchan it if (core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified') !== false)) { self::get_command($nick, $command); } else { services::communicate(core::$config->operserv->nick, $nick, &self::$help->OS_DENIED_ACCESS); } // theyre an oper. } // this is what we use to handle command listens // should be quite epic. }
public static function info_command($nick, $ircdata = array()) { $unick = core::get_nick(&$ircdata, 0); // get the nickname. if ($unick == '') { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_SYNTAX_RE, array('help' => 'INFO')); // wrong syntax return false; } // make sure they've entered a channel if (!($user = services::user_exists($unick, false, array('display', 'suspended', 'suspend_reason', 'last_hostmask', 'timestamp', 'last_timestamp')))) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ISNT_REGISTERED, array('nick' => $unick)); return false; } // make sure the user exists if ($user->suspended == 1) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_SUSPENDED_1, array('nick' => $user->display)); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_SUSPENDED_2, array('reason' => $user->suspend_reason)); } else { $hostmask = explode('!', $user->last_hostmask); $hostmask = $hostmask[1]; // get the hostmask services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_1, array('nick' => $user->display)); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_2, array('time' => date("F j, Y, g:i a", $user->timestamp))); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_3, array('time' => date("F j, Y, g:i a", $user->last_timestamp != 0 ? $user->last_timestamp : core::$network_time))); services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_4, array('host' => $hostmask)); // standard messages if (core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified')) !== false || $unick == $nick && services::user_exists($nick, true, array('display', 'identified')) !== false) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_5, array('email' => nickserv::get_flags($nick, 'e'))); } // if the person doing /ns info has staff powers we show the email // or if someone is doing /ns info on themselves we show it. $url = nickserv::get_flags($unick, 'u'); if ($url != null) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_6, array('url' => $url)); } // url $list = ''; if (nickserv::check_flags($unick, array('S'))) { $list .= 'Secure, '; } if (nickserv::check_flags($unick, array('P'))) { $list .= 'Private Message'; } if (substr($list, -2, 2) == ', ') { $list = substr($list, 0, -2); } // compile our list of options if ($list != '') { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_7, array('options' => $list)); } // if our list doesn't equal '', eg. empty show the info. if (core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified')) !== false && core::$config->nickserv->expire != 0) { $expiry_time = core::$config->nickserv->expire * 86400; services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INFO_8, array('time' => date("F j, Y, g:i a", $user->last_timestamp != 0 ? $user->last_timestamp : core::$network_time + $expiry_time))); } // if the nick in question has staff powers, we show the expiry times. } }
public static function _drop_check($nick, $chan) { if ($chan == '' || $chan[0] != '#') { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INVALID_SYNTAX_RE, array('help' => 'DROP')); return false; // wrong syntax } // make sure they've entered a channel if (services::chan_exists($chan, array('channel')) === false) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_UNREGISTERED_CHAN, array('chan' => $chan)); return false; } // make sure the channel exists. if (chanserv::_is_founder($nick, $chan)) { return true; } elseif (core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified'))) { ircd::globops(core::$config->chanserv->nick, $nick . ' used DROP on ' . $chan); return true; } services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_ACCESS_DENIED); return false; // do they have access? }
public static function give_access($chan, $nick, $chan_access, $secure = 1) { if ($secure && services::user_exists($nick, true, array('display', 'identified')) === false) { return false; } // return false if secure is set to 1 and $nick isnt identified. $mode_string = ''; $mode_params = ''; foreach ($chan_access as $level) { if ($level == '5' && ircd::$owner) { $mode_string .= 'q'; $mode_params .= $nick . ' '; } // we've found a +q! if ($level == '4' && ircd::$protect) { $mode_string .= 'a'; $mode_params .= $nick . ' '; } // we've found a +a! if ($level == '3') { $mode_string .= 'o'; $mode_params .= $nick . ' '; } // we've found a +o! if ($level == '2' && ircd::$halfop) { $mode_string .= 'h'; $mode_params .= $nick . ' '; } // we've found a +h! if ($level == '1') { $mode_string .= 'v'; $mode_params .= $nick . ' '; } // we've found a +v! } // loop through access records // levels are as follows; // 5 - q // 4 - a // 3 - o // 2 - h // 1 - v if ($mode_string != '') { ircd::mode(core::$config->chanserv->nick, $chan, '+' . $mode_string . ' ' . trim($mode_params)); } // finally, we set the mode string on the nick // providing it isnt empty unset($mode_string); }
public static function release_command($nick, $ircdata = array()) { $unick = $ircdata[0]; $password = $ircdata[1]; // get the parameters. if (trim($unick) == '' || trim($password) == '') { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_SYNTAX_RE, array('help' => 'RELEASE')); return false; } // invalid syntax if ($user = services::user_exists($unick, false, array('display', 'pass', 'salt'))) { if ($user->pass == sha1($password . $user->salt) || core::$nicks[$nick]['ircop'] && services::user_exists($nick, true, array('display', 'identified')) !== false) { if (!isset(self::$held_nicks[$unick])) { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_NO_HOLD, array('nick' => $unick)); return false; // nickname isnt locked. } ircd::remove_client($unick, 'RELEASED by ' . $nick); core::alog(core::$config->nickserv->nick . ': RELEASE command on ' . $unick . ' used by ' . core::get_full_hostname($nick)); timer::remove(array('ns_recover', 'remove_callback', array($unick))); // if they are, remove client, respectively // unsetting data and removing them. services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_NICK_RELEASED, array('nick' => $unick)); // tell the user their nick has been released (Y) } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_INVALID_PASSWORD); // password isn't correct } } else { services::communicate(core::$config->nickserv->nick, $nick, &nickserv::$help->NS_ISNT_REGISTERED, array('nick' => $unick)); return false; // doesn't even exist.. } }
public static function unsuspend_command($nick, $ircdata = array()) { $chan = core::get_chan(&$ircdata, 0); // get the channel. if (!core::$nicks[$nick]['ircop'] || services::user_exists($nick, true, array('display', 'identified')) === false) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_ACCESS_DENIED); return false; } // they've gotta be identified. if ($chan == '' || $chan[0] != '#') { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_INVALID_SYNTAX_RE, array('help' => 'UNSUSPEND')); return false; // wrong syntax } // make sure they've entered a channel if ($channel = services::chan_exists($chan, array('channel', 'suspended'))) { if ($channel->suspended == 0) { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_SUSPEND_4, array('chan' => $chan)); return false; } // channel isn't even suspended $check_row = database::select('chans_levels', array('channel'), array('channel', '=', $chan)); if (database::num_rows($check_row) == 0) { database::delete('chans', array('channel', '=', $chan)); database::delete('chans_flags', array('channel', '=', $chan)); } // the channel has no access records, drop it. } else { services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_SUSPEND_4, array('chan' => $chan)); return false; } services::communicate(core::$config->chanserv->nick, $nick, &chanserv::$help->CS_SUSPEND_5, array('chan' => $chan)); core::alog(core::$config->chanserv->nick . ': ' . $nick . ' UNSUSPENDED ' . $chan); ircd::globops(core::$config->chanserv->nick, $nick . ' UNSUSPENDED ' . $chan); // oh well, was fun while it lasted eh? // unsuspend it :P }