/** * Handles joins on channels registered with chanserv * @param string $data */ public function handleJoin($data) { // get chanserv address $chanserv = Services::getModuleManager()->lookupModule('ChanServ'); // check for registered channel if (call_user_func(array($chanserv, 'isRegistered'), $data['channel'])) { foreach ($data['userList'] as $user) { // get user from array $user = $user['user']; // get channel access $access = Services::getModuleManager()->getBot($chanserv)->getAccess($data['channel'], $user->accountname); if ($access >= 500) { Services::getConnection()->getProtocol()->sendMode(Services::getModuleManager()->getBot($chanserv)->getUuid(), $data['channel'], '+q ' . $user->getNick()); } else { if ($access >= Services::getModuleManager()->getBot($chanserv)->getNeededAccess($data['channel'], 'getOp')) { Services::getConnection()->getProtocol()->sendMode(Services::getModuleManager()->getBot($chanserv)->getUuid(), $data['channel'], '+o ' . $user->getNick()); } else { if ($access >= Services::getModuleManager()->getBot($chanserv)->getNeededAccess($data['channel'], 'getVoice')) { Services::getConnection()->getProtocol()->sendMode(Services::getModuleManager()->getBot($chanserv)->getUuid(), $data['channel'], '+v ' . $user->getNick()); } } } } } }
/** * @see lib/modules/CommandModule::execute() */ public function execute($user, $target, $message) { $messageEx = explode(' ', $message); unset($messageEx[0]); // quit with a nice message if (count($messageEx)) { Services::getModuleManager()->shutdown(implode(' ', $messageEx)); } else { Services::getModuleManager()->shutdown(); } exit; }
/** * Handles an incoming KICK event * @param array $data */ public function handleKick($data) { // get chanserv $chanserv = Services::getModuleManager()->lookupModule('ChanServ'); // ignore unregistered channels if (call_user_func(array($chanserv, 'isRegistered'), $data['target'])) { // check permissions if (call_user_func(array($chanserv, 'getAccess'), $data['target'], Services::getUserManager()->getUser($data['issuer'])->accountname) < call_user_func(array($chanserv, 'getAccess'), $data['target'], Services::getUserManager()->getUser($data['victim'])->accountname) || call_user_func(array($chanserv, 'getAccess'), $data['target'], Services::getUserManager()->getUser($data['issuer'])->accountname) < call_user_func(array($chanserv, 'kick'), $data['target'])) { // rejoin victim if needed Services::getConnection()->getProtocol()->sendSvsjoin($data['victim'], $data['target']); } } }
/** * @see lib/modules/CommandModule::execute() */ public function execute($user, $target, $message) { // split message $messageEx = explode(' ', $message); // BIND <bot> <module> <command> <appearInHelp> if (count($messageEx) >= 3) { $botAddress = Services::getModuleManager()->lookupModule($messageEx[1]); $moduleAddress = Services::getModuleManager()->lookupModule($messageEx[2]); $commandName = $messageEx[3]; $appearInHelp = (bool) (isset($messageEx[4]) ? $messageEx[4] : true); Services::getModuleManager()->bindCommand($botAddress, $moduleAddress, $commandName, $appearInHelp); $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.' . $this->originalName . '.success')); } else { // send syntax hint $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.' . $this->originalName . '.syntaxHint')); } }
/** * @see lib/modules/CommandModule::execute() */ public function execute($user, $target, $message) { // split message $messageEx = explode(' ', $message); if (count($messageEx) == 2 and !empty($messageEx[1])) { // get module name $moduleName = $messageEx[1]; try { // try to load module Services::getModuleManager()->loadModule(SDIR . 'lib/modules/' . ucfirst($moduleName) . '.class.php'); } catch (Exception $ex) { $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.' . $this->originalName . '.cannotLoad', $ex->getMessage())); } } else { // send syntax hint $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.' . $this->originalName . '.syntaxHint')); } }
/** * @see lib/modules/CommandModule::execute() */ public function execute($user, $target, $message) { // split message $messageEx = explode(' ', $message); if ($target[0] != '#') { $target = $messageEx[1]; unset($messageEx[1]); $messageEx = array_values($messageEx); } $access = $this->bot->getAccess($target, Services::getUserManager()->getUser($user->getUuid())->accountname); if ($access < $this->bot->getNeededAccess($target, 'access')) { return $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.permissionDenied')); } if (count($messageEx) == 3) { if ($messageEx[2] >= $access) { return $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.' . $this->originalName . '.tooHigh')); } else { if ($messageEx[2] > 500) { return $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.' . $this->originalName . '.tooHigh')); } } if ($access <= $this->bot->getAccess($target, Services::getUserManager()->getUserByNick($messageEx[1])->accountname)) { return $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.permissionDenied')); } $authServ = Services::getModuleManager()->lookupModule('AuthServ'); $userID = call_user_func(array($authServ, 'getUserID'), $messageEx[1]); if (!$userID) { return $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.invalidUser')); } if ($messageEx[0] < 1) { $sql = "DELETE FROM chanserv_channels_to_users WHERE channel = '" . escapeString($target) . "' AND userID = " . $userID; } else { $sql = "INSERT INTO chanserv_channels_to_users (channel, userID, accessLevel)\n\t\t\t\t\tVALUES ('" . escapeString($target) . "', " . $userID . ", " . intval($messageEx[2]) . ")\n\t\t\t\t\tON DUPLICATE KEY UPDATE accessLevel = VALUES(accessLevel)"; } Services::getDB()->sendQuery($sql); $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.' . $this->originalName . '.success')); } else { $this->bot->sendMessage($user->getUuid(), Services::getLanguage()->get($user->languageID, 'command.' . $this->originalName . '.syntaxHint')); } }
/** * Handles the PRIVMSG command * * @param string $input * @param array<string> $inputEx * @return void */ public static function PRIVMSG($input, $inputEx) { if ($inputEx[2][0] != '$') { // get source $source = Services::getUserManager()->getUser($inputEx[0]); if ($inputEx[2][0] == '#' and $source !== null) { // send debug message if (defined('DEBUG')) { Services::getConnection()->getProtocol()->sendLogLine($source->getUuid() . " (" . $source->getNick() . ") sent a message to " . $inputEx[2]); } // notify module manager Services::getModuleManager()->handleLine($source, $inputEx[2], substr($input, stripos($input, ':') + 1)); } elseif ($source) { // kick numeric $inputEx[2] = substr($inputEx[2], strlen(Services::getConnection()->getProtocol()->numeric)); // send debug message if (defined('DEBUG')) { Services::getConnection()->getProtocol()->sendLogLine($source->getUuid() . " (" . $source->getNick() . ") sent a message to " . $inputEx[2]); } // try to find bot if (($bot = Services::getBotManager()->getUser($inputEx[2])) !== null) { // resolved uuid ... send debug message if (defined('DEBUG')) { Services::getConnection()->getProtocol()->sendLogLine("Resolved " . $inputEx[2] . " to " . $bot->getNick()); } // notify module manager Services::getModuleManager()->handleLine($source, $inputEx[2], substr($input, stripos($input, ':') + 1)); } else { // cannot find user ... send debug message if (defined('DEBUG')) { Services::getConnection()->getProtocol()->sendLogLine("Cannot resolve '" . $inputEx[2] . "'! Type of return value: " . gettype($bot)); } } } else { Services::getConnection()->getProtocol()->sendLogLine("Received invalid UUID '" . $inputEx[0] . "'! Maybe choosen wrong IRCd?"); } } }
/** * Registers the channel with chanserv * * @param string $channel * @param string $accountname * @return void */ public function register($channel, $accountname) { $authServ = Services::getModuleManager()->lookupModule('AuthServ'); $userID = call_user_func(array($authServ, 'getUserID'), $accountname); $sql = "INSERT INTO chanserv_channels (channel, modes, time, registrar, unregistercode) VALUES ('" . escapeString($channel) . "', '+tnr', " . time() . ", " . $userID . ", '" . StringUtil::getRandomID() . "')"; Services::getDB()->sendQuery($sql); $sql = "INSERT INTO chanserv_channels_to_users (channel, userID, accessLevel) VALUES ('" . escapeString($channel) . "', " . $userID . ", 500)"; Services::getDB()->sendQuery($sql); $values = ''; $sql = "SELECT\r\n\t\t\t\t*\r\n\t\t\tFROM\r\n\t\t\t\tchanserv_default_accessLevel"; $result = Services::getDB()->sendQuery($sql); while ($row = Services::getDB()->fetchArray($result)) { if ($values != '') { $values .= ','; } $values .= "('" . escapeString($channel) . "', '" . $row['function'] . "', " . $row['accessLevel'] . ")"; } $sql = "INSERT INTO chanserv_channel_accessLevel (channel, function, accessLevel) VALUES " . $values; Services::getDB()->sendQuery($sql); // join the channel $this->join($channel); // set modes $this->setStandardModes($channel, '+tnr'); }
/** * Checks for needed permissions and returns true if correct permissions are set * * @param UserType $user * @param integer $neededPermissions * @return boolean */ public function getPermissions(UserType $user, $neededPermissions) { // when 0 always is okay if ($neededPermissions == 0) { return true; } // handle empty account names //if ($user->accountname === null or $user->accountname != '') return false; // check for correct level if (call_user_func(array(Services::getModuleManager()->lookupModule('AuthServ'), 'getAccessLevel'), $user->accountname) >= $neededPermissions) { return true; } return false; }