mirror of
https://gitlab.com/ddorn/tfjm-discord-bot.git
synced 2025-04-28 01:32:35 +00:00
102 lines
2.4 KiB
Python
102 lines
2.4 KiB
Python
import asyncio
|
|
from pprint import pprint
|
|
from functools import wraps
|
|
from io import StringIO
|
|
from typing import Union
|
|
|
|
import discord
|
|
import psutil
|
|
from discord.ext.commands import Bot
|
|
|
|
from src.constants import *
|
|
|
|
|
|
def fg(text, color: int = 0xFFA500):
|
|
r = color >> 16
|
|
g = color >> 8 & 0xFF
|
|
b = color & 0xFF
|
|
return f"\033[38;2;{r};{g};{b}m{text}\033[m"
|
|
|
|
|
|
def french_join(l):
|
|
l = list(l)
|
|
if not l:
|
|
return ""
|
|
if len(l) < 2:
|
|
return l[0]
|
|
start = ", ".join(l[:-1])
|
|
return f"{start} et {l[-1]}"
|
|
|
|
|
|
def has_role(member, role: Union[str, tuple]):
|
|
"""Return whether the member has a role with this name."""
|
|
|
|
if isinstance(role, str):
|
|
return any(r.name == role for r in member.roles)
|
|
else:
|
|
return any(r.name == rol for r in member.roles for rol in role)
|
|
|
|
|
|
def send_and_bin(f):
|
|
"""
|
|
Decorator that allows a command in a cog to just return
|
|
the messages that needs to be sent, and allow the author that
|
|
trigger the message de delete it.
|
|
"""
|
|
|
|
@wraps(f)
|
|
async def wrapped(cog, ctx, *args, **kwargs):
|
|
msg = await f(cog, ctx, *args, **kwargs)
|
|
if msg:
|
|
msg = await ctx.send(msg)
|
|
await cog.bot.wait_for_bin(ctx.author, msg)
|
|
|
|
return wrapped
|
|
|
|
|
|
async def pprint_send(ctx, *objs, **nobjs):
|
|
embed = discord.Embed(title="Debug")
|
|
|
|
nobjs.update({f"Object {i}": o for i, o in enumerate(objs)})
|
|
|
|
for name, obj in nobjs.items():
|
|
out = StringIO()
|
|
pprint(obj, out)
|
|
out.seek(0)
|
|
value = out.read()
|
|
if len(value) > 1000:
|
|
value = value[:500] + "\n...\n" + value[-500:]
|
|
value = f"```py\n{value}\n```"
|
|
embed.add_field(name=name, value=value)
|
|
return await ctx.send(embed=embed)
|
|
|
|
|
|
async def confirm(ctx, bot, prompt):
|
|
msg: discord.Message = await ctx.send(prompt)
|
|
await msg.add_reaction(Emoji.CHECK)
|
|
await msg.add_reaction(Emoji.CROSS)
|
|
|
|
def check(reaction: discord.Reaction, u):
|
|
return (
|
|
ctx.author == u
|
|
and msg.id == reaction.message.id
|
|
and str(reaction.emoji) in (Emoji.CHECK, Emoji.CROSS)
|
|
)
|
|
|
|
reaction, u = await bot.wait_for("reaction_add", check=check)
|
|
|
|
if str(reaction) == Emoji.CHECK:
|
|
await msg.clear_reaction(Emoji.CROSS)
|
|
return True
|
|
else:
|
|
await msg.clear_reaction(Emoji.CHECK)
|
|
return False
|
|
|
|
|
|
def start_time():
|
|
return psutil.Process().create_time()
|
|
|
|
|
|
def setup(bot: Bot):
|
|
pass
|