async def custom_command(ev: SigmaEvent, message: discord.Message): if message.guild: prefix = await ev.db.get_prefix(message) if message.content.startswith(prefix): if message.content != prefix and not message.content.startswith( prefix + ' '): cmd = message.content[len(prefix):].lower().split()[0] if cmd not in ev.bot.modules.commands and cmd not in ev.bot.modules.alts: perms = ServerCommandPermissions(ev, message) await perms.check_perms() if perms.permitted: custom_commands = await ev.db.get_guild_settings( message.guild.id, 'CustomCommands') if custom_commands is None: custom_commands = {} if cmd in custom_commands: cmd_text = custom_commands[cmd] img = False if cmd_text.startswith('http'): img_endings = ['.gif', '.png', '.jpg', '.jpeg'] for ending in img_endings: if cmd_text.endswith(ending): img = True break if img: response = discord.Embed().set_image( url=cmd_text) await message.channel.send(embed=response) else: response = command_message_parser( message, cmd_text) await message.channel.send(response) log_command_usage(ev.log, message, cmd)
async def commands(cmd: SigmaCommand, message: discord.Message, args: list): if args: lookup = ' '.join(args).lower() command_items = cmd.bot.modules.commands command_list = [] for command in command_items: command = command_items[command] category = command.category.lower() if category == lookup: if message.guild: permission = ServerCommandPermissions(command, message) await permission.check_perms() else: permission = None command_list.append([command, permission]) if command_list: module_list = sorted(command_list, key=lambda x: x[0].name) output = '' for module_item, module_perm in module_list: if module_perm: if module_perm.permitted: output += f'\n- {module_item.name}' else: output += f'\n- ⛔ {module_item.name}' else: output += f'\n- {module_item.name}' if module_item.alts: output += f' [{", ".join(module_item.alts)}]' title_text = f'```py\nThere are {len(module_list)} commands.\n```' response = discord.Embed(color=0x1B6F5F) response.add_field(name=f'{lookup.upper()} Commands', value=title_text, inline=False) response.add_field(name='Commands List', value=f'```yml\n{output}\n```', inline=False) else: response = discord.Embed(color=0x696969, title='🔍 Nothing was found...') else: pfx = await cmd.db.get_prefix(message) command_list = cmd.bot.modules.commands module_list = [] for command in command_list: command = command_list[command] category = command.category.upper() if category not in module_list: module_list.append(category) module_list = sorted(module_list) output = '' for module_item in module_list: output += f'\n- {module_item}' module_list_out = f'```py\nThere are {len(module_list)} modules.\n```' response = discord.Embed(color=0x1B6F5F) response.add_field(name='Sigma Modules', value=module_list_out, inline=False) response.add_field(name='Module List', value=f'```yml\n{output}\n```', inline=False) response.set_footer(text=f'Type {pfx}{cmd.name} [module] to see commands in that module.') await message.channel.send(embed=response)
async def check_permissions(self, payload): """ Runs all permission checks and initializers. :type payload: sigma.core.mechanics.payload.CommandPayload :rtype: GlobalCommandPermissions, ServerCommandPermissions """ perms = GlobalCommandPermissions(self, payload) await perms.check_black_usr() await perms.check_black_srv() perms.generate_response() perms.check_final() guild_perms = ServerCommandPermissions(self, payload.msg) await guild_perms.check_perms() return perms, guild_perms
async def custom_command(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: prefix = ev.db.get_prefix(pld.settings) if pld.msg.content.startswith(prefix): if pld.msg.content != prefix and not pld.msg.content.startswith( prefix + ' '): cmd = pld.msg.content[len(prefix):].lower().split()[0] if cmd not in ev.bot.modules.commands and cmd not in ev.bot.modules.alts: perms = ServerCommandPermissions(ev, pld.msg) await perms.check_perms() if perms.permitted: custom_commands = pld.settings.get('custom_commands') if custom_commands is None: custom_commands = {} if cmd in custom_commands: delcmd = pld.settings.get('delete_commands') if delcmd: try: await pld.msg.delete() except (discord.NotFound, discord.Forbidden): pass cmd_text = custom_commands[cmd] img = False if cmd_text.startswith('http'): img_endings = ['.gif', '.png', '.jpg', '.jpeg'] for ending in img_endings: if cmd_text.endswith(ending): img = True break if img: response = discord.Embed().set_image( url=cmd_text) await pld.msg.channel.send(embed=response) else: response = command_message_parser( pld.msg, cmd_text) await pld.msg.channel.send( escape_mentions(response, pld.msg.guild)) log_command_usage(ev.log, pld.msg, cmd)
async def execute(self, message, args): if self.bot.ready: if message.guild: delete_command_message = self.db.get_guild_settings(message.guild.id, 'DeleteCommands') if delete_command_message: try: await message.delete() except discord.Forbidden: pass except discord.NotFound: pass if not self.bot.cfg.dsc.bot and message.author.id != self.bot.user.id: self.log.warning(f'{message.author.name} tried using me.') return perms = GlobalCommandPermissions(self, message) guild_allowed = ServerCommandPermissions(self, message) self.log_command_usage(message, args) if perms.permitted: if guild_allowed.permitted: requirements = CommandRequirements(self, message) if requirements.reqs_met: try: await getattr(self.command, self.name)(self, message, args) await add_cmd_stat(self.db, self, message, args) except self.get_exception() as e: await self.respond_with_icon(message, '❗') err_token = secrets.token_hex(16) self.log_error(message, args, e, err_token) title = '❗ An Error Occurred!' err_text = 'Something seems to have gone wrong.' err_text += '\nPlease send this token to our support server.' err_text += f'\nThe invite link is in the **{self.bot.get_prefix(message)}help** command.' err_text += f'\nToken: **{err_token}**' error_embed = discord.Embed(color=0xBE1931) error_embed.add_field(name=title, value=err_text) try: await message.author.send(embed=error_embed) except discord.Forbidden: pass else: await self.respond_with_icon(message, '❗') reqs_embed = discord.Embed(color=0xBE1931) reqs_error_title = f'❗ I am missing permissions!' reqs_error_list = '' for req in requirements.missing_list: req = req.replace('_', ' ').title() reqs_error_list += f'\n- {req}' reqs_embed.add_field(name=reqs_error_title, value=f'```\n{reqs_error_list}\n```') reqs_embed.set_footer(text=f'{self.bot.get_prefix(message)}{self.name}') try: await message.author.send(embed=reqs_embed) except discord.Forbidden: pass else: self.log.warning('ACCESS DENIED: This module or command is not allowed on this server.') await self.respond_with_icon(message, '⛔') else: self.log_unpermitted(perms) await self.respond_with_icon(message, '⛔') if perms.response: try: await message.author.send(embed=perms.response) except discord.Forbidden: pass
async def execute(self, message: discord.Message, args: list): if self.bot.ready: if message.guild: delete_command_message = await self.db.get_guild_settings( message.guild.id, 'delete_commands') if delete_command_message: try: await message.delete() except (discord.Forbidden, discord.NotFound): pass if await self.check_black_args(message.guild, args): await self.respond_with_icon(message, '🛡') return if not self.bot.cfg.dsc.bot and message.author.id != self.bot.user.id: self.log.warning(f'{message.author.name} tried using me.') return if not self.cd.is_cooling(message): if not await self.bot.cool_down.on_cooldown( f'{self.name}_core', message.author): await self.update_cooldown(message.author) perms = GlobalCommandPermissions(self, message) await perms.check_black_usr() await perms.check_black_srv() await perms.generate_response() perms.check_final() guild_allowed = ServerCommandPermissions(self, message) await guild_allowed.check_perms() self.log_command_usage(message, args, arrow.utcnow().float_timestamp) self.cd.set_cooling(message) if perms.permitted: if guild_allowed.permitted: requirements = CommandRequirements(self, message) if requirements.reqs_met: try: await getattr(self.command, self.name)(self, message, args) await add_cmd_stat(self) # await self.add_usage_exp(message) self.bot.command_count += 1 event_task = self.bot.queue.event_runner( 'command', self, message, args) self.bot.loop.create_task(event_task) except self.get_exception() as e: error = SigmaError(self, e) await error.error_handler(message, args) else: await self.respond_with_icon(message, '📝') reqs_embed = discord.Embed(color=0xBE1931) reqs_error_title = f'❗ {self.bot.user.name} is missing permissions!' reqs_error_list = '' for req in requirements.missing_list: req = req.replace('_', ' ').title() reqs_error_list += f'\n- {req}' prefix = await self.db.get_prefix(message) reqs_embed.add_field( name=reqs_error_title, value=f'```\n{reqs_error_list}\n```') reqs_embed.set_footer( text= f'{prefix}{self.name} could not execute.') try: await message.channel.send(embed=reqs_embed ) except (discord.Forbidden, discord.NotFound): pass else: self.log.warning( 'ACCESS DENIED: This module or command is not allowed in this location.' ) await self.respond_with_icon(message, '🔒') else: perms.log_unpermitted() await self.respond_with_icon(message, '⛔') if perms.response: try: await message.channel.send(embed=perms.response ) except (discord.Forbidden, discord.NotFound): pass else: await self.respond_with_icon(message, '❄') else: await self.respond_with_icon(message, '🕙')
async def execute(self, message: discord.Message, args: list): if self.bot.ready: if message.guild: delete_command_message = await self.db.get_guild_settings(message.guild.id, 'DeleteCommands') if delete_command_message: try: await message.delete() except discord.Forbidden: pass except discord.NotFound: pass if not self.bot.cfg.dsc.bot and message.author.id != self.bot.user.id: self.log.warning(f'{message.author.name} tried using me.') return if not self.cd.is_cooling(message): perms = GlobalCommandPermissions(self, message) await perms.check_black_usr() await perms.check_black_srv() await perms.generate_response() perms.check_final() guild_allowed = ServerCommandPermissions(self, message) await guild_allowed.check_perms() self.log_command_usage(message, args) self.cd.set_cooling(message) if perms.permitted: if guild_allowed.permitted: requirements = CommandRequirements(self, message) if requirements.reqs_met: try: await getattr(self.command, self.name)(self, message, args) await add_cmd_stat(self) if self.stats: await self.add_elastic_stats(message, args) await self.add_usage_exp(message) self.bot.command_count += 1 self.bot.loop.create_task(self.bot.queue.event_runner('command', self, message, args)) except self.get_exception() as e: await self.respond_with_icon(message, '❗') err_token = secrets.token_hex(16) await self.log_error(message, args, e, err_token) prefix = await self.db.get_prefix(message) title = '❗ An Error Occurred!' err_text = 'Something seems to have gone wrong.' err_text += '\nPlease send this token to our support server.' err_text += f'\nThe invite link is in the **{prefix}help** command.' err_text += f'\nToken: **{err_token}**' error_embed = discord.Embed(color=0xBE1931) error_embed.add_field(name=title, value=err_text) try: await message.channel.send(embed=error_embed) except discord.Forbidden: pass else: await self.respond_with_icon(message, '❗') reqs_embed = discord.Embed(color=0xBE1931) reqs_error_title = f'❗ Sigma is missing permissions!' reqs_error_list = '' for req in requirements.missing_list: req = req.replace('_', ' ').title() reqs_error_list += f'\n- {req}' prefix = await self.db.get_prefix(message) reqs_embed.add_field(name=reqs_error_title, value=f'```\n{reqs_error_list}\n```') reqs_embed.set_footer(text=f'{prefix}{self.name} could not execute.') try: await message.channel.send(embed=reqs_embed) except discord.Forbidden: pass else: self.log.warning('ACCESS DENIED: This module or command is not allowed in this location.') await self.respond_with_icon(message, '⛔') else: perms.log_unpermitted() await self.respond_with_icon(message, '⛔') if perms.response: try: await message.channel.send(embed=perms.response) except discord.Forbidden: pass else: await self.respond_with_icon(message, '🕙')
async def commands(cmd, pld): """ :param cmd: The command object referenced in the command. :type cmd: sigma.core.mechanics.command.SigmaCommand :param pld: The payload with execution data and details. :type pld: sigma.core.mechanics.payload.CommandPayload """ if pld.args: lookup = pld.args[0].lower() command_items = cmd.bot.modules.commands command_list = [] for command in command_items: command = command_items[command] category = command.category.lower() if category == lookup: if pld.msg.guild: permission = ServerCommandPermissions(command, pld.msg) await permission.check_perms() else: permission = None command_list.append([command, permission]) if command_list: module_list = sorted(command_list, key=lambda x: x[0].name) module_count = len(module_list) page = pld.args[1] if len(pld.args) > 1 else 1 module_list, page = PaginatorCore.paginate(module_list, page, 30) output = '' for module_item, module_perm in module_list: if module_perm: if module_perm.permitted: output += f'\n- {module_item.name}' else: output += f'\n- ⛔ {module_item.name}' else: output += f'\n- {module_item.name}' if module_item.alts: output += f' [{", ".join(module_item.alts)}]' if output: title_text = f'```py\nThere are {module_count} commands.\n```' response = discord.Embed(color=0x1B6F5F) response.add_field(name=f'{lookup.upper()} Commands', value=title_text, inline=False) response.add_field(name=f'Commands List | Page {page}', value=f'```yml\n{output}\n```', inline=False) else: response = not_found(f'No commands on page {page}.') else: response = not_found('Module not found.') else: pfx = cmd.db.get_prefix(pld.settings) command_list = cmd.bot.modules.commands module_list = [] for command in command_list: command = command_list[command] category = command.category.upper() if category not in module_list: module_list.append(category) module_list = sorted(module_list) output = '' for module_item in module_list: output += f'\n- {module_item}' module_list_out = f'```py\nThere are {len(module_list)} modules.\n```' response = discord.Embed(color=0x1B6F5F) response.add_field(name='Modules', value=module_list_out, inline=False) response.add_field(name='Module List', value=f'```yml\n{output}\n```', inline=False) response.set_footer( text= f'Type {pfx}{cmd.name} [module] to see commands in that module.') await pld.msg.channel.send(embed=response)