Changeset 5
- Timestamp:
- 01/26/04 14:57:25 (5 years ago)
- Files:
-
- trunk/jjigw.py (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/jjigw.py
r3 r5 50 50 51 51 channel_re=re.compile(r"^[&#+!][^\000 \007 ,:\r\n]{1,49}$") 52 nick_re=re.compile(r"^[a-zA-Z\x5b-\x60\x7b-\x7d\[\]\\`_^{|}][a-zA-Z\x5b-\x60\x7b-\x7d\[\]\\`_^{|}0-9-]{0,8}$") 53 54 def escape_node_string(s): 55 s=s.replace(",quot,",'"') 56 s=s.replace(",amp,","&") 57 s=s.replace(",apos,","'") 58 s=s.replace(",slash,","/") 59 s=s.replace(",lt,","<") 60 s=s.replace(",gt,",">") 61 s=s.replace(",at,","@") 62 return s 63 64 def unescape_node_string(s): 65 s=s.replace('"',",quot,") 66 s=s.replace("&",",amp,") 67 s=s.replace("'",",apos,") 68 s=s.replace("/",",slash,") 69 s=s.replace("<",",lt,") 70 s=s.replace(">",",gt,") 71 s=s.replace("@",",at,") 72 return s 73 74 def node_to_channel(n,encoding): 75 s=n.encode(encoding,"strict") 76 s=escape_node_string(s) 77 if not channel_re.match(s): 78 raise ValueError,"Bad channel name: %r" % (s,) 79 return s 80 81 def channel_to_node(ch,encoding): 82 s=unescape_node_string(ch) 83 n=unicode(s,encoding,"strict") 84 return n 85 86 def node_to_nick(n,encoding): 87 s=n.encode(encoding,"strict") 88 s=escape_node_string(s) 89 if not nick_re.match(s): 90 raise ValueError,"Bad channel name: %r" % (s,) 91 return s 92 93 def nick_to_node(ch,encoding): 94 s=unescape_node_string(ch) 95 n=unicode(s,encoding,"strict") 96 return n 97 98 irc_translate_table=string.maketrans( 99 string.ascii_uppercase+"[]\\~", 100 string.ascii_lowercase+"{}|^") 101 102 def normalize(s): 103 return s.translate(irc_translate_table) 52 104 53 105 class IRCUser: … … 68 120 69 121 def join_channel(self,channel): 70 self.channels[ channel.name]=channel122 self.channels[normalize(channel.name)]=channel 71 123 72 124 def leave_channel(self,channel): 73 125 try: 74 del self.channels[ channel.name]126 del self.channels[normalize(channel.name)] 75 127 except KeyError: 76 128 pass … … 85 137 self.debug("Channel: %r" % (channel,)) 86 138 if channel!="*": 87 channel=self.session.channels.get( channel)139 channel=self.session.channels.get(normalize(channel)) 88 140 if not channel: 89 141 self.debug("Ignoring WHO reply: %r - unknown channel" % (params,)) … … 162 214 163 215 def nick_to_jid(self,nick): 164 return JID(self.room_jid.node,self.room_jid.domain,unicode(nick,self.encoding,"replace")) 216 return JID(self.room_jid.node,self.room_jid.domain, 217 unicode(nick,self.encoding,"replace")) 165 218 166 219 def get_user_presence(self,user): … … 197 250 198 251 def irc_cmd_JOIN(self,prefix,command,params): 199 if prefix==self.session.nick or prefix.startswith(self.session.nick+"!"): 252 nprefix=normalize(prefix) 253 nnick=normalize(self.session.nick) 254 if nprefix==nnick or nprefix.startswith(nnick+"!")): 200 255 if self.state=="join": 201 256 self.debug("Channel %r joined!" % (self.name,)) … … 251 306 return self.session.debug(msg) 252 307 253 nick_re=re.compile(r"^[a-zA-Z\x5b-\x60\x7b-\x7d\[\]\\`_^{|}][a-zA-Z\x5b-\x60\x7b-\x7d\[\]\\`_^{|}0-9-]{0,8}$")254 308 255 309 class IRCSession: … … 284 338 self.lock.acquire() 285 339 try: 286 self.users[ user.nick]=user340 self.users[normalize(user.nick)]=user 287 341 finally: 288 342 self.lock.release() … … 291 345 self.lock.acquire() 292 346 try: 293 if self.users.get(user.nick)==user: 294 del self.users[user.nick] 347 nnick=normalize(user.nick) 348 if self.users.get(nnick)==user: 349 del self.users[nnick] 295 350 finally: 296 351 self.lock.release() … … 299 354 self.lock.acquire() 300 355 try: 301 self.users[n ew_nick]=user356 self.users[normalize(new_nick)]=user 302 357 try: 303 del self.users[ user.nick]358 del self.users[normalize(user.nick)] 304 359 except KeyError: 305 360 pass … … 313 368 else: 314 369 nick=prefix 315 if self.users.has_key(nick): 316 return self.users[nick] 370 nnick=normalize(nick) 371 if self.users.has_key(nnick): 372 return self.users[nnick] 317 373 user=IRCUser(self,prefix) 318 374 self.register_user(user) … … 320 376 321 377 def check_nick(self,nick): 322 nick=nick.encode(self.default_encoding ,"strict")323 if n ick==self.nick:378 nick=nick.encode(self.default_encoding) 379 if normalize(nick)==normalize(self.nick): 324 380 return 1 325 381 else: … … 476 532 if command in self.commands_dont_show: 477 533 return 478 if prefix==self.nick or prefix and prefix.startswith(self.nick+"!"): 479 return 480 if prefix==self.server and len(params)==2 and params[0]==self.nick: 534 nprefix=normalize(prefix) 535 nnick=normalize(self.nick) 536 nserver=normalize(self.server) 537 if nprefix==nnick or prefix and nprefix.startswith(nnick+"!"): 538 return 539 if nprefix==nserver and len(params)==2 and params[0]==self.nick: 481 540 body=u"(!) %s" % (unicode(params[1],self.default_encoding,"replace"),) 482 541 elif command in ("004","005","252","253","254"): … … 491 550 self.component.send(m) 492 551 493 def join(self,channel,stanza): 494 channel=channel.encode(self.default_encoding) 495 if self.channels.has_key(channel): 552 def join(self,stanza): 553 to=stanza.get_to() 554 channel=node_to_channel(to,self.default_encoding) 555 if self.channels.has_key(normalize(channel)): 496 556 return 497 557 self.cond.acquire() … … 506 566 channel=Channel(self,channel) 507 567 channel.join(stanza) 508 self.channels[ channel.name]=channel568 self.channels[normalize(channel.name)]=channel 509 569 510 570 def message_to_channel(self,stanza): … … 512 572 return 513 573 channel=stanza.get_to().node 514 channel= channel.encode(self.default_encoding)574 channel=node_to_channel(channel,self.default_encoding) 515 575 if not channel_re.match(channel): 516 576 debug("Bad channel name: %r" % (channel,)) … … 521 581 body="\001ACTION "+body[4:]+"\001" 522 582 self.send("PRIVMSG %s :%s" % (channel,body)) 523 channel=self.channels.get( channel)583 channel=self.channels.get(normalize(channel)) 524 584 if channel: 525 585 channel.irc_cmd_PRIVMSG(self.nick,"PRIVMSG",[channel.name,body]) … … 666 726 self.irc_sessions[fr.as_unicode()]=sess 667 727 if to.node: 668 sess.join( to.node,stanza)728 sess.join(stanza) 669 729 else: 670 730 p=Presence(
