Changeset 11

Show
Ignore:
Timestamp:
01/30/04 20:14:48 (5 years ago)
Author:
jajcus
Message:

- channel modes support
- +o,+v channel modes mapping to MUC affiliations/roles
- repr() for IRCUser and IRCChannel (for debugging)
- <status code="303"/> when nick is changed

Files:

Legend:

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

    r10 r11  
    180180                self.session.network.jid.domain, 
    181181                unicode(self.user+'@'+self.host,self.session.default_encoding,"replace")) 
    182          
     182 
     183    def __repr__(self): 
     184        return "<IRCUser %r>" % (self.nick,) 
     185 
    183186    def debug(self,msg): 
    184187        return self.session.debug(msg) 
     
    206209                self.users.append(user) 
    207210        else: 
     211            for m in self.multiarg_modes: 
     212                ul=self.modes.get(m,[]) 
     213                if user in ul: 
     214                    ul.remove(user) 
    208215            if user in self.users: 
    209216                self.users.remove(user) 
     
    261268                unicode(nick,self.encoding,"replace")) 
    262269 
    263     def get_user_presence(self,user): 
     270    def get_user_presence(self,user,nick=None,actor=None,reason=None,status=None): 
    264271        if self.state and user in self.users: 
    265272            p=MucPresence(fr=self.nick_to_jid(user.nick),to=self.session.jid) 
    266273        else: 
    267274            p=MucPresence(type="unavailable",fr=self.nick_to_jid(user.nick),to=self.session.jid) 
     275        self.debug("%r modes: %r" % (self.name,self.modes)) 
    268276        if self.muc: 
    269             ui=p.make_muc_userinfo() 
    270             it=MucItem("none","participant",user.jid(),unicode(user.nick,self.encoding,"replace")) 
     277            if user in self.modes.get("o",[]): 
     278                aff="admin" 
     279                role="moderator" 
     280            elif user in self.modes.get("v",[]): 
     281                aff="member" 
     282                role="participant" 
     283            elif self.modes.get("m"): 
     284                aff="none" 
     285                role="visitor" 
     286            else: 
     287                aff="none" 
     288                role="participant" 
     289            ui=p.make_muc_userinfo(status=status) 
     290            if nick: 
     291                nick=unicode(user.nick,self.encoding,"replace") 
     292            it=MucItem(aff,role,user.jid(),nick=nick,actor=actor,reason=reason) 
    271293            ui.add_item(it) 
    272294        return p 
    273295 
    274296    def nick_changed(self,oldnick,user): 
    275         p_aval=self.get_user_presence(user) 
    276         p_unaval=p_aval.copy() 
     297        p_unaval=self.get_user_presence(user,nick=user.nick,status=303) 
    277298        p_unaval.set_type("unavailable") 
    278299        p_unaval.set_show(None) 
    279300        p_unaval.set_status(None) 
    280301        p_unaval.set_from(self.nick_to_jid(oldnick)) 
     302        p_aval=self.get_user_presence(user,status=303) 
    281303        self.session.component.send(p_unaval) 
    282304        self.session.component.send(p_aval) 
     
    310332            pass 
    311333 
     334    def irc_cmd_324(self,prefix,command,params): 
     335        for m in self.toggle_modes: 
     336            try: 
     337                del self.modes[m] 
     338            except KeyError: 
     339                pass 
     340        self.irc_cmd_MODE(prefix,command,params) 
     341         
     342    def irc_cmd_MODE(self,prefix,command,params): 
     343        self.debug("irc_cmd_mode(%r,%r,%r)" % (prefix,command,params)) 
     344        actor=self.session.get_user(prefix) 
     345        self.debug("irc_cmd_mode: actor=%r" % (actor,)) 
     346        if len(params)<2: 
     347            self.debug("No parameters in received MODE") 
     348            return 
     349        modes=params[1] 
     350        params=params[2:] 
     351        pm=None 
     352        for m in modes: 
     353            if m in "+-": 
     354                pm=m 
     355                continue 
     356            elif not pm: 
     357                self.debug("Not '+' or '-' before '%s' in received MODE" % (m,)) 
     358                continue 
     359            elif m in self.arg_modes or m in self.multiarg_modes: 
     360                if not len(params): 
     361                    self.debug("No argument for mode '%s' in received MODE" % (m,)) 
     362                    continue 
     363                arg=params.pop(0) 
     364            elif m in self.toggle_modes: 
     365                arg=None 
     366            else: 
     367                self.debug("Unknown mode '%s' in received MODE" % (m,)) 
     368                continue 
     369            if m in "oOv": 
     370                arg=self.session.get_user(arg) 
     371                if not arg: 
     372                    continue 
     373            if pm=="+": 
     374                self.set_mode(m,arg) 
     375            else: 
     376                self.reset_mode(m,arg) 
     377            if m in "oOv": 
     378                self.user_mode_changed(arg,actor,m) 
     379            elif m=="m": 
     380                for u in self.users: 
     381                    self.sync_user(u) 
     382 
     383    def user_mode_changed(self,user,actor,mode): 
     384        self.debug("user_mode_changed(%r,%r,%r)" % (user,actor,mode)) 
     385        if actor: 
     386            actor_jid=self.nick_to_jid(actor.nick) 
     387        else: 
     388            actor_jid=None 
     389        p=self.get_user_presence(user,actor_jid) 
     390        if actor: 
     391            by=u" by %s" % (unicode(actor.nick,self.encoding,"replace"),) 
     392        else: 
     393            by=u"" 
     394        self.session.component.send(p) 
     395        if mode=="v": 
     396            self.send_notice_message(u"%s was granted voice%s"  
     397                    % (unicode(user.nick,self.encoding,"replace"),by)) 
     398        elif mode=="o": 
     399            self.send_notice_message(u"%s was granted operator status%s"  
     400                    % (unicode(user.nick,self.encoding,"replace"),by)) 
     401        elif mode=="O": 
     402            self.send_notice_message(u"%s was granted got owner status%s"  
     403                    % (unicode(user.nick,self.encoding,"replace"),by)) 
     404 
    312405    def irc_cmd_JOIN(self,prefix,command,params): 
    313406        nprefix=normalize(prefix) 
     
    319412                self.state="joined" 
    320413                self.stanza=None 
     414                self.session.send("MODE %s" % (self.name,)) 
    321415                self.session.send("WHO %s" % (self.name,)) 
    322416        else: 
     
    362456            self.debug("Unknown CTCP command: %r %r" % (command,arg)) 
    363457             
     458    def __repr__(self): 
     459        return "<IRCChannel %r>" % (self.name,) 
     460 
    364461    def debug(self,msg): 
    365462        return self.session.debug(msg) 
     
    428525        else: 
    429526            nick=prefix 
     527        if not nick_re.match(nick): 
     528            return None 
    430529        nnick=normalize(nick) 
    431530        if self.users.has_key(nnick):