From d6f72a28b64bbb2dec7912c14d1894d9abc9865f Mon Sep 17 00:00:00 2001 From: nex Date: Fri, 17 Mar 2023 09:25:26 +0000 Subject: [PATCH] Properly handle jimmy bans --- cogs/other.py | 7 +++---- main.py | 19 +++++++------------ utils/__init__.py | 23 ++++++++++++++++++++++- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/cogs/other.py b/cogs/other.py index cf3fc28..f272701 100644 --- a/cogs/other.py +++ b/cogs/other.py @@ -29,8 +29,6 @@ from selenium.webdriver.chrome.options import Options as ChromeOptions from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.firefox.options import Options as FirefoxOptions from selenium.webdriver.firefox.service import Service as FirefoxService -from gtts import gTTS, gTTSError - # from selenium.webdriver.ie from utils import console @@ -827,6 +825,7 @@ class OtherCog(commands.Cog): """Converts text to MP3. 5 uses per 10 minutes.""" speed = min(300, max(50, speed)) _bot = self.bot + class TextModal(discord.ui.Modal): def __init__(self): super().__init__( @@ -885,7 +884,7 @@ class OtherCog(commands.Cog): _msg = await interaction.followup.send("Converting text to MP3...") text_pre = self.children[0].value try: - _io = await _bot.loop.run_in_executor(None, _convert, text_pre) + mp3 = await _bot.loop.run_in_executor(None, _convert, text_pre) except (Exception, IOError) as e: await _msg.edit(content="failed. " + str(e)) raise e @@ -903,7 +902,7 @@ class OtherCog(commands.Cog): fn = fn[:28] await _msg.edit( content="Here's your MP3!", - file=discord.File(_io, filename=fn + ".mp3") + file=discord.File(mp3, filename=fn + ".mp3") ) await ctx.send_modal(TextModal()) diff --git a/main.py b/main.py index 1d88e72..49430db 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ import discord from discord.ext import commands import config from datetime import datetime, timezone, timedelta -from utils import console, get_or_none, JimmyBans +from utils import console, get_or_none, JimmyBans, JimmyBanException from utils.client import bot @@ -29,6 +29,8 @@ async def on_application_command_error(ctx: discord.ApplicationContext, error: E f"\N{warning sign} This command is already running. Please wait for it to finish.", ephemeral=True, ) + elif isinstance(error, JimmyBanException): + return await ctx.respond(str(error)) await ctx.respond("Application Command Error: `%r`" % error) raise error @@ -37,6 +39,8 @@ async def on_application_command_error(ctx: discord.ApplicationContext, error: E async def on_command_error(ctx: commands.Context, error: Exception): if isinstance(error, commands.CommandNotFound): return + elif isinstance(error, JimmyBanException): + return await ctx.reply(str(error)) await ctx.reply("Command Error: `%r`" % error) raise error @@ -68,7 +72,7 @@ async def ping(ctx: discord.ApplicationContext): @bot.check_once async def check_not_banned(ctx: discord.ApplicationContext | commands.Context): - if await bot.is_owner(ctx.author) or ctx.command.name in ("block", "unblock"): + if await bot.is_owner(ctx.author) or ctx.command.name in ("block", "unblock", "timetable", "verify", "kys"): return True user = ctx.author ban: JimmyBans = await get_or_none(JimmyBans, user_id=user.id) @@ -77,16 +81,7 @@ async def check_not_banned(ctx: discord.ApplicationContext | commands.Context): if dt < discord.utils.utcnow(): await ban.delete() else: - reply = ctx.reply if isinstance(ctx, commands.Context) else ctx.respond - try: - await reply( - content=f":x: You can use commands {discord.utils.format_dt(dt, 'R')} (reason for ban:" - f" {ban.reason}).", - ) - except discord.HTTPException: - pass - finally: - return False + raise JimmyBanException(dt, ban.reason) return True diff --git a/utils/__init__.py b/utils/__init__.py index 1d96f42..1f9d9f7 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -1,6 +1,7 @@ -from typing import Optional +from typing import Optional, TYPE_CHECKING from urllib.parse import urlparse +import discord from discord.ext import commands from ._email import * @@ -8,6 +9,26 @@ from .db import * from .console import * from .views import * +if TYPE_CHECKING: + from datetime import datetime + + +class JimmyBanException(discord.CheckFailure): + def __init__(self, until: "datetime", reason: str): + super().__init__(reason) + self.until = until + self.reason = reason + + def __str__(self): + ok = discord.utils.format_dt(self.until, "R") + return ( + f"\N{cross mark} You are not allowed to use commands right now. You will be unbanned {ok}.\n" + f"Ban reason:\n>>> {self.reason}" + ) + + def __repr__(self): + return f"" + def simple_embed_paginator( lines: list[str], *, assert_ten: bool = False, empty_is_none: bool = True, **kwargs