datingvip / irc
v0.2.0
2014-06-11 13:24 UTC
Requires
- php: >=5.0.0
- ext-pthreads: >=2.0.0
This package is auto-updated.
Last update: 2024-09-05 18:15:54 UTC
README
为小猫和PHP程序员准备的IRC...
我们将有一些基于IRC的协作工具(来自20世纪90年代后期),我们需要一个机器人。
这个仓库包含一个多线程PHP IRC机器人...因为显然我又回到了15岁...
代码
U can haz codez...
<?php require_once("vendor/autoload.php"); use DatingVIP\IRC\Connection; use DatingVIP\IRC\Listener; use DatingVIP\IRC\Logger; use DatingVIP\IRC\Message; use DatingVIP\IRC\Task; use DatingVIP\IRC\Robot; class Log implements Logger { public function onSend($line) { printf("> %s\n", $line); } public function onReceive($line) { printf("< %s\n", $line); } } class Repeat extends Task { public function __construct(Connection $irc, Message $msg) { $this->irc = $irc; $this->msg = $msg; } public function __invoke() { /* we can do whatever we want here: search docs, take as long as we want/need */ $this->irc->msg( $this->msg->getNick(), $this->msg->getText()); $this->irc->msg( $this->msg->getChannel(), sprintf( "%s said \"%s\" to %s", __CLASS__, $this->msg->getText(), $this->msg->getNick())); } protected $irc; protected $msg; } class Listen implements Listener { public function __construct($nick) { $this->nick = $nick; } public function onReceive(Connection $irc, Message $msg) { if ($msg->getType() == "PRIVMSG" && $msg->getNick() == $this->nick) { /* returning a Task object threads the work */ return new Repeat($irc, $msg); } } protected $nick; } set_time_limit(0); /* open connection to server */ $connection = new Connection("irc.efnet.org", 6667); /* make sure we see all input/output */ $connection->setLogger(new Log()); /* create robot with default pool */ $robot = new Robot($connection, new Pool(4)); /* add listeners */ $robot->addListener( new Listen("test-user2")); /* login, join channels and enter main loop */ $robot->login("bot") ->join("#devs") ->loop(); ?>
上面的示例代码展示了如何使用Listener和Task接口异步响应特定消息。
此外,这个包包含一个用于机器人的Manager接口,由机器人在执行过程中同步执行,它允许程序员在与机器人相同的上下文中执行必要的行政任务。
<?php require_once("vendor/autoload.php"); use DatingVIP\IRC\Connection; use DatingVIP\IRC\Listener; use DatingVIP\IRC\Logger; use DatingVIP\IRC\Message; use DatingVIP\IRC\Task; use DatingVIP\IRC\Robot; use DatingVIP\IRC\Manager; /* ... */ class Manage implements Manager { public function onStartup(Robot $robot) { printf("startup\n"); } public function onJoin (Robot $robot, Message $message) {} public function onNick (Robot $robot, Message $message) {} public function onPart (Robot $robot, Message $message) {} public function onPriv (Robot $robot, Message $message) {} public function onShutdown(Robot $robot) { printf("shutdown\n"); } } set_time_limit(0); /* open connection to server */ $connection = new Connection ("irc.datingvip.com", 9867, true); /* make sure we see all input/output */ $connection->setLogger(new Log()); /* create robot with default pool */ $robot = new Robot($connection, new Pool(4), new Manage()); /* add listeners */ $robot->addListener( new Listen("krakjoe")); /* login, join channels and enter main loop */ $robot->login("bot") ->join("#devs") ->loop(); ?>
上面的代码展示了如何同时使用Listener和Manager功能。