async def edit_word_blocker(ev, pld):
    """
    :param ev: The event object referenced in the event.
    :type ev: sigma.core.mechanics.event.SigmaEvent
    :param pld: The event payload data to process.
    :type pld: sigma.core.mechanics.payload.MessageEditPayload
    """
    after = pld.after
    if after.guild:
        if isinstance(after.author, discord.Member):
            override = check_filter_perms(after, pld.settings, 'words')
            is_owner = after.author.id in ev.bot.cfg.dsc.owners
            if not any([after.author.guild_permissions.administrator, is_owner, override]):
                prefix = ev.db.get_prefix(pld.settings)
                if not after.content.startswith(prefix):
                    text = clean_word(after.content)
                    elements = text.split(' ')
                    blocked_words = pld.settings.get('blocked_words') or []
                    hard_blocked_words = pld.settings.get('hardblocked_words') or []
                    remove = False
                    reason = None
                    for word in blocked_words:
                        if word in elements:
                            remove = True
                            reason = word
                            break
                    for word in hard_blocked_words:
                        if word in after.content:
                            remove = True
                            reason = word
                    if remove:
                        try:
                            filter_warn = pld.settings.get('filter_auto_warn')
                            if filter_warn:
                                warn_data = warning_data(after.guild.me, after.author, f'Said "{reason}".')
                                await ev.db[ev.db.db_nam].Warnings.insert_one(warn_data)
                            await after.delete()
                            title = f'🔥 Your message was deleted for containing "{reason}".'
                            to_author = discord.Embed(color=0xFFCC4D, title=title)
                            try:
                                await after.author.send(embed=to_author)
                            except (discord.Forbidden, discord.HTTPException):
                                pass
                            author = f'{after.author.name}#{after.author.discriminator}'
                            title = f'I deleted {author}\'s message for containing "{reason}".'
                            log_embed = discord.Embed(color=0xFFCC4D, timestamp=arrow.utcnow().datetime)
                            log_embed.description = f'Content: {after.content}'
                            log_embed.set_author(name=title, icon_url=user_avatar(after.author))
                            log_embed.set_footer(text=f'Channel: #{after.channel.name} [{after.channel.id}]')
                            await log_event(ev.bot, pld.settings, log_embed, 'log_filters')
                        except (discord.ClientException, discord.NotFound, discord.Forbidden):
                            pass
Exemple #2
0
async def edit_invite_blocker(ev, pld):
    """
    :param ev: The event object referenced in the event.
    :type ev: sigma.core.mechanics.event.SigmaEvent
    :param pld: The event payload data to process.
    :type pld: sigma.core.mechanics.payload.MessageEditPayload
    """
    after = pld.after
    if after.guild:
        if isinstance(after.author, discord.Member):
            override = check_filter_perms(after, pld.settings, 'invites')
            is_owner = after.author.id in ev.bot.cfg.dsc.owners
            if not any([after.author.guild_permissions.administrator, is_owner, override]):
                active = pld.settings.get('block_invites')
                if active:
                    arguments = after.content.split(' ')
                    invite_found = None
                    for arg in arguments:
                        triggers = ['discord.gg', 'discordapp.com/invite']
                        for trigger in triggers:
                            if trigger in arg:
                                try:
                                    code = arg.split('/')[-1]
                                    invite_found = await ev.bot.fetch_invite(code)
                                    break
                                except (discord.NotFound, IndexError):
                                    pass
                    if invite_found:
                        try:
                            invite_warn = pld.settings.get('invite_auto_warn')
                            if invite_warn:
                                reason = f'Sent an invite to {invite_found.guild.name}.'
                                warn_data = warning_data(after.guild.me, after.author, reason)
                                await ev.db[ev.db.db_nam].Warnings.insert_one(warn_data)
                            await after.delete()
                            title = f'⛓ Invite links are not allowed on {after.guild.name}.'
                            response = discord.Embed(color=0xF9F9F9, title=title)
                            try:
                                await after.author.send(embed=response)
                            except discord.Forbidden:
                                pass
                            log_embed = discord.Embed(color=0xF9F9F9)
                            author = f'{after.author.name}#{after.author.discriminator}'
                            log_embed.set_author(name=f'I removed {author}\'s invite link.',
                                                 icon_url=user_avatar(after.author))
                            log_embed.set_footer(
                                text=f'Posted In: #{after.channel.name} | Leads To: {invite_found.guild.name}')
                            await log_event(ev.bot, pld.settings, log_embed, 'log_filters')
                        except (discord.ClientException, discord.NotFound, discord.Forbidden):
                            pass
Exemple #3
0
 async def execute(self, payload):
     """
     Runs necessary checks and executes the command function.
     :type payload: sigma.core.mechanics.payload.CommandPayload
     """
     if self.bot.ready:
         if payload.msg.guild:
             delete_command_message = payload.settings.get(
                 'delete_commands')
             if delete_command_message:
                 try:
                     await payload.msg.delete()
                 except (discord.Forbidden, discord.NotFound):
                     pass
             override = check_filter_perms(payload.msg, payload.settings,
                                           'arguments')
             if await self.check_black_args(payload.settings, payload.args):
                 if not any([
                         payload.msg.author.guild_permissions.administrator,
                         override
                 ]):
                     await self.respond_with_emote(payload.msg, '🛡')
                     return
         if not self.bot.cfg.dsc.bot and payload.msg.author.id != self.bot.user.id:
             self.log.warning(f'{payload.msg.author.name} tried using me.')
             return
         if not self.cd.is_cooling(payload.msg):
             if not await self.bot.cool_down.on_cooldown(
                     f'{self.name}_core', payload.msg.author):
                 await self.update_cooldown(payload.msg.author)
                 perms, guild_perms = await self.check_permissions(payload)
                 exec_timestamp = arrow.utcnow().float_timestamp
                 self.log_command_usage(payload.msg, payload.args,
                                        exec_timestamp)
                 self.cd.set_cooling(payload.msg)
                 if perms.permitted:
                     if guild_perms.permitted:
                         requirements = CommandRequirements(
                             self, payload.msg)
                         if requirements.reqs_met:
                             try:
                                 executed = False
                                 last_error = None
                                 client_os_broken_tries = 0
                                 while client_os_broken_tries < 3 and not executed:
                                     try:
                                         await self.add_detailed_stats(
                                             payload, exec_timestamp)
                                         await getattr(
                                             self.command,
                                             self.name)(self, payload)
                                         executed = True
                                     except CancelledError:
                                         pass
                                     except aiohttp.ClientOSError as err:
                                         last_error = err
                                         client_os_broken_tries += 1
                                         await asyncio.sleep(1)
                                 if not executed:
                                     raise last_error
                                 await add_cmd_stat(self)
                                 await self.add_usage_sumarum(payload.msg)
                                 self.bot.command_count += 1
                                 cmd_ev_pld = CommandEventPayload(
                                     self.bot, self, payload)
                                 event_task = self.bot.queue.event_runner(
                                     'command', cmd_ev_pld)
                                 self.bot.loop.create_task(event_task)
                             except self.get_exception() as e:
                                 error = SigmaError(self, e)
                                 await error.error_handler(payload)
                         else:
                             await self.respond_with_emote(payload.msg, '📝')
                             await self.send_requirements_error(
                                 requirements, payload)
                     else:
                         self.log.warning(
                             'ACCESS DENIED: This module or command is not allowed in this location.'
                         )
                         await self.respond_with_emote(payload.msg, '🔒')
                 else:
                     perms.log_unpermitted()
                     await self.respond_with_emote(payload.msg, '⛔')
                     if perms.response:
                         try:
                             await payload.msg.channel.send(
                                 embed=perms.response)
                         except (discord.Forbidden, discord.NotFound):
                             pass
             else:
                 await self.respond_with_emote(payload.msg, '❄')
         else:
             await self.respond_with_emote(payload.msg, '🕙')
async def extension_blocker(ev, pld):
    """
    :param ev: The event object referenced in the event.
    :type ev: sigma.core.mechanics.event.SigmaEvent
    :param pld: The event payload data to process.
    :type pld: sigma.core.mechanics.payload.MessagePayload
    """
    if pld.msg.guild:
        if pld.msg.attachments:
            if isinstance(pld.msg.author, discord.Member):
                override = check_filter_perms(pld.msg, pld.settings,
                                              'extensions')
                is_owner = pld.msg.author.id in ev.bot.cfg.dsc.owners
                if not any([
                        pld.msg.author.guild_permissions.administrator,
                        is_owner, override
                ]):
                    att_files = [
                        att.filename.lower() for att in pld.msg.attachments
                    ]
                    bexts = pld.settings.get('blocked_extensions') or []
                    delete = False
                    reason = None
                    for attf in att_files:
                        for bext in bexts:
                            if attf.endswith(bext):
                                delete = True
                                reason = bext
                                break
                        if delete:
                            break
                    if delete:
                        try:
                            filter_warn = pld.settings.get('filter_auto_warn')
                            if filter_warn:
                                warn_data = warning_data(
                                    pld.msg.guild.me, pld.msg.author,
                                    f'Said "{reason}".')
                                await ev.db[ev.db.db_nam
                                            ].Warnings.insert_one(warn_data)
                            await pld.msg.delete()
                            title = f'🔥 Your upload was deleted for containing a "{reason}" file.'
                            to_author = discord.Embed(color=0xFFCC4D,
                                                      title=title)
                            try:
                                await pld.msg.author.send(embed=to_author)
                            except discord.Forbidden:
                                pass
                            author = f'{pld.msg.author.name}#{pld.msg.author.discriminator}'
                            title = f'I deleted {author}\'s upload for having a `{reason}`.'
                            log_embed = discord.Embed(
                                color=0xFFCC4D,
                                timestamp=arrow.utcnow().datetime)
                            log_embed.description = f'Content: {pld.msg.content}'
                            log_embed.set_author(name=title,
                                                 icon_url=user_avatar(
                                                     pld.msg.author))
                            log_embed.set_footer(
                                text=
                                f'Channel: #{pld.msg.channel.name} [{pld.msg.channel.id}]'
                            )
                            await log_event(ev.bot, pld.settings, log_embed,
                                            'log_filters')
                        except (discord.ClientException, discord.NotFound,
                                discord.Forbidden):
                            pass