Changeset 7

Show
Ignore:
Timestamp:
01/26/04 20:28:52 (5 years ago)
Author:
jajcus
Message:

- NICK and QUIT server commands support
- enter/leave/change_nick messages

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/jjigw.py

    r6 r7  
    121121    def join_channel(self,channel): 
    122122        self.channels[normalize(channel.name)]=channel 
     123        channel.sync_user(self) 
    123124 
    124125    def leave_channel(self,channel): 
    125126        try: 
    126127            del self.channels[normalize(channel.name)] 
     128            channel.sync_user(self) 
    127129        except KeyError: 
    128130            pass 
     131 
     132    def leave_all(self): 
     133        for channel in self.channels.values(): 
     134            self.leave_channel(channel) 
     135 
     136    def sync_all(self): 
     137        for channel in self.channels.values(): 
     138            channel.sync_user(self) 
    129139 
    130140    def whoreply(self,params): 
     
    136146        fullname=rest.split(None,1)[1] 
    137147        self.debug("Channel: %r" % (channel,)) 
    138         if channel!="*": 
     148        if channel and channel!="*": 
    139149            channel=self.session.channels.get(normalize(channel)) 
    140150            if not channel: 
    141151                self.debug("Ignoring WHO reply: %r - unknown channel" % (params,)) 
    142152                return 
     153        else: 
     154            channel=None 
    143155        self.nick=nick 
    144156        self.host=host 
    145157        self.user=user 
    146         if channel!="*"
     158        if channel
    147159            self.debug("Channel: %r" % (channel,)) 
    148160            self.join_channel(channel) 
    149             if self not in channel.users: 
    150                 self.debug("Adding user %r to channel %r" % (self.nick,channel.name)) 
    151                 channel.users.append(self) 
    152161            if "@" in flags: 
    153162                channel.set_mode("o",self) 
     
    161170        else: 
    162171            self.mode["a"]=0 
     172        if channel: 
     173            channel.sync_user(self) 
    163174         
    164175    def debug(self,msg): 
     
    180191        self.modes={} 
    181192        self.users=[] 
     193        self.muc=0 
     194 
     195    def sync_user(self,user): 
     196        if user.channels.has_key(normalize(self.name)): 
     197            if user not in self.users: 
     198                self.users.append(user) 
     199        else: 
     200            if user in self.users: 
     201                self.users.remove(user) 
     202                self.send_notice_message(u"%s has quit"  
     203                        % (unicode(user.nick,self.encoding,"replace"),)) 
     204        if self.state: 
     205            p=self.get_user_presence(user) 
     206            self.session.component.send(p) 
     207 
     208    def send_notice_message(self,msg): 
     209        if not self.state or self.muc: 
     210            return 
     211        m=Message(fr=self.room_jid.bare(),to=self.session.jid,type="groupchat",body=msg) 
     212        self.session.component.send(m) 
    182213 
    183214    def join(self,stanza): 
     
    207238        p=Presence(type="unavailable",fr=stanza.get_to(),to=stanza.get_from(),status=status) 
    208239        self.session.component.send(p) 
     240        for u in self.users: 
     241            u.leave_room(self) 
     242        self.state=None 
    209243 
    210244    def prefix_to_jid(self,prefix): 
     
    218252 
    219253    def get_user_presence(self,user): 
    220         if user in self.users: 
     254        if self.state and user in self.users: 
    221255            p=Presence(fr=self.nick_to_jid(user.nick),to=self.session.jid) 
    222256        else: 
    223257            p=Presence(type="unavailable",fr=self.nick_to_jid(user.nick),to=self.session.jid) 
    224258        return p 
     259 
     260    def nick_changed(self,oldnick,user): 
     261        p_aval=self.get_user_presence(user) 
     262        p_unaval=p_aval.copy() 
     263        p_unaval.set_type("unavailable") 
     264        p_unaval.set_show(None) 
     265        p_unaval.set_status(None) 
     266        p_unaval.set_from(self.nick_to_jid(oldnick)) 
     267        self.session.component.send(p_unaval) 
     268        self.session.component.send(p_aval) 
     269        self.send_notice_message(u"%s is now known as %s"  
     270                % (unicode(oldnick,self.encoding,"replace"), 
     271                    unicode(user.nick,self.encoding,"replace"))) 
    225272         
    226273    def set_mode(self,mode,arg): 
     
    258305                        to=self.stanza.get_from()) 
    259306                self.session.component.send(p) 
    260                 self.state="sync
     307                self.state="joined
    261308                self.stanza=None 
    262309                self.session.send("WHO %s" % (self.name,)) 
    263310        else: 
    264311            user=self.session.get_user(prefix) 
    265             if user not in self.users: 
    266                 self.users.append(user) 
    267312            user.join_channel(self) 
     313            self.send_notice_message(u"%s has joined"  
     314                    % (unicode(user.nick,self.encoding,"replace"),)) 
    268315            self.session.send("WHO %s" % (user.nick,)) 
    269             self.session.component.send(self.get_user_presence(user)) 
    270316 
    271317    def irc_cmd_PART(self,prefix,command,params): 
     
    276322            pass 
    277323        user.leave_channel(self) 
    278         self.session.component.send(self.get_user_presence(user)) 
     324        self.send_notice_message(u"%s has left"  
     325                % (unicode(user.nick,self.encoding,"replace"),)) 
    279326 
    280327    def irc_cmd_PRIVMSG(self,prefix,command,params): 
     
    515562        self.send("PONG %s" % (params[0],)) 
    516563 
     564    def irc_cmd_NICK(self,prefix,command,params): 
     565        if len(params)<1: 
     566            return 
     567        user=self.get_user(prefix) 
     568        if params[0]!=user.nick: 
     569            oldnick=user.nick 
     570            self.rename_user(user,params[0]) 
     571            for ch in user.channels.values(): 
     572                ch.nick_changed(oldnick,user) 
     573 
     574    def irc_cmd_QUIT(self,prefix,command,params): 
     575        user=self.get_user(prefix) 
     576        user.leave_all() 
     577        self.unregister_user(user) 
     578 
    517579    def irc_cmd_352(self,prefix,command,params): 
    518580        self.debug("WHO reply received")