]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/Irc/extlib/phergie/Phergie/Plugin/Statusnet.php
Merge branch '0.9.x' into 1.0.x
[quix0rs-gnu-social.git] / plugins / Irc / extlib / phergie / Phergie / Plugin / Statusnet.php
1 <?php\r
2 /**\r
3  * StatusNet - the distributed open-source microblogging tool\r
4  *\r
5  * This program is free software: you can redistribute it and/or modify\r
6  * it under the terms of the GNU Affero General Public License as published by\r
7  * the Free Software Foundation, either version 3 of the License, or\r
8  * (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU Affero General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU Affero General Public License\r
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
17  *\r
18  * Talks to the Statusnet IM architecture to enqueue incoming message messages\r
19  * and notify result of nickname registration checks\r
20  *\r
21  * @category  Phergie\r
22  * @package   Phergie_Plugin_Statusnet\r
23  * @author    Luke Fitzgerald <lw.fitzgerald@googlemail.com>\r
24  * @copyright 2010 StatusNet, Inc.\r
25  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0\r
26  * @link      http://status.net/\r
27  */\r
28 \r
29 class Phergie_Plugin_Statusnet extends Phergie_Plugin_Abstract {\r
30     /**\r
31     * Message callback details\r
32     *\r
33     * @var array\r
34     */\r
35     protected $messageCallback;\r
36 \r
37     /**\r
38     * Registration check callback details\r
39     *\r
40     * @var array\r
41     */\r
42     protected $regCallback;\r
43 \r
44     /**\r
45     * Connection established callback details\r
46     *\r
47     * @var array\r
48     */\r
49     protected $connectedCallback;\r
50 \r
51     /**\r
52     * Load callback from config\r
53     */\r
54     public function onLoad() {\r
55         $messageCallback = $this->config['statusnet.messagecallback'];\r
56         if (is_callable($messageCallback)) {\r
57             $this->messageCallback = $messageCallback;\r
58         } else {\r
59             $this->messageCallback = NULL;\r
60         }\r
61 \r
62         $regCallback = $this->config['statusnet.regcallback'];\r
63         if (is_callable($regCallback)) {\r
64             $this->regCallback = $regCallback;\r
65         } else {\r
66             $this->regCallback = NULL;\r
67         }\r
68 \r
69         $connectedCallback = $this->config['statusnet.connectedcallback'];\r
70         if (is_callable($connectedCallback)) {\r
71             $this->connectedCallback = $connectedCallback;\r
72         } else {\r
73             $this->connectedCallback = NULL;\r
74         }\r
75 \r
76         $this->unregRegexp = $this->getConfig('statusnet.unregregexp', '/\x02(.*?)\x02 (?:isn\'t|is not) registered/i');\r
77         $this->regRegexp = $this->getConfig('statusnet.regregexp', '/(?:\A|\x02)(\w+?)\x02? (?:\(account|is \w+?\z)/i');\r
78     }\r
79 \r
80     /**\r
81      * Passes incoming messages to StatusNet\r
82      *\r
83      * @return void\r
84      */\r
85     public function onPrivmsg() {\r
86         if ($this->messageCallback !== NULL) {\r
87             $event = $this->getEvent();\r
88             $source = $event->getSource();\r
89             $sender = $event->getNick();\r
90             $message = trim($event->getText());\r
91 \r
92             if (strpos($source, '#') === 0) {\r
93                 $botNick = $this->getConnection()->getNick();\r
94                 $nickPos = strpos($message, $botNick);\r
95                 $nickLen = strlen($botNick);\r
96                 $colonPos = strpos($message, ':', $nickLen);\r
97                 $commandStr = trim(substr($message, $colonPos+1));\r
98                 if ($nickPos === 0 && $colonPos == $nickLen && !empty($commandStr)) {\r
99                     call_user_func($this->messageCallback, array('source' => $source, 'sender' => $sender, 'message' => $commandStr));\r
100                 }\r
101             } else {\r
102                 call_user_func($this->messageCallback, array('source' => $source, 'sender' => $sender, 'message' => $message));\r
103             }\r
104         }\r
105     }\r
106 \r
107     /**\r
108      * Catches the response from NickServ\r
109      *\r
110      * @return void\r
111      */\r
112     public function onNotice() {\r
113         if ($this->regCallback !== NULL) {\r
114             $event = $this->getEvent();\r
115             if ($event->getNick() == 'NickServ') {\r
116                 $message = $event->getArgument(1);\r
117                 if (preg_match($this->unregRegexp, $message, $groups)) {\r
118                     $screenname = $groups[1];\r
119                     call_user_func($this->regCallback, array('screenname' => $screenname, 'registered' => false));\r
120                 } elseif (preg_match($this->regRegexp, $message, $groups)) {\r
121                     $screenname = $groups[1];\r
122                     call_user_func($this->regCallback, array('screenname' => $screenname, 'registered' => true));\r
123                 }\r
124             }\r
125         }\r
126     }\r
127 \r
128     /**\r
129      * Intercepts the end of the "message of the day" response and tells\r
130      * StatusNet we're connected\r
131      *\r
132      * @return void\r
133      */\r
134     public function onResponse() {\r
135         switch ($this->getEvent()->getCode()) {\r
136         case Phergie_Event_Response::RPL_ENDOFMOTD:\r
137         case Phergie_Event_Response::ERR_NOMOTD:\r
138             if ($this->connectedCallback !== NULL) {\r
139                 call_user_func($this->connectedCallback);\r
140             }\r
141         }\r
142     }\r
143 }\r