Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 2

from typing import Any, Dict, Optional

from discord import (


Color,
Embed,
Message
)
from discord.ext.commands import Context
from discord.utils import cached_property

import discord
import asyncio

def shorten(text: Optional[str], max_length: int) -> Optional[str]:


return (text[:max_length - 3] + '...') if text and len(text) > max_length else
text

class _Context(Context):
flags: Dict[str, Any] = {}

@cached_property
def replied_message(self) -> Message:
return self.message.reference.resolved if (
reference := self.message.reference
) and isinstance(reference.resolved, Message) else None

async def send(self, *args, **kwargs) -> Message:


embeds = kwargs.get("embeds", [])
await asyncio.gather(
self.style_embed(embed) for embed in embeds
) if embeds else None

previous_message = kwargs.pop("previous_message", None)


return await (previous_message.edit(*args, **kwargs)
if previous_message else super().send(*args, **kwargs))

async def approve(self, content: str, emoji: str = "✅", **kwargs) -> Message:
return await self.send(
embed=self._create_embed(
0x0be814, f"{emoji} {self.author.mention}: {content}"),
**kwargs,
)

async def warn(self, content: str, emoji: str = "", **kwargs) -> Message:
return await self.send(
embed=self._create_embed(
0xFFA500, f"{emoji} {self.author.mention}: {content}"),
**kwargs,
)

async def style_embed(self, embed: Embed) -> Embed:


embed.color = (
self.author.color
if (self.author.color != discord.Color.default()) and embed.title
else Color.info
)

if not embed.author and embed.title:


embed.set_author(
name=self.author.display_name,
icon_url=self.author.display_avatar,
)

embed.title = shorten(embed.title, 256) if embed.title else None

embed.description = shorten(
embed.description, 4096) if embed.description else None

for i, field in enumerate(embed.fields):


embed.set_field_at(
index=i,
name="**" + field.name + "**",
value=shorten(field.value, 1024),
inline=field.inline,
)

return embed

def _create_embed(self, color: Color, description: str) -> Embed:


return Embed(color=color, description=description)

You might also like