X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=Bots%2FPulseBot.class.php;fp=Bots%2FPulseBot.class.php;h=997513a94c837200d7a6164330601d7674b83b04;hb=ddffd103502359153b425495e8834ebcb1e157f0;hp=0000000000000000000000000000000000000000;hpb=e85b90fef00e8f323dd56cf215e2e5f5572b14bb;p=PHP-P10.git diff --git a/Bots/PulseBot.class.php b/Bots/PulseBot.class.php new file mode 100644 index 0000000..997513a --- /dev/null +++ b/Bots/PulseBot.class.php @@ -0,0 +1,272 @@ +. * + * * + ************************************************************************ + * + * Bots/PulseBot.class.php + * + * WhatPulse bot... + * + */ + +class {$_NAME} extends Bot { + private $uplink; + private $pulsebot; + private $cache = array(); + private $db = array(); + + const TEAM_ID = 19418; + + public function load($uplink, $old = false) { + $this->uplink = $uplink; + if(!$old) { + $nick = "PulseBot"; + $ident = "pulsebot"; + $ip = "0::0"; + $host = "Services.WebGamesNet.net"; + $realname = "WhatPulse Contest Bot (join us on #WhatPulse)"; + $modes = "ioknISDrf WhatPulse WhatPulse.bot.WebGamesNet"; + $this->pulsebot = $this->uplink->addUser($nick,$ident,$host,$ip,$modes,$realname); + if(is_a($this->pulsebot, "P10_User")) { + $this->uplink->join($this->pulsebot, "#WhatPulse", (P10_Channel::USERPRIV_OPED | P10_Channel::USERPRIV_VOICE)); + $this->uplink->join($this->pulsebot, "#dev", P10_Channel::USERPRIV_VOICE); + } + } else { + $this->pulsebot = $old; + } + BotLoader::registerDB($this, "PulseBot"); + ModCMD::bind($this, BIND_CHANMSG, "recive_privmsg"); + ModCMD::bind($this, BIND_JOIN, "recive_join"); + ModCMD::bind($this, BIND_QUIT, "recive_quit"); + } + + public function unload($rehash = false) { + if($rehash) { + return $this->pulsebot; + } else { + $this->uplink->delUser($this->pulsebot, "Bye."); + } + } + + public function readDB($db) { + $this->db = $db; + } + + public function writeDB() { + return $this->db; + } + + private function getStats() { + if(array_key_exists("stats", $this->cache) && time() - $this->cache['stats_time'] < 300) { + //use cached stats + $stats = $this->cache["stats"]; + } else { + $xmlstr = file_get_contents("http://whatpulse.org/api/team.php?TeamID=".self::TEAM_ID); + $stats = new SimpleXMLElement($xmlstr); + $this->cache["stats"] = $stats; + $this->cache["stats_time"] = time(); + } + return $stats; + } + + private function getUserStats($name) { + if(array_key_exists("ustats_".strtolower($name), $this->cache) && time() - $this->cache['ustats_'.strtolower($name).'_time'] < 300) { + //use cached stats + $ustats = $this->cache["ustats_".strtolower($name)]; + return $ustats; + } + $stats = $this->getStats(); + $users = $stats->TeamStats->Members; + foreach ($users as $user) { + if(strtolower($user->MemberName) == strtolower($name)) { + $xmlstr = file_get_contents("http://whatpulse.org/api/user.php?UserID=".$user->MemberUserID); + $ustats = new SimpleXMLElement($xmlstr); + $this->cache["ustats_".strtolower($name)] = $stats; + $this->cache["ustats_".strtolower($name)."_time"] = time(); + return $ustats; + } + } + return null; + } + + private function botOppedOnChannel($channel) { + $privs = $channel->getUserPrivs($this->pulsebot); + return ($privs & P10_Channel::USERPRIV_OPED); + } + + function recive_privmsg($user, $channel, $message) { + if(!$this->botOppedOnChannel()) return; + $privs = $PHPChannel->getUserPrivs($user); + $op = ($user->getModes()->hasMode('o') || ($privs & P10_Channel::USERPRIV_OPED)); + $exp = explode(" ", $message); + switch(strtolower($exp[0])) { + case ".adduser": + if(!$op) break; + if(count($exp) < 3) { + $this->uplink->notice($this->pulsebot, $user, "usage: .adduser "); + } else { + $pulseUserName = $exp[1]; + $stats = $this->getStats(); + $pulseUser = null; + $users = $stats->TeamStats->Members; + foreach ($users as $puser) { + if(strtolower($puser->MemberName) == strtolower($pulseUserName)) { + $pulseUser = $puser; + break; + } + } + if($pulseUser == null) { + $this->uplink->notice($this->pulsebot, $user, "WhatPulse user '".$pulseUserName."' is unknown or is not in Team '".$stats->TeamStats->Statistics->TeamName."'."); + break; + } + if($exp[2][0] == "*") { + $auth = substr($exp[2], 1); + } else { + $IRCUser = P10_User::getUserByNick($exp[2]); + if($IRCUser == null || !($auth = $IRCUser->getModes()->hasMode('r'))) { + $this->uplink->notice($this->pulsebot, $user, "IRC User user '".$pulseUserName."' is unknown or is not authed."); + break; + } + } + if(!array_key_exists("users", $this->db)) { + $this->db['users'] = array(); + } + $this->db['users'][$auth] = $pulseUser->MemberName; + $this->uplink->notice($this->pulsebot, $user, "WhatPulse user '".$pulseUserName."' added (Keys: ".$pulseUser->MemberKeys.", Clicks: ".$pulseUser->MemberClicks.")."); + } + break; + case ".deluser": + if(!$op) break; + if(!array_key_exists("users", $this->db)) { + $this->db['users'] = array(); + } + $f = false; + foreach($this->db['users'] as $ircUser => $pulseUser) { + if(strtolower($pulseUser) == strtolower($exp[1])) { + unset($this->db['users'][strtolower($exp[1])]); + $this->uplink->notice($this->pulsebot, $user, "WhatPulse user '".$exp[1]."' deleted."); + $f = true; + break; + } + } + if(!$f) + $this->uplink->notice($this->pulsebot, $user, "WhatPulse user '".$exp[1]."' is not added."); + break; + case ".users": + $table = new Table(5); + $table->add("User", "Keys", "Clicks", "Miles", "IRC"); + $stats = $this->getStats(); + $users = $stats->TeamStats->Members; + if(!array_key_exists("users", $this->db)) { + $this->db['users'] = array(); + } + foreach ($users as $puser) { + $ircUserName = "-"; + foreach($this->db['users'] as $ircUser => $pulseUser) { + if(strtolower($pulseUser) == strtolower($puser->MemberName)) { + $ircUserName = $ircUser; + break; + } + } + $table->add($puser->MemberName, $puser->MemberKeys, $puser->MemberClicks, $puser->MemberMiles, $ircUserName); + } + $lines = $table->end(); + foreach($lines as $line) { + if(count($exp) > 1) + $this->uplink->privmsg($this->pulsebot, $channel, $line); + else + $this->uplink->notice($this->pulsebot, $user, $line); + } + break; + case ".mypulse": + if(!($auth = $user->getModes()->hasMode('r'))) { + $this->uplink->notice($this->pulsebot, $user, "You are not authed with AuthServ."); + break; + } + $pulseUserName = false; + foreach($this->db['users'] as $ircUser => $pulseUser) { + if(strtolower($ircUser) == strtolower($auth)) { + $pulseUserName = $pulseUser; + break; + } + } + $pulseUser = null; + if($pulseUserName) { + $stats = $this->getStats(); + $users = $stats->TeamStats->Members; + foreach ($users as $puser) { + if(strtolower($puser->MemberName) == strtolower($pulseUserName)) { + $pulseUser = $puser; + break; + } + } + } + if(!$pulseUser) { + $this->uplink->notice($this->pulsebot, $user, "There is no WhatPulse User connected with your AuthServ Username. If you have a WhatPulse Account, please ask an Op to do add you to the list."); + break; + } + $ustats = $this->getUserStats($pulseUser->MemberName); + $message = "User \002".$pulseUser->MemberName."\002 has \002".$pulseUser->MemberKeys."\002 keys (".$ustats->AvKPS." per second), \002".$pulseUser->MemberClicks."\002 clicks (".$ustats->AvCPS." per second) and ".$pulseUser->MemberMiles." miles.\n"; + $message .= "Last Pulse: ".$ustats->LastPulse; + if(count($exp) > 1) { + foreach($message as $line) { + $this->uplink->privmsg($this->pulsebot, $channel, $line); + } + } else { + foreach($message as $line) { + $this->uplink->notice($this->pulsebot, $user, $line); + } + } + break; + } + } + + public function recive_join($user, $channel, $isBurst) { + if(!$this->botOppedOnChannel($channel)) return false; + if(!($auth = $user->getModes()->hasMode('r'))) return; + $pulseUserName = false; + foreach($this->db['users'] as $ircUser => $pulseUser) { + if(strtolower($ircUser) == strtolower($auth)) { + $pulseUserName = $pulseUser; + break; + } + } + $pulseUser = null; + if($pulseUserName) { + $stats = $this->getStats(); + $users = $stats->TeamStats->Members; + foreach ($users as $puser) { + if(strtolower($puser->MemberName) == strtolower($pulseUserName)) { + $pulseUser = $puser; + break; + } + } + } + if($pulseUser) { + $this->uplink->mode($this->pulsebot, $channel, "+v ".$user->getNumeric()); + $this->uplink->privmsg($this->pulsebot, $channel, "WhatPulse User \002".$pulseUser->MemberName."\002 (\002".$pulseUser->MemberKeys."\002 keys and \002".$pulseUser->MemberClicks."\002 clicks) has joined the channel."); + } + } + + public function recive_quit($user, $reason) { + if($user === $this->pulsebot) { + $this->load($this->uplink); + } + } +} + +?> \ No newline at end of file