Exemplo n.º 1
0
    def apply(self):
        log.msg("Applying {0}".format(self))
        def _knowOp(l):
            has_op, users = zip(*l)[1]
            if not has_op:
                log.err("Bot doesn't have operator status")
                return False

            for masks in xgroup(self.meta['ban_masks'], 3): #arbitrary number
                self.tracker.pypickupbot.sendLine("MODE %s +%s %s" % (
                    self.tracker.pypickupbot.channel,
                    'b' * len(masks),
                    str(' '.join(masks))
                    ))

            kickreason = ''
            if 'reason' in self.meta:
                kickreason += self.meta['reason']
            kickreason += '[' + self.expiry() + ']'
            for nick, ident, host, flags in users:
                if self.tracker.cmp_masks(
                    '%s!%s@%s' % (nick, ident, host),
                    self.meta['ban_masks']
                    ):
                    self.tracker.pypickupbot.sendLine(
                        "KICK %s %s :%s" % 
                        (
                            self.tracker.pypickupbot.channel,
                            nick,
                            kickreason
                        )
                        )
            return True
        return defer.DeferredList(
            [
                FetchedList.bot_has_op(self.tracker.pypickupbot),
                FetchedList.get_users(self.tracker.pypickupbot,
                                      self.tracker.pypickupbot.channel).get()
            ]
            ).addCallback(_knowOp)
Exemplo n.º 2
0
 def unapply(self):
     log.msg("Unapplying {0}".format(self))
     def _knowOp(has_op):
         if not has_op:
             log.err("Bot doesn't have operator status")
             return True
         traceback.print_stack()
         for masks in xgroup(self.meta['ban_masks'], 3):
             self.tracker.pypickupbot.sendLine("MODE %s -%s %s" % (
                 self.tracker.pypickupbot.channel,
                 'b' * len(masks),
                 str(' '.join(masks))
                 ))
         return False
     return FetchedList.bot_has_op(self.tracker.pypickupbot) \
         .addCallback(_knowOp)
Exemplo n.º 3
0
        def _gotMasks(masks):
            def _gotUserList(userlist):
                meta = {
                        'ban_masks': masks,
                        'seen_masks': [],
                        'seen_nicks': [],
                    }

                if user:
                    meta['seen_masks'].append(user)
                if nick:
                    meta['seen_nicks'].append(nick)

                to_kick = []
                for nick_, ident, host, flags in userlist:
                    mask_ = '%s!%s@%s' % (nick_, ident, host)
                    if tracker.cmp_masks(
                        mask_,
                        masks
                        ):
                        to_kick.append(nick_)
                        if nick_ not in meta['seen_nicks']:
                            meta['seen_nicks'].append(nick_)
                        if mask_ not in meta['seen_masks']:
                            meta['seen_masks'].append(mask_)


                if tracker.pypickupbot.nickname in to_kick:
                    raise InputError(_("Ain't gonna ban myself."))
                if len(to_kick) > 1:
                    confirm = call.confirm(_("More than 1 client(%s) is affected with this ban, proceed?") % ' '.join(to_kick))
                else:
                    confirm = defer.succeed(True)
                def _confirmed(confirmed):
                    if not confirmed:
                        raise InputError(_("Cancelled."))

                    return cls(
                        tracker,
                        meta
                        )
                return confirm.addCallback(_confirmed)
            return FetchedList.get_users(
                tracker.pypickupbot,
                tracker.pypickupbot.channel
                ).get(_gotUserList).addCallback(_gotUserList)
Exemplo n.º 4
0
 def retrieve_real_list(self):
     return FetchedList.get_bans(
         self.pypickupbot,
         self.pypickupbot.channel).get()
Exemplo n.º 5
0
 def joinedHomeChannel(self):
     d = FetchedList.get_bans(self.pypickupbot, self.pypickupbot.channel).get()
     return d
Exemplo n.º 6
0
    def from_call(cls, tracker, call, args):
        nick = None
        user = None

        if not args:
            if tracker.lastKicked and tracker.lastKickedTime + 120 > itime():
                user = tracker.lastKicked
                reason = tracker.lastKickedReason
            else:
                raise InputError(
                    _("No kick issued recently, so please specify a user or mask to ban."))
        else:
            if '$' == args[0][0]: # that's a server-custom mask
                                  # the user surely knows what they're
                                  # doing there
                user = args.pop(0)
            elif '@' not in args[0] \
            and  '!' not in args[0] \
            and  '*' not in args[0] \
            and  '?' not in args[0]:
                if is_ipv4(args[0]) or is_ipv6(args[0]):
                    user = '******' + args.pop(0) # TODO ban a subnet for
                                                # ivp6 addresses
                else:
                    nick = args.pop(0)
            else:
                if  '@' not in args[0] \
                and '!' not in args[0]:
                    user = args.pop(0)+'!*@*'
                else:
                    if not banmaskRe.match(args[0]):
                        raise InputError(_("Invalid hostmask '%s'")%args[0])
                    elif hostmaskRe.match(args[0]): # full hostmask
                        user = cls.find_banmask(args.pop(0))
                    else: # already a banmask
                        user = args.pop(0)

        if user:
            user_d = defer.succeed([user])
        else:
            def _gotUserList(l):
                for nick_, ident, host, flags in l:
                    if nick == nick_:
                        user = "******" % (nick_, ident, host)
                        return cls.find_banmask(user)
                else:
                    return ['%s!*@*' % nick]

            user_d = FetchedList.get_users(
                tracker.pypickupbot,
                tracker.pypickupbot.channel
                ).get().addCallback(_gotUserList)

        def _gotMasks(masks):
            def _gotUserList(userlist):
                meta = {
                        'ban_masks': masks,
                        'seen_masks': [],
                        'seen_nicks': [],
                    }

                if user:
                    meta['seen_masks'].append(user)
                if nick:
                    meta['seen_nicks'].append(nick)

                to_kick = []
                for nick_, ident, host, flags in userlist:
                    mask_ = '%s!%s@%s' % (nick_, ident, host)
                    if tracker.cmp_masks(
                        mask_,
                        masks
                        ):
                        to_kick.append(nick_)
                        if nick_ not in meta['seen_nicks']:
                            meta['seen_nicks'].append(nick_)
                        if mask_ not in meta['seen_masks']:
                            meta['seen_masks'].append(mask_)


                if tracker.pypickupbot.nickname in to_kick:
                    raise InputError(_("Ain't gonna ban myself."))
                if len(to_kick) > 1:
                    confirm = call.confirm(_("More than 1 client(%s) is affected with this ban, proceed?") % ' '.join(to_kick))
                else:
                    confirm = defer.succeed(True)
                def _confirmed(confirmed):
                    if not confirmed:
                        raise InputError(_("Cancelled."))

                    return cls(
                        tracker,
                        meta
                        )
                return confirm.addCallback(_confirmed)
            return FetchedList.get_users(
                tracker.pypickupbot,
                tracker.pypickupbot.channel
                ).get(_gotUserList).addCallback(_gotUserList)
        return user_d.addCallback(_gotMasks)