Esempio n. 1
0
    async def on_member_unban(self, guild, user):
        fid = f"{guild.id}-{user.id}"
        if fid in self.bot.data["unbans"]:
            self.bot.data["unbans"].remove(fid)
            return
        elif not Features.is_logged(guild.id, "MOD_ACTIONS"):
            return
        Infraction.update(active=False).where((Infraction.user_id == user.id) &
                                              (Infraction.type == "Ban") &
                                              (Infraction.guild_id == guild.id)).execute()

        limit = datetime.datetime.utcfromtimestamp(time.time() - 60)
        log = await self.find_log(guild, AuditLogAction.unban, lambda e: e.target == user and e.created_at > limit)
        if log is None:
            # this fails way to often for my liking, alternative is adding a delay but this seems to do the trick for now
            log = await self.find_log(guild, AuditLogAction.unban, lambda e: e.target == user and e.created_at > limit)
        if log is not None:
            i = InfractionUtils.add_infraction(guild.id, user.id, log.user.id, "Unban", "Manual unban")
            GearbotLogging.log_key(guild.id, 'unban_log', user=Utils.clean_user(user), user_id=user.id,
                                   moderator=log.user, moderator_id=log.user.id, reason='Manual unban', inf=i.id)


        else:
            i = InfractionUtils.add_infraction(guild.id, user.id, 0, "Unban", "Manual ban")
            GearbotLogging.log_key(guild.id, 'manual_unban_log', user=Utils.clean_user(user), user_id=user.id, inf=i.id)
Esempio n. 2
0
 async def yes():
     await infraction.delete()
     await MessageUtils.send_to(ctx, "YES", "inf_delete_deleted", id=infraction.id)
     GearbotLogging.log_key(ctx.guild.id, 'inf_delete_log', id=infraction.id, target=Utils.clean_user(target),
                            target_id=target.id, mod=Utils.clean_user(mod), mod_id=mod.id if mod is not None else 0, reason=reason,
                            user=Utils.clean_user(ctx.author), user_id=ctx.author.id)
     InfractionUtils.clear_cache(ctx.guild.id)
Esempio n. 3
0
 async def execute(self, bot, member, data, raid_id, raider_ids, shield):
     role = member.guild.get_role(
         Configuration.get_var(member.guild.id, "ROLES", "MUTE_ROLE"))
     if role is None:
         GearbotLogging.log_key(member.guild.id, 'raid_mute_failed_no_role')
     else:
         duration = data["duration"]
         reason = f"Raider muted by raid shield {shield['name']} in raid {raid_id}"
         try:
             await member.add_roles(role, reason=reason)
         except NotFound:
             pass
         except Forbidden:
             log(member.guild.id,
                 'raid_mute_forbidden',
                 shield,
                 user_name=Utils.escape_markdown(member),
                 user_id=member.id)
         except Exception as ex:
             log(member.guild.id,
                 'raid_mute_unknown_error',
                 shield,
                 user_name=Utils.escape_markdown(member),
                 user_id=member.id)
             await TheRealGearBot.handle_exception('RAID MUTE FAILURE', bot,
                                                   ex)
         finally:
             until = time.time() + duration
             i = await InfractionUtils.add_infraction(member.guild.id,
                                                      member.id,
                                                      member.guild.me.id,
                                                      "Mute",
                                                      reason,
                                                      end=until)
Esempio n. 4
0
 async def on_voice_state_update(self, member, before, after):
     if Features.is_logged(member.guild.id, "VOICE_CHANGES_DETAILED"):
         simple = ["deaf", "mute", "self_mute", "self_deaf", "afk"]
         for s in simple:
             old = getattr(before, s)
             new = getattr(after, s)
             if old != new:
                 key = f"voice_change_{s}_{str(new).lower()}"
                 GearbotLogging.log_key(member.guild.id,
                                        key,
                                        user=Utils.clean_user(member),
                                        user_id=member.id)
     if Features.is_logged(member.guild.id, "VOICE_CHANGES"):
         if before.channel != after.channel:
             parts = dict(user=Utils.clean_user(member), user_id=member.id)
             if before.channel is None:
                 key = "connected_to_voice"
                 parts.update(channel_name=after.channel.name,
                              channel_id=after.channel.id)
             elif after.channel is None:
                 key = "disconnected_voice"
                 parts.update(channel_name=before.channel.name,
                              channel_id=before.channel.id)
             else:
                 key = "moved_voice"
                 parts.update(old_channel_name=before.channel.name,
                              old_channel_id=before.channel.id,
                              new_channel_name=after.channel.name,
                              new_channel_id=after.channel.id)
             GearbotLogging.log_key(member.guild.id, key, **parts)
Esempio n. 5
0
    async def on_member_remove(self, member: discord.Member):
        if member.id == self.bot.user.id: return
        timestamp = datetime.datetime.now()
        exits = self.bot.data["forced_exits"]
        fid = f"{member.guild.id}-{member.id}"
        if fid in exits:
            exits.remove(fid)
            return
        if member.guild.me.guild_permissions.view_audit_log and Features.is_logged(member.guild.id, "MOD_ACTIONS"):
            try:
                async for entry in member.guild.audit_logs(action=AuditLogAction.kick, limit=25):
                    if member.joined_at is None or member.joined_at > entry.created_at or entry.created_at < datetime.datetime.utcfromtimestamp(
                             time.time() - 30):
                        break
                    if entry.target == member:
                        if entry.reason is None:
                            reason = Translator.translate("no_reason", member.guild.id)
                        else:
                            reason = entry.reason
                        i = await InfractionUtils.add_infraction(member.guild.id, entry.target.id, entry.user.id, "Kick", reason,
                                                       active=False)
                        GearbotLogging.log_key(member.guild.id, 'kick_log', user=Utils.clean_user(member), user_id=member.id, moderator=Utils.clean_user(entry.user), moderator_id=entry.user.id, reason=reason, inf=i.id, timestamp=timestamp)
                        return
            except discord.Forbidden:
                permissions = member.guild.me.guild_permissions
                perm_info = ", ".join(f"{name}: {value}" for name, value in permissions)
                await GearbotLogging.bot_log(
                    f"{Emoji.get_chat_emoji('WARNING')} Tried to fetch audit log for {member.guild.name} ({member.guild.id}) but got denied even though it said i have access, guild permissions: ```{perm_info}```")

        if Features.is_logged(member.guild.id, "TRAVEL_LOGS"):
            GearbotLogging.log_key(member.guild.id, 'leave_logging', user=Utils.clean_user(member), user_id=member.id, timestamp=timestamp)
Esempio n. 6
0
    async def warn(self, ctx: commands.Context, member: discord.Member, *, reason: Reason):
        """warn_help"""
        if ctx.author != member and (ctx.author.top_role > member.top_role or ctx.guild.owner == ctx.author):
            if member.id == self.bot.user.id:
                async def yes():
                    channel = self.bot.get_channel(Configuration.get_master_var("inbox", 0))
                    if channel is not None:
                        await channel.send(f"[`{ctx.message.created_at.strftime('%c')}`] {ctx.message.author} (`{ctx.message.author.id}`) submitted feedback: {reason}")
                        await MessageUtils.send_to(ctx, 'YES', 'feedback_submitted')

                message = MessageUtils.assemble(ctx, "THINK", "warn_to_feedback")
                await Confirmation.confirm(ctx, message, on_yes=yes)
            else:
                if member.bot:
                    await MessageUtils.send_to(ctx, "THINK", "cant_warn_bot")
                    return

                i = InfractionUtils.add_infraction(ctx.guild.id, member.id, ctx.author.id, "Warn", reason)
                name = Utils.clean_user(member)
                await MessageUtils.send_to(ctx, 'YES', 'warning_added', user=name, inf=i.id)
                aname = Utils.clean_user(ctx.author)
                GearbotLogging.log_key(ctx.guild.id, 'warning_added_modlog', user=name, moderator=aname, reason=reason,
                                       user_id=member.id, moderator_id=ctx.author.id, inf=i.id)
                if Configuration.get_var(ctx.guild.id, "INFRACTIONS", "DM_ON_WARN"):
                    try:
                        dm_channel = await member.create_dm()
                        await dm_channel.send(
                            f"{Emoji.get_chat_emoji('WARNING')} {Translator.translate('warning_dm', ctx.guild.id, server=ctx.guild.name)}```{reason}```")
                    except discord.Forbidden:
                        GearbotLogging.log_key(ctx.guild.id, 'warning_could_not_dm', user=name,
                                               userid=member.id)
        else:
            await ctx.send(f"{Emoji.get_chat_emoji('NO')} {Translator.translate('warning_not_allowed', ctx.guild.id, user=member)}")
Esempio n. 7
0
 async def kick_punishment(self, v: Violation):
     reason = self.assemble_reason(v)
     i = await InfractionUtils.add_infraction(v.guild.id,
                                              v.member.id,
                                              self.bot.user.id,
                                              'Kick',
                                              reason,
                                              active=False)
     self.bot.data["forced_exits"].add(f"{v.guild.id}-{v.member.id}")
     try:
         await v.guild.kick(v.member, reason=reason)
     except Forbidden:
         GearbotLogging.log_key(v.guild.id,
                                'kick_punishment_failure',
                                user=Utils.clean_user(v.member),
                                user_id=v.member.id,
                                moderator=Utils.clean_user(v.guild.me),
                                moderator_id=v.guild.me.id,
                                reason=reason,
                                inf=i.id)
     else:
         GearbotLogging.log_key(v.guild.id,
                                'kick_log',
                                user=Utils.clean_user(v.member),
                                user_id=v.member.id,
                                moderator=Utils.clean_user(v.guild.me),
                                moderator_id=v.guild.me.id,
                                reason=reason,
                                inf=i.id)
Esempio n. 8
0
 async def execute(self, bot, member, data, raid_id, raider_ids, shield):
     bot.data["forced_exits"].add(f"{member.guild.id}-{member.id}")
     reason = f"Raider kicked by raid shield {shield['name']} in raid {raid_id}"
     try:
         await member.kick(reason=reason)
     except NotFound:
         pass
     except Forbidden:
         log(member.guild.id,
             'raid_kick_forbidden',
             shield,
             user_name=Utils.escape_markdown(member),
             user_id=member.id)
     except Exception as ex:
         log(member.guild.id,
             'raid_kick_unknown_error',
             shield,
             user_name=Utils.escape_markdown(member),
             user_id=member.id)
         await TheRealGearBot.handle_exception('RAID KICK FAILURE', bot, ex)
     finally:
         i = await InfractionUtils.add_infraction(member.guild.id,
                                                  member.id,
                                                  bot.user.id,
                                                  'Kick',
                                                  reason,
                                                  active=False)
         GearbotLogging.log_key(member.guild.id,
                                'kick_log',
                                user=Utils.clean_user(member),
                                user_id=member.id,
                                moderator=Utils.clean_user(member.guild.me),
                                moderator_id=bot.user.id,
                                reason=reason,
                                inf=i.id)
Esempio n. 9
0
 async def _warn(self,
                 ctx,
                 target,
                 *,
                 reason,
                 message=True,
                 dm_action=True):
     i = await InfractionUtils.add_infraction(ctx.guild.id, target.id,
                                              ctx.author.id, "Warn", reason)
     name = Utils.clean_user(target)
     if message:
         await MessageUtils.send_to(ctx,
                                    'YES',
                                    'warning_added',
                                    user=name,
                                    inf=i.id)
     aname = Utils.clean_user(ctx.author)
     GearbotLogging.log_key(ctx.guild.id,
                            'warning_added_modlog',
                            user=name,
                            moderator=aname,
                            reason=reason,
                            user_id=target.id,
                            moderator_id=ctx.author.id,
                            inf=i.id)
     if Configuration.get_var(ctx.guild.id, "INFRACTIONS",
                              "DM_ON_WARN") and dm_action:
         await Utils.send_infraction(self.bot, target, ctx.guild, 'WARNING',
                                     'warn', reason)
Esempio n. 10
0
 async def raid_detected(self, bot, guild, raid_id, raider_ids, shield):
     GearbotLogging.log_key(guild.id,
                            "raid_shield_triggered",
                            raid_id=raid_id,
                            name=self.shield_name)
     await self.handle_actions(self.start_actions, bot, guild, raid_id,
                               raider_ids, shield)
Esempio n. 11
0
 async def shield_terminated(self, bot, guild, raid_id, raider_ids, shield):
     GearbotLogging.log_key(guild.id,
                            "raid_shield_terminated",
                            raid_id=raid_id,
                            name=self.shield_name)
     await self.handle_actions(self.termination_actions, bot, guild,
                               raid_id, raider_ids, shield)
Esempio n. 12
0
 async def on_guild_role_create(self, role):
     if not Features.is_logged(role.guild.id, "ROLE_CHANGES"): return
     entry = await self.find_log(role.guild, AuditLogAction.role_create, lambda e: e.target.id == role.id)
     if entry is None:
         GearbotLogging.log_key(role.guild.id, 'role_created', role=role.name)
     else:
         GearbotLogging.log_key(role.guild.id, 'role_created_by', role=role.name, person=Utils.clean_user(entry.user), person_id=entry.user.id)
Esempio n. 13
0
 async def on_guild_channel_delete(self, channel):
     if not Features.is_logged(channel.guild.id, "CHANNEL_CHANGES"): return
     e = await self.find_log(channel.guild, AuditLogAction.channel_delete, lambda e: e.target.id == channel.id)
     if e is not None:
         GearbotLogging.log_key(channel.guild.id, "channel_deleted_by", channel=channel.name, channel_id=channel.id, person=Utils.clean_user(e.user), person_id=e.user.id)
     else:
         GearbotLogging.log_key(channel.guild.id, "channel_deleted", channel=channel.name, channel_id=channel.id)
Esempio n. 14
0
    async def on_member_update(self, before:discord.Member, after):
        guild = before.guild
        # nickname changes
        if Features.is_logged(guild.id, "NAME_CHANGES"):
            if (before.nick != after.nick and
                    after.nick != before.nick) and f'{before.guild.id}-{before.id}' not in self.bot.data['nickname_changes']:
                name = Utils.clean_user(after)
                before_clean = "" if before.nick is None else Utils.clean_name(before.nick)
                after_clean = "" if after.nick is None else Utils.clean_name(after.nick)
                entry = await self.find_log(guild, AuditLogAction.member_update, lambda e: e.target.id == before.id and hasattr(e.changes.before, "nick") and hasattr(e.changes.after, "nick") and before.nick == e.changes.before.nick and after.nick == e.changes.after.nick and e.created_at > datetime.datetime.utcfromtimestamp(time.time() - 2))
                if before.nick is None:
                    type = "added"
                elif after.nick is None:
                    type = "removed"
                else:
                    type = "changed"
                mod_name = ""
                mod_id = ""
                if entry is None:
                    actor = "unknown"
                elif entry.target.id == entry.user.id:
                    actor = "own"
                else:
                    mod_name = Utils.clean_user(entry.user)
                    mod_id = entry.user.id
                    actor = "mod"
                GearbotLogging.log_key(guild.id, f'{actor}_nickname_{type}', user=name, user_id=before.id, before=before_clean, after=after_clean, moderator=mod_name, moderator_id=mod_id)

        # role changes
        if Features.is_logged(guild.id, "ROLE_CHANGES"):
            removed = []
            added = []
            for role in before.roles:
               if role not in after.roles:
                    removed.append(role)

            for role in after.roles:
                if role not in before.roles:
                    added.append(role)

            if (len(removed) + len(added)) > 0:
                entry = await self.find_log(guild, AuditLogAction.member_role_update,
                                            lambda e: e.target.id == before.id and hasattr(e.changes.before, "roles") and hasattr(
                                                e.changes.after, "roles") and all(
                                                r in e.changes.before.roles for r in removed) and all(
                                                r in e.changes.after.roles for r in
                                                added) and e.created_at > datetime.datetime.utcfromtimestamp(
                                                time.time() - 1))
                if entry is not None:
                    removed = entry.changes.before.roles
                    added = entry.changes.after.roles
                    for role in removed:
                        GearbotLogging.log_key(guild.id, 'role_removed_by', role=role.name, user=Utils.clean_user(entry.target), user_id=entry.target.id, moderator=Utils.clean_user(entry.user), moderator_id=entry.user.id)
                    for role in added:
                        GearbotLogging.log_key(guild.id, 'role_added_by', role=role.name, user=Utils.clean_user(entry.target), user_id=entry.target.id, moderator=Utils.clean_user(entry.user), moderator_id=entry.user.id)
                else:
                    for role in removed:
                        GearbotLogging.log_key(guild.id, 'role_removed', role=role.name, user=Utils.clean_user(before), user_id=before.id)
                    for role in added:
                        GearbotLogging.log_key(guild.id, 'role_added', role=role.name, user=Utils.clean_user(before), user_id=before.id)
Esempio n. 15
0
 async def _warn(ctx, target, *, reason, message=True):
     i = InfractionUtils.add_infraction(ctx.guild.id, target.id,
                                        ctx.author.id, "Warn", reason)
     name = Utils.clean_user(target)
     if message:
         await MessageUtils.send_to(ctx,
                                    'YES',
                                    'warning_added',
                                    user=name,
                                    inf=i.id)
     aname = Utils.clean_user(ctx.author)
     GearbotLogging.log_key(ctx.guild.id,
                            'warning_added_modlog',
                            user=name,
                            moderator=aname,
                            reason=reason,
                            user_id=target.id,
                            moderator_id=ctx.author.id,
                            inf=i.id)
     if Configuration.get_var(ctx.guild.id, "INFRACTIONS", "DM_ON_WARN"):
         try:
             dm_channel = await target.create_dm()
             await dm_channel.send(
                 f"{Emoji.get_chat_emoji('WARNING')} {Translator.translate('warning_dm', ctx.guild.id, server=ctx.guild.name)}```{reason}```"
             )
         except discord.Forbidden:
             GearbotLogging.log_key(ctx.guild.id,
                                    'warning_could_not_dm',
                                    user=name,
                                    userid=target.id)
Esempio n. 16
0
    async def on_member_ban(self, guild, user):
        if user.id == self.bot.user.id or not Features.is_logged(
                guild.id, "MOD_ACTIONS"):
            return
        timestamp = datetime.datetime.now()
        if guild.me.guild_permissions.view_audit_log:
            return

        if await self.bot.redis_pool.get(f"forced_exits:{guild.id}-{user.id}"
                                         ) is not None:
            return

        await self.bot.redis_pool.psetex(f"forced_exits:{guild.id}-{user.id}",
                                         8000, "1")
        await Infraction.filter(user_id=user.id,
                                type="Unban",
                                guild_id=guild.id).update(active=False)
        i = await InfractionUtils.add_infraction(guild.id, user.id, 0, "Ban",
                                                 "Manual ban")
        GearbotLogging.log_key(guild.id,
                               'manual_ban_log',
                               user=Utils.clean_user(user),
                               user_id=user.id,
                               inf=i.id,
                               timestamp=timestamp)
Esempio n. 17
0
    async def violate(self, v: Violation):
        # deterining current punishment
        punish_info = v.bucket["PUNISHMENT"]
        t = punish_info["TYPE"]
        self.bot.dispatch('spam_violation', v)
        key = f"{v.guild.id}-{v.member.id}-{v.bucket['TYPE']}"
        a = self.get_extra_actions(key)
        a.count += v.count

        # Punish and Clean
        GearbotLogging.log_key(v.guild.id, 'spam_violate', user=Utils.clean_user(v.member), user_id=v.member.id,
                               check=v.check.upper(), friendly=v.friendly, channel=v.channel.mention, punishment_type=t)

        await self.punishments[t](v)

        if v.bucket.get("CLEAN", True):
            to_clean = AntiSpam._process_bucket_entries(v.offending_messages)
            by_channel = {}
            for (chan, msg) in to_clean:
                by_channel.setdefault(chan, []).append(msg)

            for (chan, msgs) in by_channel.items():
                guild_chan = v.guild.get_channel(int(chan))
                msgs = [Object(id=x) for x in msgs]
                if guild_chan is not None:
                    # Ensure we only delete 100 at a time. Probably not necessary but you never know with people
                    for group in Utils.chunks(msgs, 100):
                        try:
                            await guild_chan.delete_messages(group)
                        except NotFound:
                            pass
        await asyncio.sleep(v.bucket["SIZE"]["PERIOD"])
        a = self.get_extra_actions(key)
        a.count -= v.count
Esempio n. 18
0
 async def on_guild_role_update(self, before: discord.Role, after):
     if not Features.is_logged(before.guild.id, "ROLE_CHANGES"): return
     timestamp = datetime.datetime.now()
     await self.handle_simple_changes(
         before, after, "role_update_simple", AuditLogAction.role_update,
         ["name", "color", "hoist", "mentionable"], timestamp)
     if before.permissions != after.permissions:
         for perm, value in before.permissions:
             av = getattr(after.permissions, perm)
             if av != value:
                 entry = await self.find_log(
                     before.guild, AuditLogAction.role_update,
                     lambda e: e.target.id == after.id and hasattr(
                         e.before, "permissions"
                     ) and e.before.permissions == before.permissions and e.
                     after.permissions == after.permissions)
                 key = f"role_update_perm_{'added' if av else 'revoked'}"
                 parts = dict(role=await Utils.clean(after.name),
                              role_id=after.id,
                              perm=perm)
                 if entry is not None:
                     key += "_by"
                     parts.update(person=Utils.clean_user(entry.user),
                                  person_id=entry.user.id)
                 GearbotLogging.log_key(after.guild.id,
                                        key,
                                        **parts,
                                        timestamp=timestamp)
Esempio n. 19
0
 async def warn_punishment(self, v: Violation):
     reason = v.bucket["PUNISHMENT"].get("REASON", self.assemble_reason(v))
     i = await InfractionUtils.add_infraction(v.guild.id, v.member.id,
                                              self.bot.user.id, 'Warn',
                                              reason)
     GearbotLogging.log_key(v.guild.id,
                            'warning_added_modlog',
                            user=Utils.clean_user(v.member),
                            moderator=Utils.clean_user(v.guild.me),
                            reason=reason,
                            user_id=v.member.id,
                            moderator_id=v.guild.me.id,
                            inf=i.id)
     try:
         dm_channel = await v.member.create_dm()
         await dm_channel.send(
             MessageUtils.assemble(dm_channel,
                                   'WARNING',
                                   'warning_dm',
                                   server=v.member.guild.name) +
             f"```{reason}```")
     except Forbidden:
         GearbotLogging.log_key(v.member.guild.id,
                                'warning_could_not_dm',
                                user=Utils.escape_markdown(v.member.name),
                                userid=v.member.id)
Esempio n. 20
0
 async def warn_punishment(self, v: Violation):
     reason = v.bucket["PUNISHMENT"].get("REASON", self.assemble_reason(v))
     i = await InfractionUtils.add_infraction(v.guild.id, v.member.id, self.bot.user.id, 'Warn', reason)
     GearbotLogging.log_key(v.guild.id, 'warning_added_modlog', user=Utils.clean_user(v.member),
                            moderator=Utils.clean_user(v.guild.me), reason=reason,
                            user_id=v.member.id, moderator_id=v.guild.me.id, inf=i.id)
     await Utils.send_infraction(self.bot, v.member, v.guild, 'WARNING', 'warning', "Spam")
Esempio n. 21
0
 async def on_member_join(self, member: discord.Member):
     if Features.is_logged(member.guild.id, "TRAVEL_LOGS"):
         dif = (datetime.datetime.utcfromtimestamp(time.time()) -
                member.created_at)
         new_user_threshold = Configuration.get_var(member.guild.id,
                                                    "GENERAL",
                                                    "NEW_USER_THRESHOLD")
         minutes, seconds = divmod(dif.days * 86400 + dif.seconds, 60)
         hours, minutes = divmod(minutes, 60)
         age = (Translator.translate(
             'days', member.guild.id,
             amount=dif.days)) if dif.days > 0 else Translator.translate(
                 'hours', member.guild.id, hours=hours, minutes=minutes)
         if new_user_threshold > dif.total_seconds():
             GearbotLogging.log_key(member.guild.id,
                                    'join_logging_new',
                                    user=Utils.clean_user(member),
                                    user_id=member.id,
                                    age=age)
         else:
             GearbotLogging.log_key(member.guild.id,
                                    'join_logging',
                                    user=Utils.clean_user(member),
                                    user_id=member.id,
                                    age=age)
Esempio n. 22
0
    async def censor_message(self, message, bad, key=""):
        if message.channel.permissions_for(message.guild.me).manage_messages:
            try:
                self.bot.data["message_deletes"].add(message.id)
                await message.delete()
            except discord.NotFound as ex:
                pass
            else:
                clean_message = await Utils.clean(message.content,
                                                  message.guild,
                                                  markdown=False)
                GearbotLogging.log_key(message.guild.id,
                                       f'censored_message{key}',
                                       user=message.author,
                                       user_id=message.author.id,
                                       message=clean_message,
                                       sequence=bad,
                                       channel=message.channel.mention)
                self.bot.dispatch("user_censored", message)
        else:

            clean_message = await Utils.clean(message.content,
                                              message.guild,
                                              markdown=False)
            GearbotLogging.log_key(message.guild.id,
                                   f'censor_message_failed{key}',
                                   user=message.author,
                                   user_id=message.author.id,
                                   message=clean_message,
                                   sequence=bad,
                                   link=message.jump_url)
            self.bot.dispatch("user_censored", message)
Esempio n. 23
0
 async def handle_simple_changes(self, before, after, base_key, action,
                                 attributes):
     for attr in attributes:
         if hasattr(before, attr):
             ba = getattr(before, attr)
             if isinstance(ba, str) and ba.strip() == "":
                 ba = None
             aa = getattr(after, attr)
             if isinstance(aa, str) and aa.strip() == "":
                 aa = None
             key = base_key
             if ba != aa:
                 entry = await self.find_log(
                     before.guild, action,
                     lambda e: e.target.id == before.id and hasattr(
                         e.changes.before, attr) and getattr(
                             e.changes.before, attr) == ba and getattr(
                                 e.changes.after, attr) == aa)
                 parts = dict(before=self.prep_attr(ba),
                              after=self.prep_attr(aa),
                              thing=after,
                              thing_id=after.id,
                              attr=attr)
                 if entry is not None:
                     parts.update(person=entry.user,
                                  person_id=entry.user.id)
                     key += "_by"
                 GearbotLogging.log_key(before.guild.id, key, **parts)
Esempio n. 24
0
async def send_infraction(bot, user, guild, emoji, type, reason, **kwargs):
    if await get_member(bot, guild, user.id) is None:
        return
    try:
        override = Configuration.get_var(guild.id, "INFRACTIONS", type.upper())
        kwargs.update(reason=reason, server=guild.name, guild_id=guild.id)
        if override is not None:
            message = f"{Emoji.get_chat_emoji(emoji)} {format(override, kwargs, Configuration.get_var(guild.id, 'GENERAL', 'LANG'))}```{reason}```"
        else:
            message = f"{Emoji.get_chat_emoji(emoji)} {Translator.translate(f'{type.lower()}_dm', guild.id, **kwargs)}```{reason}```"
        parts = message.split("```")
        out = ""
        wrap = False
        while len(parts) > 0:
            temp = parts.pop(0)
            added = 6 if wrap else 0
            chars = "```" if wrap else ""
            if (len(out) + len(temp) + added) > 2000:
                await user.send(out)
                temp = ""
            out = f"{out}{chars}{temp}{chars}"
            wrap = not wrap
        if len(out) > 0:
            await user.send(out)
    except (discord.HTTPException, AttributeError):
        GearbotLogging.log_key(guild.id,
                               f'{type}_could_not_dm',
                               user=clean_user(user),
                               userid=user.id)
Esempio n. 25
0
 async def on_user_update(self, before:discord.User, after):
     # Username and discriminator changes
     if before.name != after.name or before.discriminator != after.discriminator:
         for guild in self.bot.guilds:
             if guild.get_member(before.id) is not None:
                 after_clean_name = Utils.escape_markdown(Utils.replace_lookalikes(after.name))
                 GearbotLogging.log_key(guild.id, 'username_changed', after_clean=after_clean_name, before=before, user_id=after.id, after=after)
Esempio n. 26
0
 async def kick_punishment(self, v: Violation, member):
     reason = self.assemble_reason(v)
     i = await InfractionUtils.add_infraction(v.guild.id,
                                              member.id,
                                              self.bot.user.id,
                                              'Kick',
                                              reason,
                                              active=False)
     await self.bot.redis_pool.psetex(
         f"forced_exits:{v.guild.id}-{member.id}", 8000, "1")
     try:
         if Configuration.get_var(v.guild.id, "INFRACTIONS", "DM_ON_KICK"):
             asyncio.create_task(
                 Utils.send_infraction(self.bot, member, v.guild, 'BOOT',
                                       'kick', "Spam"))
         await v.guild.kick(member, reason=reason)
     except Forbidden:
         GearbotLogging.log_key(v.guild.id,
                                'kick_punishment_failure',
                                user=Utils.clean_user(member),
                                user_id=member.id,
                                moderator=Utils.clean_user(v.guild.me),
                                moderator_id=v.guild.me.id,
                                reason=reason,
                                inf=i.id)
     else:
         GearbotLogging.log_key(v.guild.id,
                                'kick_log',
                                user=Utils.clean_user(member),
                                user_id=member.id,
                                moderator=Utils.clean_user(v.guild.me),
                                moderator_id=v.guild.me.id,
                                reason=reason,
                                inf=i.id)
Esempio n. 27
0
 async def note(self, ctx, member: DiscordUser, *, reason: Reason):
     i = await InfractionUtils.add_infraction(ctx.guild.id, member.id, ctx.author.id, "Note", reason)
     name = Utils.clean_user(member)
     await MessageUtils.send_to(ctx, 'YES', 'note_added', user=name, inf=i.id)
     aname = Utils.clean_user(ctx.author)
     GearbotLogging.log_key(ctx.guild.id, 'note_added_modlog', user=name, moderator=aname, reason=reason,
                            user_id=member.id, moderator_id=ctx.author.id, inf=i.id)
Esempio n. 28
0
 async def temp_ban_punishment(self, v: Violation, member):
     reason = self.assemble_reason(v)
     duration = v.bucket["PUNISHMENT"]["DURATION"]
     until = time.time() + duration
     await self.bot.redis_pool.psetex(
         f"forced_exits:{v.guild.id}-{member.id}", 8000, 1)
     await v.guild.ban(member, reason=reason, delete_message_days=0)
     i = await InfractionUtils.add_infraction(v.guild.id,
                                              member.id,
                                              self.bot.user.id,
                                              'Tempban',
                                              reason,
                                              end=until)
     if Configuration.get_var(v.guild.id, "INFRACTIONS", "DM_ON_TEMPBAN"):
         dur = Utils.to_pretty_time(duration, None)
         asyncio.create_task(
             Utils.send_infraction(self.bot,
                                   member,
                                   v.guild,
                                   'BAN',
                                   'tempban',
                                   "Spam",
                                   duration=dur))
     GearbotLogging.log_key(
         v.guild.id,
         'tempban_log',
         user=Utils.clean_user(member),
         user_id=member.id,
         moderator=Utils.clean_user(v.guild.me),
         moderator_id=v.guild.me.id,
         reason=reason,
         until=datetime.datetime.utcfromtimestamp(until).replace(
             tzinfo=datetime.timezone.utc),
         inf=i.id)
Esempio n. 29
0
 async def execute(self, bot, member, data, raid_id, raider_ids, shield):
     await bot.redis_pool.psetex(
         f"forced_exits:{member.guild.id}-{member.id}", 8000, 1)
     reason = f"Raider banned by raid shield {shield['name']} in raid {raid_id}"
     try:
         await member.ban(
             reason=reason,
             delete_message_days=1 if data["clean_messages"] else 0)
     except Forbidden:
         log(member.guild.id,
             'raid_ban_forbidden',
             shield,
             user_name=Utils.escape_markdown(member),
             user_id=member.id)
     except Exception as ex:
         log(member.guild.id,
             'raid_ban_unknown_error',
             shield,
             user_name=Utils.escape_markdown(member),
             user_id=member.id)
         await TheRealGearBot.handle_exception('RAID BAN FAILURE', bot, ex)
     finally:
         i = await InfractionUtils.add_infraction(member.guild.id,
                                                  member.id, bot.user.id,
                                                  "Ban", reason)
         GearbotLogging.log_key(member.guild.id,
                                'ban_log',
                                user=Utils.clean_user(member),
                                user_id=member.id,
                                moderator=Utils.clean_user(bot.user),
                                moderator_id=bot.user.id,
                                reason=reason,
                                inf=i.id)
Esempio n. 30
0
 async def on_member_ban(self, guild, user):
     if user.id == self.bot.user.id or not Features.is_logged(guild.id, "MOD_ACTIONS"): return
     fid = f"{guild.id}-{user.id}"
     if fid in self.bot.data["forced_exits"]:
         return
     self.bot.data["forced_exits"].add(fid)
     Infraction.update(active=False).where((Infraction.user_id == user.id) &
                                           (Infraction.type == "Unban") &
                                           (Infraction.guild_id == guild.id)).execute()
     limit = datetime.datetime.utcfromtimestamp(time.time() - 60)
     log = await self.find_log(guild, AuditLogAction.ban, lambda e: e.target == user and e.created_at > limit)
     if log is None:
         await asyncio.sleep(1) #is the api having a fit or so?
         #this fails way to often for my liking, alternative is adding a delay but this seems to do the trick for now
         log = await self.find_log(guild, AuditLogAction.ban, lambda e: e.target == user and e.created_at > limit)
     if log is not None:
         if log.reason is None:
             reason = Translator.translate("no_reason", guild.id)
         else:
             reason = log.reason
         i = InfractionUtils.add_infraction(guild.id, log.target.id, log.user.id, "Ban", reason)
         GearbotLogging.log_key(guild.id, 'ban_log', user=Utils.clean_user(user), user_id=user.id, moderator=Utils.clean_user(log.user), moderator_id=log.user.id, reason=reason, inf=i.id)
     else:
         i = InfractionUtils.add_infraction(guild.id, user.id, 0, "Ban", "Manual ban")
         GearbotLogging.log_key(guild.id, 'manual_ban_log', user=Utils.clean_user(user), user_id=user.id, inf=i.id)