Changeset 40
- Timestamp:
- 02/08/04 18:24:43 (5 years ago)
- Files:
-
- trunk/jjigw.py (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/jjigw.py
r37 r40 15 15 from pyxmpp import ClientStream,JID,Iq,Presence,Message,StreamError 16 16 import pyxmpp.jabberd 17 from pyxmpp.jabber.muc import MucPresence,MucX,MucUserX,MucItem,MUC_NS 17 from pyxmpp.jabber.muc import MucPresence,MucX,MucUserX,MucItem,MUC_NS,MucStatus 18 18 19 19 class JJIGWFatalError(RuntimeError): … … 260 260 self.session=session 261 261 self.state=None 262 self.stanza=None263 262 self.room_jid=None 264 263 self.config=session.network.get_channel_config(name) … … 270 269 self.users=[] 271 270 self.muc=0 271 self.requests={} 272 272 273 273 def sync_user(self,user): … … 303 303 self.debug("Joining channel %r" % (self.name,)) 304 304 self.session.send("JOIN %s" % (self.name,)) 305 self. stanza=stanza.copy()305 self.requests["JOIN"]=stanza.copy() 306 306 self.state="join" 307 307 if stanza.get_join_info(): … … 319 319 status.encode(self.encoding,"replace"))) 320 320 self.state=None 321 self.stanza=None322 321 p=MucPresence(type="unavailable",fr=stanza.get_to(),to=stanza.get_from(),status=status) 323 322 self.session.component.send(p) … … 354 353 aff="none" 355 354 role="participant" 356 ui=p.make_muc_userinfo( status=status)355 ui=p.make_muc_userinfo() 357 356 if nick: 358 357 nick=unicode(user.nick,self.encoding,"replace") 359 358 it=MucItem(aff,role,user.jid(),nick=nick,actor=actor,reason=reason) 360 359 ui.add_item(it) 360 if status: 361 ui.add_item(MucStatus(status)) 361 362 return p 362 363 … … 406 407 pass 407 408 self.irc_cmd_MODE(prefix,command,params) 409 410 def irc_cmd_482(self,prefix,command,params): # ERR_CHANOPRIVSNEEDED 411 stanza=self.requests.get("TOPIC") 412 if stanza: 413 m=stanza.make_error_response("forbidden") 414 try: 415 del self.requests["TOPIC"] 416 except KeyError: 417 pass 418 else: 419 m=Message(fr=self.room_jid.bare(),to=self.session.jid, 420 type="error", error_cond="forbidden") 421 self.session.component.send(m) 422 423 def irc_cmd_332(self,prefix,command,params): # RPL_TOPIC 424 topic=params[1] 425 m=Message(fr=self.room_jid.bare(),to=self.session.jid, 426 type="groupchat", subject=unicode(topic,self.encoding,"replace")) 427 self.session.component.send(m) 428 429 def irc_cmd_TOPIC(self,prefix,command,params): 430 if self.session.check_prefix(prefix): 431 try: 432 del self.requests["TOPIC"] 433 except KeyError: 434 pass 435 topic=params[1] 436 m=Message(fr=self.prefix_to_jid(prefix),to=self.session.jid, 437 type="groupchat", subject=unicode(topic,self.encoding,"replace")) 438 self.session.component.send(m) 408 439 409 440 def irc_cmd_MODE(self,prefix,command,params): … … 482 513 self.session.user.sync_delay-=1 483 514 self.state="joined" 484 self.stanza=None 515 try: 516 del self.requests["JOIN"] 517 except KeyError: 518 pass 485 519 self.session.send("MODE %s" % (self.name,)) 486 520 self.session.send("WHO %s" % (self.name,)) … … 526 560 else: 527 561 self.debug("Unknown CTCP command: %r %r" % (command,arg)) 528 562 563 def change_topic(self,topic,stanza): 564 topic=topic.encode(self.encoding,"replace") 565 topic=topic.replace("\n"," ").replace("\r"," ") 566 self.session.send("TOPIC %s :%s" % (self.name,topic)) 567 self.requests["TOPIC"]=stanza 568 529 569 def __repr__(self): 530 570 return "<IRCChannel %r>" % (self.name,) … … 615 655 else: 616 656 return 0 657 658 def check_prefix(self,prefix): 659 if "!" in prefix: 660 nick=prefix.split("!",1)[0] 661 else: 662 nick=prefix 663 return normalize(nick)==normalize(self.nick) 617 664 618 665 def thread_run(self): … … 886 933 channel=user.channels[c] 887 934 self.component.send(channel.get_user_presence(user)) 888 935 889 936 def pass_input_to_user(self,prefix,command,params): 890 937 if command in self.commands_dont_show: … … 925 972 926 973 def message_to_channel(self,stanza): 974 self.debug("message_to_channel(%r)" % (stanza,)) 927 975 self.cond.acquire() 928 976 try: … … 932 980 finally: 933 981 self.cond.release() 982 self.debug("message_to_channel: no need to wait") 934 983 channel_name=stanza.get_to().node 984 self.debug("channel_name: %r" % (channel_name,)) 935 985 channel_name=node_to_channel(channel_name,self.default_encoding) 986 self.debug("channel_name: %r" % (channel_name,)) 936 987 if not channel_re.match(channel_name): 937 988 self.debug("Bad channel name: %r" % (channel_name,)) 938 989 return 939 990 channel=self.channels.get(normalize(channel_name)) 991 self.debug("channel: %r" % (channel,)) 940 992 if channel: 941 993 encoding=channel.encoding 942 994 else: 943 995 encoding=self.default_encoding 944 body=stanza.get_body().encode(encoding,"replace") 945 body=body.replace("\n"," ").replace("\r"," ") 946 if body.startswith("/me "): 947 body="\001ACTION "+body[4:]+"\001" 948 self.send("PRIVMSG %s :%s" % (channel_name,body)) 949 if channel: 950 channel.irc_cmd_PRIVMSG(self.nick,"PRIVMSG",[channel_name,body]) 996 self.debug("encoding: %r" % (encoding,)) 997 subject=stanza.get_subject() 998 self.debug("subject: %r" % (subject,)) 999 if subject and channel: 1000 channel.change_topic(subject,stanza.copy()) 1001 body=stanza.get_body() 1002 self.debug("body: %r" % (body,)) 1003 if body: 1004 body=body.encode(encoding,"replace") 1005 body=body.replace("\n"," ").replace("\r"," ") 1006 self.debug("body: %r" % (body,)) 1007 if body.startswith("/me "): 1008 body="\001ACTION "+body[4:]+"\001" 1009 self.send("PRIVMSG %s :%s" % (channel_name,body)) 1010 if channel: 1011 channel.irc_cmd_PRIVMSG(self.nick,"PRIVMSG",[channel_name,body]) 1012 self.debug("message_to_channel: done") 951 1013 952 1014 def message_to_user(self,stanza): … … 998 1060 self.shutdown=0 999 1061 signal.signal(signal.SIGINT,self.signal_handler) 1062 signal.signal(signal.SIGPIPE,self.signal_handler) 1000 1063 signal.signal(signal.SIGTERM,self.signal_handler) 1001 1064 self.irc_sessions={}
