summaryrefslogtreecommitdiff
path: root/plugins/Irc/ircmanager.php
blob: 6a86e34fd3a20f49d7f8474600df2edcf588e981 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<?php
/*
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2008, 2009, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }

/**
 * IRC background connection manager for IRC-using queue handlers,
 * allowing them to send outgoing messages on the right connection.
 *
 * Input is handled during socket select loop, keepalive pings during idle.
 * Any incoming messages will be handled.
 *
 * In a multi-site queuedaemon.php run, one connection will be instantiated
 * for each site being handled by the current process that has IRC enabled.
 */

class IrcManager extends ImManager {

    public $conn = null;
    /**
     * Initialize connection to server.
     * @return boolean true on success
     */
    public function start($master) {
        if (parent::start($master)) {
            $this->connect();
            return true;
        } else {
            return false;
        }
    }

    public function getSockets() {
        $this->connect();
        if ($this->conn) {
            return array($this->conn->myConnection);
        } else {
            return array();
        }
    }

    /**
     * Process IRC events that have come in over the wire.
     * @param resource $socket
     */
    public function handleInput($socket) {
        common_log(LOG_DEBUG, "Servicing the IRC queue.");
        $this->stats('irc_process');
        $this->conn->receive();
    }

    function connect() {
        if (!$this->conn) {
            $this->conn = new Phergie_Bot;

            $password = isset($this->plugin->password) ? $this->plugin->password : NULL;
            $transport = isset($this->plugin->transport) ? $this->plugin->transport : 'tcp';
            $encoding = isset($this->plugin->encoding) ? $this->plugin->encoding : 'ISO-8859-1';

            $config = new Phergie_Extended_Config;
            $config->readArray(
                array(
                    // One array per connection, pretty self-explanatory
                    'connections' => array(
                        // Ex: All connection info for the Freenode network
                        array(
                            'host' => $this->plugin->host,
                            'port' => $this->plugin->port,
                            'username' => $this->plugin->username,
                            'realname' => $this->plugin->realname,
                            'nick' => $this->plugin->nickname,
                            'password' => $password,
                            'transport' => $transport,
                            'encoding' => $encoding
                        )
                    ),

                    'processor' => 'async',
                    'processor.options' => array('usec' => 200000),
                    // Time zone. See: http://www.php.net/manual/en/timezones.php
                    'timezone' => 'UTC',

    // Whitelist of plugins to load
    'plugins' => array(
        // To enable a plugin, simply add a string to this array containing
        // the short name of the plugin as shown below.

        // 'ShortPluginName',

        // Below is an example of enabling the AutoJoin plugin, for which
        // the corresponding PEAR package is Phergie_Plugin_AutoJoin. This
        // plugin allows you to set a list of channels in this configuration
        // file that the bot will automatically join when it connects to a
        // server. If you'd like to enable this plugin, simply install it,
        // uncomment the line below, and set a value for the setting
        // autojoin.channels (examples for which are located further down in
        // this file).

        // 'AutoJoin',

        // A few other recommended plugins:

        // Servers randomly send PING events to clients to ensure that
        // they're still connected and will eventually terminate the

        // connection if a PONG response is not received. The Pong plugin
        // handles sending these responses.

        // 'Pong',

        // It's sometimes difficult to distinguish between a lack of
        // activity on a server and the client not receiving data even
        // though a connection remains open. The Ping plugin performs a self
        // CTCP PING sporadically to ensure that its connection is still
        // functioning and, if not, terminates the bot.

        // 'Ping',

        // Sometimes it's desirable to have the bot disconnect gracefully
        // when issued a command to do so via a PRIVMSG event. The Quit
        // plugin implements this using the Command plugin to intercept the
        // command.

        // 'Quit',
    ),

    // If set to true, this allows any plugin dependencies for plugins
    // listed in the 'plugins' option to be loaded even if they are not
    // explicitly included in that list
    'plugins.autoload' => true,

    // Enables shell output describing bot events via Phergie_Ui_Console
    'ui.enabled' => true,

    // Examples of supported values for autojoins.channel:
    // 'autojoin.channels' => '#channel1,#channel2',
    // 'autojoin.channels' => array('#channel1', '#channel2'),
    // 'autojoin.channels' => array(
    //                            'host1' => '#channel1,#channel2',
    //                            'host2' => array('#channel3', '#channel4')
    //                        ),

    // Examples of setting values for Ping plugin settings

    // This is the amount of time in seconds that the Ping plugin will wait
    // to receive an event from the server before it initiates a self-ping

    // 'ping.event' => 300, // 5 minutes

    // This is the amount of time in seconds that the Ping plugin will wait
    // following a self-ping attempt before it assumes that a response will
    // never be received and terminates the connection

    // 'ping.ping' => 10, // 10 seconds

));
            $this->conn=new Aim($this->plugin->user,$this->plugin->password,4);
            $this->conn->registerHandler("IMIn",array($this,"handle_aim_message"));
            $this->conn->myServer="toc.oscar.aol.com";
            $this->conn->signon();
            $this->conn->setProfile(_m('Send me a message to post a notice'), false);
        }
        return $this->conn;
    }

    function handle_irc_message($data) {
        $this->plugin->enqueue_incoming_raw($data);
        return true;
    }

    function send_raw_message($data) {
        $this->connect();
        if (!$this->conn) {
            return false;
        }
        $this->conn->sflapSend($data[0],$data[1],$data[2],$data[3]);
        return true;
    }
}