Commit | Line | Data |
---|---|---|
b09157de JA |
1 | var util = require('util'), |
2 | events = require('events'), | |
3 | _ = require('lodash'), | |
4 | IrcConnection = require('./connection.js').IrcConnection; | |
76ff1063 JA |
5 | |
6 | var State = function (client, save_state) { | |
6b8fa7a6 D |
7 | var that = this; |
8 | ||
76ff1063 JA |
9 | events.EventEmitter.call(this); |
10 | this.client = client; | |
11 | this.save_state = save_state || false; | |
12 | ||
13 | this.irc_connections = []; | |
14 | this.next_connection = 0; | |
15 | ||
5befab98 | 16 | this.client.on('dispose', function () { |
6b8fa7a6 D |
17 | if (!that.save_state) { |
18 | _.each(that.irc_connections, function (irc_connection, i, cons) { | |
76ff1063 JA |
19 | if (irc_connection) { |
20 | irc_connection.end('QUIT :' + (global.config.quit_message || '')); | |
21 | irc_connection.dispose(); | |
8838bdd6 | 22 | global.servers.removeConnection(irc_connection); |
76ff1063 JA |
23 | cons[i] = null; |
24 | } | |
25 | }); | |
26 | ||
6b8fa7a6 | 27 | that.dispose(); |
76ff1063 JA |
28 | } |
29 | }); | |
30 | }; | |
31 | ||
32 | util.inherits(State, events.EventEmitter); | |
33 | ||
34 | module.exports = State; | |
35 | ||
36 | State.prototype.connect = function (hostname, port, ssl, nick, user, pass, callback) { | |
37 | var that = this; | |
38 | var con, con_num; | |
39 | if (global.config.restrict_server) { | |
40 | con = new IrcConnection( | |
41 | global.config.restrict_server, | |
42 | global.config.restrict_server_port, | |
43 | global.config.restrict_server_ssl, | |
b09157de | 44 | nick, |
5b5275af | 45 | user, |
b09157de JA |
46 | global.config.restrict_server_password, |
47 | this); | |
76ff1063 JA |
48 | |
49 | } else { | |
8838bdd6 JA |
50 | if ((global.config.max_server_conns > 0) && (!(global.config.webirc_pass && global.config.webirc_passs[hostname]))) { |
51 | if (global.servers.numOnHost(hostname) >= global.config.max_server_conns) { | |
52 | return callback('Too many connections to host', {host: hostname, limit: global.config.max_server_conns}); | |
53 | } | |
54 | } | |
76ff1063 | 55 | con = new IrcConnection( |
b09157de JA |
56 | hostname, |
57 | port, | |
58 | ssl, | |
59 | nick, | |
5b5275af | 60 | user, |
b09157de JA |
61 | pass, |
62 | this); | |
76ff1063 JA |
63 | } |
64 | ||
65 | con_num = this.next_connection++; | |
66 | this.irc_connections[con_num] = con; | |
67 | con.con_num = con_num; | |
68 | ||
69 | new IrcCommands(con, con_num, this).bindEvents(); | |
70 | ||
71 | con.on('connected', function () { | |
8838bdd6 | 72 | global.servers.addConnection(this); |
76ff1063 JA |
73 | return callback(null, con_num); |
74 | }); | |
75 | ||
76 | con.on('error', function (err) { | |
b09157de | 77 | console.log('irc_connection error (' + hostname + '):', err); |
76ff1063 JA |
78 | return callback(err.code, {server: con_num, error: err}); |
79 | }); | |
80 | ||
81 | con.on('close', function () { | |
82 | that.irc_connections[con_num] = null; | |
8838bdd6 | 83 | global.servers.removeConnection(this); |
76ff1063 JA |
84 | }); |
85 | }; | |
86 | ||
87 | State.prototype.sendIrcCommand = function () { | |
88 | this.client.sendIrcCommand.apply(this.client, arguments); | |
89 | }; | |
90 | ||
91 | State.prototype.sendKiwiCommand = function () { | |
92 | this.client.sendKiwicommand.apply(this.client, arguments); | |
93 | }; | |
94 | ||
95 | State.prototype.dispose = function () { | |
5befab98 | 96 | this.emit('dispose'); |
76ff1063 JA |
97 | this.removeAllListeners(); |
98 | }; |