From: pk910 Date: Wed, 27 Jul 2011 11:05:48 +0000 (+0200) Subject: added bind and unbind functions & added the simple ExampleBot. (doesn't run right... X-Git-Url: http://git.pk910.de/?p=PHP-P10.git;a=commitdiff_plain;h=cacbfd68b7a6d983e55742ea16cd7be101ab05f0 added bind and unbind functions & added the simple ExampleBot. (doesn't run right now) --- diff --git a/Bots/ExampleBot.class.php b/Bots/ExampleBot.class.php new file mode 100644 index 0000000..b9f685d --- /dev/null +++ b/Bots/ExampleBot.class.php @@ -0,0 +1,101 @@ +uplink = $uplink; //Reference to the P10 Uplink + + //$old is only set, if the module is rehashed. It contains the return value of unload(); + + if(!$old) { + + //Here you can define startup actions + //We'll add an user to the Server + // newuser($localid,$nick,$ident,$host,$realname,$uptime,$modes) returns an array with the result + // $localid is just an id you can set (whatever you want) - maybe you'll use it to identify the bot/user later? + + $nick = "ExampleBot"; // Please note: If this user already exists on another Server it will be killed! + $ident = "Example"; + $host = "Example.Bot"; + $realname = "Thats an example Bot :)"; + $modes = "i"; //we don't need a leading + (that will be added automatically) + + $this->example_bot = $this->uplink->addUser($nick,$ident,$host,$realname,$uptime,$modes); //addUser($nick, $ident, $host, $ip, $modes, $realname) + if(is_a($this->example_bot, "P10_User")) { // A new user was created :) + //ok let's join a channel + $this->uplink->join($this->example_bot, "#test"); + //now we want to say something... + //but note: thats the startup procedure! the p10 server is not connected to an uplink, yet - so noone would recive our message (only the other bots on this server) + } + } else { + $this->example_bot = $old; //We've saved out Bot reference in $old so we can simply use it again... + } + + //OK send something to the Server is easy... + //How to recive something from the IRC Server? + + //I've copied the eggdrop way to do that - bind + ModCMD::bind($this, BIND_PRIVMSG, "recive_privmsg"); + ModCMD::bind($this, BIND_QUIT, "recive_quit"); + } + + public function loop() { //this function is triggered as often as possible (at least one time per second!). Maybe you need it to do timed events + //please don't trigger any blocking functions here... that would cause an extreme lagg! + } + + public function recive_privmsg($user, $channel, $message) { + //We've got a privmsg... + $exp=explode(" ",$message); + if($exp[0] == "hi") { + $this->uplink->privmsg($this->example_bot, $channel, "Hallo ".$user->getNick()); // We send a message back - documentation is following + } + if($exp[0] == "-users") { + $user_str = ""; + foreach($channel->getUsers() as $chan_user) { + $extra=""; + $privs = $channel->getUserPrivs($chan_user); + if(($privs & P10_Channel::USERPRIV_VOICE)) $extra= '+'; + if(($privs & P10_Channel::USERPRIV_OPED)) $extra= '@'; + $user_str .= " " . $extra . $chan_user->getNick(); + } + $this->uplink->notice($this->example_bot, $user, "User in ".$channel->getName().":".$user_str); + } + } + + function recive_quit($user, $reason) { + if($user === $this->example_bot) { //maybe we got killed??? + $this->load($this->uplink); + } + } + +} + +?> \ No newline at end of file diff --git a/ModCMD/Binding.class.php b/ModCMD/Binding.class.php index dfb247f..143b35e 100644 --- a/ModCMD/Binding.class.php +++ b/ModCMD/Binding.class.php @@ -30,9 +30,20 @@ */ class Binding { + private $bot; + private $method; - public function trigger() { - + public function __construct($bot, $method) { + $this->bot = $bot; + $this->method = $method; + } + + public function trigger($params) { + call_user_func_array(array($this->bot, $this->method), $params); + } + + public function match($bot, $method) { + return ($bot === $this->bot && strtolower($this->method) == strtolower($method)); } } diff --git a/ModCMD/ModCMD.class.php b/ModCMD/ModCMD.class.php index cbd6511..6c735a6 100644 --- a/ModCMD/ModCMD.class.php +++ b/ModCMD/ModCMD.class.php @@ -60,6 +60,44 @@ class ModCMD implements EventHandler { return self::$eventHandler; } + public static function bind($bot, $type, $method) { + if(is_a($bot, "Bot") && method_exists($bot, $method)) { + if(array_key_exists($type, self::$bindings)) { + foreach(self::$bindings[$type] as $binding) { + if($binding->match($bot, $method)) + return; + } + } else + self::$bindings[$type] = array(); + self::$bindings[$type][] = new Binding($bot, $method); + } + } + + public static function unbind($bot, $type, $method) { + if(is_a($bot, "Bot")) { + if(array_key_exists($type, self::$bindings)) { + foreach(self::$bindings[$type] as $id => $binding) { + if($binding->match($bot, $method)) { + unset(self::$bindings[$type][$id]); + break; + } + } + } + } + } + + public static function unbindBot($bot) { + if(is_a($bot, "Bot")) { + foreach(self::$bindings as $type => $bindings) { + foreach($bindings as $id => $binding) { + if($binding->match($bot, null)) { + unset(self::$bindings[$type][$id]); + } + } + } + } + } + /******************************************************************************************** * EVENT HANDLER * ********************************************************************************************/ @@ -85,7 +123,7 @@ class ModCMD implements EventHandler { private function event($type, $parameters) { if(array_key_exists($type, self::$bindings)) { foreach(self::$bindings as $binding) { - $binding->trigger(); + $binding->trigger($parameters); } } } diff --git a/Uplink/Uplink.class.php b/Uplink/Uplink.class.php index 7f0e0af..037d463 100644 --- a/Uplink/Uplink.class.php +++ b/Uplink/Uplink.class.php @@ -605,10 +605,10 @@ class Uplink { $cmodes = $channel->getModes(); $privs = $channel->getUserPrivs($user); if($cmodes->hasMode("s") && !$fromUser->isOnChannel($channel) && $from != $user->getNumeric()) continue; - if($cmodes->hasMode("u") && ($privs & (P10_Channel::USERPRIV_OPPED | P10_Channel::USERPRIV_VOICE)) == 0 && $from != $user->getNumeric()) continue; + if($cmodes->hasMode("u") && ($privs & (P10_Channel::USERPRIV_OPED | P10_Channel::USERPRIV_VOICE)) == 0 && $from != $user->getNumeric()) continue; $chanstr = ($channels == "" ? "" : " "); $prefix = ""; - if(($privs & P10_Channel::USERPRIV_OPPED)) { + if(($privs & P10_Channel::USERPRIV_OPED)) { $prefix = "@"; } else if(($privs & P10_Channel::USERPRIV_VOICE)) { $prefix = "+";