Properly handle jimmy bans

This commit is contained in:
Nexus 2023-03-17 09:25:26 +00:00
parent e3c4be4fea
commit d6f72a28b6
Signed by: nex
GPG key ID: 0FA334385D0B689F
3 changed files with 32 additions and 17 deletions

View file

@ -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.chrome.service import Service as ChromeService
from selenium.webdriver.firefox.options import Options as FirefoxOptions from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver.firefox.service import Service as FirefoxService from selenium.webdriver.firefox.service import Service as FirefoxService
from gtts import gTTS, gTTSError
# from selenium.webdriver.ie # from selenium.webdriver.ie
from utils import console from utils import console
@ -827,6 +825,7 @@ class OtherCog(commands.Cog):
"""Converts text to MP3. 5 uses per 10 minutes.""" """Converts text to MP3. 5 uses per 10 minutes."""
speed = min(300, max(50, speed)) speed = min(300, max(50, speed))
_bot = self.bot _bot = self.bot
class TextModal(discord.ui.Modal): class TextModal(discord.ui.Modal):
def __init__(self): def __init__(self):
super().__init__( super().__init__(
@ -885,7 +884,7 @@ class OtherCog(commands.Cog):
_msg = await interaction.followup.send("Converting text to MP3...") _msg = await interaction.followup.send("Converting text to MP3...")
text_pre = self.children[0].value text_pre = self.children[0].value
try: 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: except (Exception, IOError) as e:
await _msg.edit(content="failed. " + str(e)) await _msg.edit(content="failed. " + str(e))
raise e raise e
@ -903,7 +902,7 @@ class OtherCog(commands.Cog):
fn = fn[:28] fn = fn[:28]
await _msg.edit( await _msg.edit(
content="Here's your MP3!", content="Here's your MP3!",
file=discord.File(_io, filename=fn + ".mp3") file=discord.File(mp3, filename=fn + ".mp3")
) )
await ctx.send_modal(TextModal()) await ctx.send_modal(TextModal())

19
main.py
View file

@ -5,7 +5,7 @@ import discord
from discord.ext import commands from discord.ext import commands
import config import config
from datetime import datetime, timezone, timedelta 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 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.", f"\N{warning sign} This command is already running. Please wait for it to finish.",
ephemeral=True, ephemeral=True,
) )
elif isinstance(error, JimmyBanException):
return await ctx.respond(str(error))
await ctx.respond("Application Command Error: `%r`" % error) await ctx.respond("Application Command Error: `%r`" % error)
raise 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): async def on_command_error(ctx: commands.Context, error: Exception):
if isinstance(error, commands.CommandNotFound): if isinstance(error, commands.CommandNotFound):
return return
elif isinstance(error, JimmyBanException):
return await ctx.reply(str(error))
await ctx.reply("Command Error: `%r`" % error) await ctx.reply("Command Error: `%r`" % error)
raise error raise error
@ -68,7 +72,7 @@ async def ping(ctx: discord.ApplicationContext):
@bot.check_once @bot.check_once
async def check_not_banned(ctx: discord.ApplicationContext | commands.Context): 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 return True
user = ctx.author user = ctx.author
ban: JimmyBans = await get_or_none(JimmyBans, user_id=user.id) 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(): if dt < discord.utils.utcnow():
await ban.delete() await ban.delete()
else: else:
reply = ctx.reply if isinstance(ctx, commands.Context) else ctx.respond raise JimmyBanException(dt, ban.reason)
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
return True return True

View file

@ -1,6 +1,7 @@
from typing import Optional from typing import Optional, TYPE_CHECKING
from urllib.parse import urlparse from urllib.parse import urlparse
import discord
from discord.ext import commands from discord.ext import commands
from ._email import * from ._email import *
@ -8,6 +9,26 @@ from .db import *
from .console import * from .console import *
from .views 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"<JimmyBanException until={self.until!r} reason={self.reason!r}>"
def simple_embed_paginator( def simple_embed_paginator(
lines: list[str], *, assert_ten: bool = False, empty_is_none: bool = True, **kwargs lines: list[str], *, assert_ten: bool = False, empty_is_none: bool = True, **kwargs