Esempio n. 1
0
 def cbGroups(groups):
     def gotSize(size, group):
         return group.name, size, group.meta.get('topic')
     d = defer.DeferredList([
         group.size().addCallback(gotSize, group) for group in groups])
     d.addCallback(lambda results: self.list([r for (s, r) in results if s]))
     return d
Esempio n. 2
0
 def setMetadata(self, meta):
     self.meta = meta
     sets = []
     for p in self.users.itervalues():
         d = defer.maybeDeferred(p.groupMetaUpdate, self, meta)
         d.addErrback(self._ebUserCall, p=p)
         sets.append(d)
     defer.DeferredList(sets).addCallback(self._cbUserCall)
     return defer.succeed(None)
Esempio n. 3
0
 def receive(self, sender, recipient, message):
     assert recipient is self
     receives = []
     for p in self.users.itervalues():
         if p is not sender:
             d = defer.maybeDeferred(p.receive, sender, self, message)
             d.addErrback(self._ebUserCall, p=p)
             receives.append(d)
     defer.DeferredList(receives).addCallback(self._cbUserCall)
     return defer.succeed(None)
Esempio n. 4
0
 def add(self, user):
     assert iwords.IChatClient.providedBy(user), "%r is not a chat client" % (user,)
     if user.name not in self.users:
         additions = []
         self.users[user.name] = user
         for p in self.users.itervalues():
             if p is not user:
                 d = defer.maybeDeferred(p.userJoined, self, user)
                 d.addErrback(self._ebUserCall, p=p)
                 additions.append(d)
         defer.DeferredList(additions).addCallback(self._cbUserCall)
     return defer.succeed(None)
Esempio n. 5
0
 def _cbIdent(self, ident, chatui):
     if not ident:
         print 'falsely identified.'
         return self._ebConnected(
             Failure(Exception("username or password incorrect")))
     print 'Identified!'
     dl = []
     for handlerClass, sname, pname in self.services:
         d = defer.Deferred()
         dl.append(d)
         handler = handlerClass(self, sname, pname, chatui, d)
         ident.callRemote('attach', sname, pname,
                          handler).addCallback(handler.connected)
     return defer.DeferredList(dl)
Esempio n. 6
0
 def remove(self, user, reason=None):
     assert reason is None or isinstance(reason, unicode)
     try:
         del self.users[user.name]
     except KeyError:
         pass
     else:
         removals = []
         for p in self.users.itervalues():
             if p is not user:
                 d = defer.maybeDeferred(p.userLeft, self, user, reason)
                 d.addErrback(self._ebUserCall, p=p)
                 removals.append(d)
         defer.DeferredList(removals).addCallback(self._cbUserCall)
     return defer.succeed(None)
Esempio n. 7
0
    def irc_LIST(self, prefix, params):
        """List query

        Return information about the indicated channels, or about all
        channels if none are specified.

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        """
        #<< list #python
        #>> :orwell.freenode.net 321 exarkun Channel :Users  Name
        #>> :orwell.freenode.net 322 exarkun #python 358 :The Python programming language
        #>> :orwell.freenode.net 323 exarkun :End of /LIST
        if params:
            # Return information about indicated channels
            try:
                channels = params[0].decode(self.encoding).split(',')
            except UnicodeDecodeError:
                self.sendMessage(
                    irc.ERR_NOSUCHCHANNEL, params[0],
                    ":No such channel (could not decode your unicode!)")
                return

            groups = []
            for ch in channels:
                if ch.startswith('#'):
                    ch = ch[1:]
                groups.append(self.realm.lookupGroup(ch))

            groups = defer.DeferredList(groups, consumeErrors=True)
            groups.addCallback(lambda gs: [r for (s, r) in gs if s])
        else:
            # Return information about all channels
            groups = self.realm.itergroups()

        def cbGroups(groups):
            def gotSize(size, group):
                return group.name, size, group.meta.get('topic')
            d = defer.DeferredList([
                group.size().addCallback(gotSize, group) for group in groups])
            d.addCallback(lambda results: self.list([r for (s, r) in results if s]))
            return d
        groups.addCallback(cbGroups)