コード例 #1
0
ファイル: AntiSpam.py プロジェクト: gamer167/GearBot
    def __init__(self, bot):
        super(AntiSpam, self).__init__(bot)
        # store values as functions so only what is needed is computed
        self.generators = {
            "max_messages": lambda m: 1,
            "max_newlines": lambda m: len(m.content.split("\n")) - 1,
            "max_mentions": lambda m: len(MENTION_MATCHER.findall(m.content)),
            "max_links": lambda m: len(URL_MATCHER.findall(m.content))
        }

        self.punishments = {
            "warn": self.warn_punishment,
            "mute": self.mute_punishment,
            "kick": self.kick_punishment,
            "temp_ban": self.temp_ban_punishment,
            "ban": self.ban_punishment
        }

        self.seriousness = {
            "warn": 1,
            "mute": 2,
            "kick": 3,
            "temp_ban": 4,
            "ban": 5
        }
        self.extra_actions = WeakValueDictionary()
        self.processed = deque(maxlen=500)
        self.censor_processed = deque(maxlen=50)
        self.running = True
        bot.loop.create_task(self.censor_detector())
コード例 #2
0
    async def on_raw_message_delete(self, data: RawMessageDeleteEvent):
        message = await MessageUtils.get_message_data(self.bot,
                                                      data.message_id)
        if message is None:
            return  # can't do anything without the message data
        member = await Utils.get_member(self.bot,
                                        self.bot.get_guild(data.guild_id),
                                        message.author)
        if member is None:
            return  # user no longer present, probably already actioned
        if self.is_exempt(data.guild_id, member):
            return  # don't action except users

        if data.message_id in self.bot.deleted_messages and not Configuration.get_var(
                "GENERAL", "BOT_DELETED_STILL_GHOSTS"):
            return

        ghost_message_threshold = Configuration.get_var(
            data.guild_id, "GENERAL", "GHOST_MESSAGE_THRESHOLD")
        ghost_ping_threshold = Configuration.get_var(data.guild_id, "GENERAL",
                                                     "GHOST_PING_THRESHOLD")
        buckets = Configuration.get_var(data.guild_id, "ANTI_SPAM", "BUCKETS",
                                        [])
        mentions = len(MENTION_MATCHER.findall(message.content))

        msg_time = int(snowflake_time(message.messageid).timestamp())
        is_ghost = (
            snowflake_time(message.messageid) -
            datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
        ).total_seconds() < ghost_message_threshold
        is_ghost_ping = (
            snowflake_time(message.messageid) -
            datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
        ).total_seconds() < ghost_ping_threshold and mentions > 0

        if is_ghost or is_ghost_ping:
            for b in buckets:
                t = b["TYPE"]
                if t == "max_ghost_messages" and is_ghost:
                    now = int(datetime.datetime.utcnow().replace(
                        tzinfo=datetime.timezone.utc).timestamp())
                    bucket = self.get_bucket(
                        member.guild.id, f"max_ghost_messages:{member.id}", b)
                    if bucket is not None and await bucket.check(
                            member.id,
                            now,
                            message=message.messageid,
                            channel=message.channel,
                            user=message.author,
                            amount=1):
                        count = await bucket.count(member.id,
                                                   now,
                                                   expire=False)
                        period = await bucket.size(member.id,
                                                   now,
                                                   expire=False)
                        self.bot.loop.create_task(
                            self.violate(
                                Violation(
                                    "max_ghost_messages", member.guild,
                                    f"{Translator.translate('spam_max_ghost_messages', member.guild)} ({count}/{period}s)",
                                    member,
                                    self.bot.get_channel(data.channel_id),
                                    await bucket.get(message.author,
                                                     msg_time,
                                                     expire=False), b, count)))
                elif t == "max_ghost_pings" and is_ghost_ping:
                    bucket = self.get_bucket(
                        member.guild.id,
                        f"max_ghost_pings:{member.id}",
                        b,
                    )
                    if bucket is not None and await bucket.check(
                            member.id,
                            msg_time,
                            message=message.messageid,
                            channel=message.channel,
                            user=message.author,
                            amount=mentions):
                        count = await bucket.count(member.id,
                                                   msg_time,
                                                   expire=False)
                        period = await bucket.size(member.id,
                                                   msg_time,
                                                   expire=False)
                        self.bot.loop.create_task(
                            self.violate(
                                Violation(
                                    "max_ghost_pings", member.guild,
                                    f"{Translator.translate('spam_max_ghost_pings', member.guild)} ({count}/{period}s)",
                                    member,
                                    self.bot.get_channel(data.channel_id),
                                    await bucket.get(message.author,
                                                     msg_time,
                                                     expire=False), b, count)))