umi/app.py

129 lines
3.6 KiB
Python

import discord
import pymumble_py3 as pymumble
""" Declare intents that the bot will use """
intents = discord.Intents.default()
intents.emojis_and_stickers = True
intents.guilds = True
intents.integrations = True
intents.message_content = True
intents.messages = True
intents.members = True
intents.presences = True
intents.reactions = True
intents.voice_states = True
""" Load the bot token """
from dotenv import load_dotenv
from os import getenv
load_dotenv()
DISCORD_TOKEN = getenv("DISCORD_BOT_TOKEN")
DISCORD_GUILD = int(getenv("DISCORD_GUILD_ID"))
""" Initialize the Discord bot """
from discord.ext.commands import Bot, when_mentioned_or
bot = Bot(
command_prefix=when_mentioned_or('..', '>', '.'),
description="A list of commands available",
intents=intents,
# debug_guilds=[GUILD],
max_messages=100_000
)
@bot.event
async def on_ready():
print(f"Logged in as {bot.user} (ID: {bot.user.id})")
print("------")
""" Load cogs """
from os import listdir
def list_all_cogs() -> list[str]:
return [file[:-3] for file in listdir("cogs") if file.endswith(".py")]
for cog in list_all_cogs():
bot.load_extension(f"cogs.{cog}")
# TODO: web server for jukebox and/or soundboard?
# TODO: cog to announce when someone joins vc (maybe delete messages after some time?)
# TODO: purge messages from a user / etc? links, number, bot or human, idk
# TODO: automod? blocklist certain words or urls or whatever
# TODO: warn or kick or ban a user?
# TODO: filter the audit logs for a user? maybe?
# TODO: keep stats or levels? ehhhh
# ================================= ADMIN ======================================
from discord.commands import Option
from discord.ext.commands import Context
from discord import AutocompleteContext, ApplicationContext
async def cog_autocomplete(ctx: AutocompleteContext):
return [cog for cog in list_all_cogs() if cog.lower().startswith( ctx.value.lower() )]
ROLE_ADMIN = 518625964763119616
ROLE_ADMIN_SFW = 727205354353721374
ME = 201046736565829632
def allowed_to_reload(ctx: Context | ApplicationContext):
roles = [role.id for role in ctx.author.roles]
admin = ROLE_ADMIN in roles
sfw_admin = ROLE_ADMIN_SFW in roles
owner = ctx.author.id == ME
return any([admin, sfw_admin, owner])
from cogs.music import Music
def reload_music(ctx):
music: Music = bot.get_cog("Music")
q = music.q
track = music.track
repeat_mode = music.repeat_mode
search_results = music.search_results
bot.reload_extension(f"cogs.music")
music = bot.get_cog("Music")
music.q = q
music.track = track
music.repeat_mode = repeat_mode
music.search_results = search_results
@bot.command(name='reload')
async def reload_prefix(ctx: Context, cog: str = None):
"""Reload an extension (admin command)"""
if not allowed_to_reload(ctx):
return await ctx.send(
"You must be an admin or bot owner to use this command"
)
if not cog:
return await ctx.send("Please specify a cog to reload")
elif cog.lower() == "music":
reload_music(ctx)
else:
bot.reload_extension(f"cogs.{cog}")
await ctx.send(f"Reloaded `{cog}` extension")
@bot.slash_command(
name='reload',
guild_ids=[DISCORD_GUILD],
)
async def reload_slash(
ctx: ApplicationContext,
cog: Option(str, "The cog to be reloaded", autocomplete=cog_autocomplete)
):
"""Reload an extension (admin command)"""
if not allowed_to_reload(ctx):
return await ctx.respond(
"You must be an admin or bot owner to use this command",
ephemeral=True
)
if cog == "music":
reload_music(ctx)
else:
bot.reload_extension(f"cogs.{cog}")
await ctx.respond(f"Reloaded `{cog}` extension", ephemeral=True)
# ================================== END =======================================
""" Run the bot """
bot.run(DISCORD_TOKEN)