added PulseBot
[PHP-P10.git] / Bots / PulseBot.class.php
diff --git a/Bots/PulseBot.class.php b/Bots/PulseBot.class.php
new file mode 100644 (file)
index 0000000..997513a
--- /dev/null
@@ -0,0 +1,272 @@
+<?php
+/******************************* PHP-P10 v2 *****************************
+ * Copyright (C) 2011  Philipp Kreil (pk910)                            *
+ *                                                                      *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or    *
+ * (at your option) any later version.                                  *
+ *                                                                      * 
+ * This program is distributed in the hope that it will be useful,      *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
+ * GNU General Public License for more details.                         *
+ *                                                                      *
+ * You should have received a copy of the GNU General Public License    *
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. *
+ *                                                                      *
+ ************************************************************************
+ * 
+ *  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 <WhatPulseUser> <IRCUser/*IRCAuth>");
+                               } 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