+<?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