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)
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)
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)
def retrieve_real_list(self): return FetchedList.get_bans( self.pypickupbot, self.pypickupbot.channel).get()
def joinedHomeChannel(self): d = FetchedList.get_bans(self.pypickupbot, self.pypickupbot.channel).get() return d
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)