Changeset 58

Show
Ignore:
Timestamp:
02/15/04 12:08:26 (5 years ago)
Author:
jajcus
Message:

- Request and RequestQueue? classes
- confirm kick with <iq type="result"/> response

Files:

Legend:

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

    r56 r58  
    1414import Queue 
    1515import time 
     16from types import StringType,UnicodeType 
    1617 
    1718from pyxmpp import ClientStream,JID,Iq,Presence,Message,StreamError 
     
    170171            self.doc.freeDoc() 
    171172 
     173 
     174class Request: 
     175    def __init__(self,command,stanza,args=None): 
     176        self.command=command 
     177        self.stanza=stanza 
     178        self.args=args 
     179    def match(self,commands,args=None): 
     180        if type(commands) in (StringType,UnicodeType): 
     181            commands=[commands] 
     182        for c in commands: 
     183            if not self.command==c: 
     184                continue 
     185            if args and not self.args==args: 
     186                continue 
     187            return 1 
     188        return 0 
     189 
     190class RequestQueue: 
     191    def __init__(self,maxsize): 
     192        self.maxsize=maxsize 
     193        self.requests=[] 
     194    def get(self,commands,args=None): 
     195        for r in self.requests: 
     196            if r.match(commands): 
     197                try: 
     198                    self.requests.remove(r) 
     199                except ValueError: 
     200                    pass 
     201                return r 
     202        return None 
     203    def add(self,command,stanza,args=None): 
     204        r=Request(command,stanza,args) 
     205        self.requests.append(r) 
     206        if len(self.requests)>10: 
     207            self.requests=self.requests[-10:] 
     208 
    172209class IRCUser: 
    173210    def __init__(self,session,nick,user="",host=""): 
     
    289326        self.users=[] 
    290327        self.muc=0 
    291         self.requests=[] 
    292  
    293     def get_request(self,commands): 
    294         for command,stanza in self.requests: 
    295             if command in commands: 
    296                 try: 
    297                     self.requests.remove((command,stanza)) 
    298                 except ValueError: 
    299                     pass 
    300                 return command,stanza 
    301         return None,None 
    302  
    303     def add_request(self,command,stanza): 
    304         self.requests.append((command,stanza.copy())) 
    305         if len(self.requests)>10: 
    306             self.requests=self.requests[-10:] 
     328        self.requests=RequestQueue(10) 
    307329 
    308330    def sync_user(self,user,status=None): 
     
    338360        self.debug("Joining channel %r" % (self.name,)) 
    339361        self.session.send("JOIN %s" % (self.name,)) 
    340         self.add_request("JOIN",stanza) 
     362        self.requests.add("JOIN",stanza) 
    341363        self.state="join" 
    342364        if stanza.get_join_info(): 
     
    465487 
    466488    def irc_error_response(self,prefix,command,params,requests,condition): 
    467         command,stanza=self.get_request(requests) 
     489        command,stanza=self.requests.get(requests) 
    468490        if command: 
    469491            m=stanza.make_error_response(condition) 
     
    484506 
    485507    def irc_cmd_TOPIC(self,prefix,command,params): 
    486         self.get_request(("TOPIC",)
     508        self.requests.get("TOPIC"
    487509        topic=remove_evil_characters(params[1]) 
    488510        m=Message(fr=self.prefix_to_jid(prefix),to=self.session.jid, 
     
    580602                    self.session.user.sync_delay-=1 
    581603                self.state="joined" 
    582                 self.get_request(("JOIN",)
     604                self.requests.get("JOIN"
    583605                self.session.send("MODE %s" % (self.name,)) 
    584606                self.session.send("WHO %s" % (self.name,)) 
     
    612634                0) 
    613635        user.leave_channel(self,status=307) 
     636        if user and self.session.check_prefix(prefix): 
     637            r=self.requests.get("KICK",user.nick) 
     638            if r: 
     639                iq=r.stanza.make_result_response() 
     640                self.session.component.send(iq) 
    614641 
    615642    def irc_cmd_PRIVMSG(self,prefix,command,params): 
     
    642669        topic=topic.replace("\n"," ").replace("\r"," ") 
    643670        self.session.send("TOPIC %s :%s" % (self.name,topic)) 
    644         self.add_request("TOPIC",stanza) 
     671        self.requests.add("TOPIC",stanza) 
    645672 
    646673    def kick_user(self,nick,reason,stanza): 
    647674        self.session.send("KICK %s %s :%s" % (self.name,nick,reason)) 
    648         self.add_request("KICK",stanza
     675        self.requests.add("KICK",stanza,nick
    649676    
    650677    def __repr__(self):