143 self.flags = flags |
143 self.flags = flags |
144 self.send_buffer = list() |
144 self.send_buffer = list() |
145 self.umode = cfg['umode'] if 'umode' in cfg else '' |
145 self.umode = cfg['umode'] if 'umode' in cfg else '' |
146 self.cfg = cfg |
146 self.cfg = cfg |
147 self.mynick = '' |
147 self.mynick = '' |
|
148 self.desired_name = self.cfg['nickname'] if 'nickname' in self.cfg else g_config['nickname'] |
148 g_clients.append (self) |
149 g_clients.append (self) |
149 asyncore.dispatcher.__init__ (self) |
150 asyncore.dispatcher.__init__ (self) |
150 self.create_socket (socket.AF_INET, socket.SOCK_STREAM) |
151 self.create_socket (socket.AF_INET, socket.SOCK_STREAM) |
151 self.connect ((self.host, self.port)) |
152 self.connect ((self.host, self.port)) |
152 |
153 |
153 def handle_connect (self): |
154 def register_to_irc (self): |
154 nick = self.cfg['nickname'] if 'nickname' in self.cfg else g_config['nickname'] |
|
155 ident = self.cfg['ident'] if 'ident' in self.cfg else g_config['ident'] |
155 ident = self.cfg['ident'] if 'ident' in self.cfg else g_config['ident'] |
156 gecos = self.cfg['gecos'] if 'gecos' in self.cfg else g_config['gecos'] |
156 gecos = self.cfg['gecos'] if 'gecos' in self.cfg else g_config['gecos'] |
157 self.mynick = nick |
|
158 print "Connected to [%s] %s:%d" % (self.name, self.host, self.port) |
|
159 if 'password' in self.cfg: |
157 if 'password' in self.cfg: |
160 self.write ("PASS %s" % self.cfg['password']) |
158 self.write ("PASS %s" % self.cfg['password']) |
161 self.write ("USER %s * * :%s" % (ident, gecos)) |
159 self.write ("USER %s * * :%s" % (ident, gecos)) |
162 self.write ("NICK %s" % nick) |
160 self.write ("NICK %s" % self.mynick) |
|
161 |
|
162 def handle_connect (self): |
|
163 self.mynick = self.desired_name |
|
164 print "Connected to [%s] %s:%d" % (self.name, self.host, self.port) |
|
165 self.register_to_irc() |
163 |
166 |
164 def write (self, data): |
167 def write (self, data): |
165 self.send_buffer.append ("%s" % data) |
168 self.send_buffer.append ("%s" % data) |
166 |
169 |
167 def handle_close (self): |
170 def handle_close (self): |
192 if line.startswith ("PING :"): |
195 if line.startswith ("PING :"): |
193 self.write ("PONG :%s" % line[6:]) |
196 self.write ("PONG :%s" % line[6:]) |
194 continue |
197 continue |
195 |
198 |
196 words = line.split(" ") |
199 words = line.split(" ") |
197 if len(words) >= 2 and words[1] == "001": |
200 if len(words) >= 2: |
198 self.flags |= CLIF_CONNECTED |
201 if words[1] == "001": |
199 |
202 self.flags |= CLIF_CONNECTED |
200 for channel in self.cfg['channels']: |
203 |
201 self.write ("JOIN %s %s" % (channel['name'], channel['password'] if 'password' in channel else '')) |
204 for channel in self.cfg['channels']: |
202 |
205 self.write ("JOIN %s %s" % (channel['name'], channel['password'] if 'password' in channel else '')) |
203 if 'umode' in self.cfg: |
206 |
204 self.write ('MODE %s %s' % (self.mynick, self.cfg['umode'])) |
207 if 'umode' in self.cfg: |
205 |
208 self.write ('MODE %s %s' % (self.mynick, self.cfg['umode'])) |
206 if len(words) >= 2 and words[1] == "PRIVMSG": |
209 elif words[1] == "PRIVMSG": |
207 self.handle_privmsg (line) |
210 self.handle_privmsg (line) |
|
211 elif words[1] == 'QUIT': |
|
212 rex = re.compile (r'^:([^!]+)!([^@]+)@([^ ]+) QUIT') |
|
213 match = rex.match (line) |
|
214 |
|
215 # Try reclaim our nickname if possible |
|
216 if match and match.group(1) == self.desired_name: |
|
217 self.mynick = self.desired_name |
|
218 self.write ("NICK %s" % self.mynick) |
|
219 elif words[1] == "433": |
|
220 #:irc.localhost 433 * cobalt :Nickname is already in use. |
|
221 self.mynick = '%s_' % self.mynick |
|
222 self.write ("NICK %s" % self.mynick) |
208 |
223 |
209 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # |
224 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # |
210 # |
225 # |
211 # Handle a PRIVMSG line from the IRC server |
226 # Handle a PRIVMSG line from the IRC server |
212 # |
227 # |