tuxbot-bot/tuxbot/cogs/Tags/tags.py
2021-05-16 15:27:27 +02:00

214 lines
6.2 KiB
Python

import logging
from typing import Optional
import discord
from discord.ext import commands, menus
from tuxbot.cogs.Tags.functions.converters import TagConverter, NewTagConverter
from tuxbot.cogs.Tags.functions.exceptions import (
UnknownTagException,
ExistingTagException,
TooLongTagException,
ReservedTagException,
)
from tuxbot.cogs.Tags.functions.paginator import TagPages
from tuxbot.cogs.Tags.functions.utils import (
get_tag,
get_all_tags,
search_tags,
create_tag,
edit_tag,
)
from tuxbot.core.bot import Tux
from tuxbot.core.i18n import (
Translator,
)
from tuxbot.core.utils.functions.extra import (
group_extra,
ContextPlus,
)
log = logging.getLogger("tuxbot.cogs.Tags")
_ = Translator("Tags", __file__)
class Tags(commands.Cog):
def __init__(self, bot: Tux):
self.bot = bot
async def cog_command_error(self, ctx: ContextPlus, error):
if isinstance(
error,
(
UnknownTagException,
ExistingTagException,
TooLongTagException,
ReservedTagException,
),
):
await ctx.send(_(str(error), ctx, self.bot.config))
# =========================================================================
# =========================================================================
@group_extra(name="tag", invoke_without_command=True, deletable=False)
@commands.guild_only()
async def _tag(self, ctx: ContextPlus, *, name: TagConverter):
tag_row = await get_tag(ctx.guild.id, str(name))
await ctx.send(tag_row.content)
tag_row.uses += 1 # type: ignore
await tag_row.save()
@_tag.command(name="delete")
async def _tag_delete(self, ctx: ContextPlus, *, name: TagConverter):
tag_row = await get_tag(ctx.guild.id, str(name))
backdoor = (
await ctx.bot.is_owner(ctx.author)
or ctx.author.guild_permissions.manage_messages
)
if backdoor or ctx.author.id == tag_row.id:
await tag_row.delete()
return await ctx.send(
_("Tag successfully deleted", ctx, self.bot.config)
)
await ctx.send(_("Your can't delete this tag", ctx, self.bot.config))
@_tag.command(name="create", aliases=["add"])
async def _tag_create(
self, ctx, name: NewTagConverter, *, content: commands.clean_content
):
await create_tag(ctx, str(name), str(content))
await ctx.send(_("Tag successfully created", ctx, self.bot.config))
@_tag.command(name="edit")
async def _tag_edit(
self, ctx, name: TagConverter, *, content: commands.clean_content
):
tag_row = await get_tag(ctx.guild.id, str(name))
backdoor = (
await ctx.bot.is_owner(ctx.author)
or ctx.author.guild_permissions.manage_messages
)
if backdoor or ctx.author.id == tag_row.id:
await edit_tag(ctx, str(name), str(content))
return await ctx.send(
_("Tag successfully edited", ctx, self.bot.config)
)
await ctx.send(_("Your can't edit this tag", ctx, self.bot.config))
@_tag.command(name="info", aliases=["owner"])
async def _tag_info(self, ctx: ContextPlus, *, name: TagConverter):
tag_row = await get_tag(ctx.guild.id, str(name))
e = discord.Embed(color=discord.Colour.blue())
owner_id = tag_row.author_id
e.title = tag_row.name
e.timestamp = tag_row.created_at
user = self.bot.get_user(owner_id) or (
await self.bot.fetch_user(owner_id)
)
e.set_author(name=str(user), icon_url=user.avatar.url)
e.add_field(
name=_("Owner", ctx, self.bot.config), value=f"<@{owner_id}>"
)
e.add_field(name=_("Uses", ctx, self.bot.config), value=tag_row.uses)
await ctx.send(embed=e)
@_tag.command(name="search", aliases=["find"])
async def _tag_search(
self, ctx: ContextPlus, *, name: commands.clean_content
):
q = str(name)
if len(q) < 3:
return await ctx.send(
_(
"The search must be at least 3 characters",
ctx,
self.bot.config,
)
)
tags = await search_tags(ctx.guild.id, q)
if tags:
try:
p = TagPages(entries=tags)
await p.start(ctx)
except menus.MenuError as e:
await ctx.send(e)
else:
await ctx.send(_("No tags found", ctx, self.bot.config))
@_tag.command(name="list")
async def _tag_list(
self, ctx: ContextPlus, author: Optional[discord.Member]
):
author = author or ctx.author
tags = await get_all_tags(ctx.guild.id, author)
if tags:
try:
p = TagPages(entries=tags)
p.embed.set_author(
name=str(author), icon_url=author.avatar.url
)
await p.start(ctx)
except menus.MenuError as e:
await ctx.send(e)
else:
await ctx.send(
_("No tags found for {}", ctx, self.bot.config).format(author)
)
@_tag.command(name="all")
async def _tag_all(self, ctx: ContextPlus):
tags = await get_all_tags(ctx.guild.id)
if tags:
try:
p = TagPages(entries=tags)
await p.start(ctx)
except menus.MenuError as e:
await ctx.send(e)
else:
await ctx.send(
_("No tags found for {}", ctx, self.bot.config).format(
ctx.guild.name
)
)
@_tag.command(name="claim")
async def _tag_claim(self, ctx: ContextPlus, *, name: TagConverter):
tag_row = await get_tag(ctx.guild.id, str(name))
if await ctx.guild.fetch_member(tag_row.author_id) is not None:
return await ctx.send(
_("Tag owner is on this server.", ctx, self.bot.config)
)
tag_row.author_id = ctx.author.id
await tag_row.save()
await ctx.send(
_("This tag is now owned by you.", ctx, self.bot.config)
)