def common_command_formatting(context: Context, embed: hikari.Embed, command: commands.Command) -> None: embed.title = CustomHelp.get_command_signature(command) embed.description = inspect.getdoc( command.callback) or "No help found..." if not isinstance(command, commands.Group): embed.footer.text = "Got confused? Be sure to join the support server!" # type: ignore
def _handle_local_attachment(embed: hikari.Embed) -> None: """ We've sent the attachments along with the components. So, we just need to refer to them using the `attachment://` format. This is just a hacky workaround for now. """ if (url := str(embed.image)).startswith("attachment://"): embed.set_image(hikari.URL(url))
def handle_command_is_on_cooldown( _ctx: Context, error: lightbulb.errors.CommandIsOnCooldown, embed: hikari.Embed, ) -> None: """Handles CommandIsOnCooldown error.""" embed.description = "You're on cooldown" embed.set_footer( text=f"Please try again in {round(error.retry_in, 2)} seconds." )
def handle_not_enough_arguments( ctx: Context, error: lightbulb.errors.NotEnoughArguments, embed: hikari.Embed, ) -> None: """Handles NotEnoughArguments error.""" embed.description = "Please pass in the required argument." embed.add_field( name="Usage:", value=f"`{ctx.prefix}{ctx.bot.help_command.get_command_signature(error.command)}`", )
def handle_converter_failure( _ctx: Context, error: lightbulb.errors.ConverterFailure, embed: hikari.Embed, ) -> None: """Handles ConverterFailure error.""" embed.description = error.text
def handle_command_invocation_error( ctx: Context, error: lightbulb.errors.CommandInvocationError, embed: hikari.Embed, ) -> None: """Handles CommandInvocationError error.""" embed.description = str(error.original)
def handle_missing_required_permission( _ctx: Context, error: lightbulb.errors.MissingRequiredPermission, embed: hikari.Embed, ) -> None: """Handles MissingRequiredPermissions error.""" perms = ", ".join( i.replace("_", " ").lower() for i in str(error.permissions).split("|") ) plural = f"permission{'s' * (len(error.permissions) > 1)}" embed.description = f"You're missing {perms} {plural} to invoke this command."
async def execute_guild_webhook(self, guild: GatewayGuild | None, color: Color, suffix: str) -> None: embed = Embed( title=guild.name if guild else "Unknown guild", description= f"I'm now in {plural(len(self.bot.cache.get_guilds_view())):server,}", color=color, ) if guild: (embed.add_field( "Owner:", str( guild.get_member(guild.owner_id) or await self.bot.rest.fetch_user(guild.owner_id)), ).add_field("Member count:", str(guild.member_count or 0)).add_field("ID:", str(guild.id))) await self.execute_webhook(embed=embed, username=f"{self.bot.get_me()} {suffix}")
def handle_bot_missing_required_permission( _ctx: Context, error: lightbulb.errors.BotMissingRequiredPermission, embed: hikari.Embed, ) -> None: """Handles BotMissingPermission error.""" perms = ", ".join( i.replace("_", " ").lower() for i in str(error.permissions).split("|") ) embed.description = ( f"I'm missing {perms} permission{'s' * (len(error.permissions) > 1)}." )
def generate_alliance_embed(alliance: dict, embed: hikari.Embed) -> None: acr = f" ({alliance['acronym']})" if alliance["acronym"] else "" header = f"[{alliance['name']}{acr}]({helpers.ALLIANCE_URL}{alliance['id']})" if alliance["irclink"]: header += f" - [Discord]({alliance['irclink']})" embed.description = header embed.add_field(name="Score", value=f"{alliance['score']:,}", inline=True) embed.add_field(name="Color", value=alliance["color"].title(), inline=True) embed.add_field(name="Members", value=str(len(alliance["nations"])), inline=True) cities = 0 soldiers = 0 tanks = 0 aircraft = 0 ships = 0 missiles = 0 nukes = 0 for nation in alliance["nations"]: cities += nation["num_cities"] soldiers += nation["soldiers"] tanks += nation["tanks"] aircraft += nation["aircraft"] ships += nation["ships"] missiles += nation["missiles"] nukes += nation["nukes"] embed.add_field(name="Soldiers", value=f"{soldiers:,}/{15000 * cities:,}", inline=True) embed.add_field(name="Tanks", value=f"{tanks:,}/{1250 * cities:,}", inline=True) embed.add_field(name="Aircraft", value=f"{aircraft:,}/{75 * cities:,}", inline=True) embed.add_field(name="Ships", value=f"{ships:,}/{15 * cities:,}", inline=True) embed.add_field(name="Missiles", value=f"{missiles:,}", inline=True) embed.add_field(name="Nukes", value=f"{nukes:,}", inline=True) embed.set_thumbnail(alliance["flag"])
class Events(plugins.Plugin): """ A plugin that handles events. This plugin will process commands on message edits and delete the responses if the original messages were deleted. """ def __init__(self, bot: Bot): super().__init__() self.bot = bot if GUILD_LOGS_WEBHOOK_URL: webhook_id, webhook_token = GUILD_LOGS_WEBHOOK_URL.strip( "/").split("/")[-2:] self.execute_webhook = partial(self.bot.rest.execute_webhook, int(webhook_id), webhook_token) for event_type, callback in self.optional_events: bot.subscribe(event_type, callback) @property def optional_events( self, ) -> tuple[tuple[typing.Type[hikari.Event], typing.Callable[ ..., typing.Awaitable[None]]], ..., ]: return ( (GuildJoinEvent, self.on_guild_join), (GuildLeaveEvent, self.on_guild_leave), ) def plugin_remove(self) -> None: if GUILD_LOGS_WEBHOOK_URL: for event_type, callback in self.optional_events: self.bot.unsubscribe(event_type, callback) async def handle_ping(self, message: Message) -> None: if not (me := self.bot.get_me()) or message.content not in ( f"<@{me.id}>", f"<@!{me.id}>", ): return ctx = self.bot.get_context( message, message.content, invoked_with="prefix", invoked_command=self.bot.get_command("prefix"), ) if not self.bot.pool: embed = Embed( title="Prefixes", description= f"Default prefixes: {', '.join(Config.format_prefixes(self.bot.default_prefixes))}", ) await ctx.respond(embed=embed) return with suppress(errors.CommandIsOnCooldown): return await self.bot.get_command("prefix").invoke(ctx)