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
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)
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)
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)
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)
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)
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)