import json import logging import sys import threading import discord import lib from os import path, makedirs, remove, rename from discord.ext import commands from dislash import InteractionClient, Option, OptionType, OptionChoice DEFAULT_PREFIX = "$" # The prefix you want everyone to have if you don't define your own bot_owner = 386629192743256065 def determine_prefix(bot, msg): guild = msg.guild with open('prefix.json', 'r', encoding='utf-8') as fp: # Open the JSON parameter = DEFAULT_PREFIX try: _json = json.load(fp) # Load the custom prefixes except error: _json = {} if guild: # If the guild exists try: parameter = _json[f"{guild.id}"]["prefix"] # Read prefix from json if is setted up except error: pass return parameter intents = discord.Intents.default() intents.members = True bot = commands.Bot(command_prefix=determine_prefix, guild_subscriptions=True, intents=intents) inter_client = InteractionClient(bot, sync_commands=True) threading.current_thread().name = "main" logging.basicConfig(stream=sys.stdout, filemode='w', level='INFO', format='%(asctime)s - %(levelname)s - %(threadName)s - %(message)s') if not path.isfile('prefix.json'): with open('prefix.json', 'w+') as f: f.write("") f.close() for filename in lib.CogsPrepare.cog_list(): try: bot.load_extension(f'cogs.{filename}') logging.info(f'Loaded cog {filename}') except commands.ExtensionNotFound: logging.error(f"Error: {filename} couldn't be found to load.") except commands.ExtensionFailed as error: logging.error(f'Error: {filename} failed to load properly.', error) except commands.ExtensionError: logging.error(f'Error: unknown error with {filename}') @bot.event async def on_ready(): logging.info(f'Bot started') logging.info('We have logged in as {0.user}'.format(bot)) @bot.event async def on_guild_join(guild): for g in guild.members: lib.DB.fill_bd(g.name, g.id, g.bot, g.nick, guild.id) @bot.event async def on_member_join(member): lib.DB.fill_bd(member.name, member.id, member.bot, member.nick, member.guild.id) bot_role = lib.Commands.read_json(member.guild.id, 'bot_role') # Get bot role guest_role = lib.Commands.read_json(member.guild.id, 'guest_role') # Get guest role if bot_role and guest_role: if member.bot == 0: role = discord.utils.get(member.guild.roles, id=guest_role) else: role = discord.utils.get(member.guild.roles, id=bot_role) logging.info(f"Adding to {member} role {role}") await member.add_roles(role) @bot.event async def on_member_update(before: discord.Member, after: discord.Member): sql_update_query = f"""UPDATE "{after.guild.id}" set nick = ? where userid = ?""" data_tuple = (after.nick, before.id) lib.DB.work_with_db(sql_update_query, data_tuple) @bot.command(name="upload_audio") async def upload_audio(ctx, user=None): user = user or ctx.author if ctx.author.guild_permissions.administrator or user is ctx.author: if ctx.message.attachments: from os import error if not path.isdir(f'tmp/{user.id}'): try: makedirs(f'tmp/{user.id}') except error as _error: logging.info(f"Failed to create dir", _error) if not path.isdir(f'audio/{user.id}'): try: makedirs(f'audio/{user.id}') except error as _error: logging.info(f"Failed to create dir", _error) for at in ctx.message.attachments: import mimetypes await at.save(f'tmp/{user.id}/{at.filename}') guess = mimetypes.guess_type(f'tmp/{user.id}/{at.filename}') if guess[0]: from pymediainfo import MediaInfo file = f'tmp/{user.id}/{at.filename}' duration = round(MediaInfo.parse(file).tracks[0].duration / 1000) if duration > 15: await ctx.reply(f'Audio duration is {duration}, but max is 15', ephemeral=True) else: a = lib.DB.read_db(ctx.guild.id, user.id) if a is None: audiolist = f'{user.id}/{at.filename}' else: audiolist = lib.DB.read_db(ctx.guild.id, user.id) + ", " + f'{user.id}/{at.filename}' lib.DB.add_audio(ctx.guild.id, user.id, audiolist) rename(f'tmp/{user.id}/{at.filename}', f'audio/{user.id}/{at.filename}') else: await ctx.reply(f'Failed to find MIME type of {at.filename}', ephemeral=True) remove(f'tmp/{user.id}/{at.filename}') else: await ctx.reply("Has no Attachment", ephemeral=True) else: await ctx.reply(f'You`re not admin. You can add audio only for your own account', ephemeral=True) @inter_client.slash_command( name="cog", description="Work with cogs", options=[ Option( "what_do", description="Specify what do with cogs", type=OptionType.STRING, required=True, choices=[ OptionChoice("load", "load"), OptionChoice("unload", "unload"), OptionChoice("reload", "reload") ] ) ] ) async def slash_cogs(ctx, what_do): if ctx.author.id == bot_owner: await lib.CogsPrepare.work_with_cogs(what_do, bot) await ctx.reply(f'Cogs are {what_do}ed', ephemeral=True) else: await ctx.reply('You`re not bot owner', ephemeral=True) bot.run('OTQ3OTUzOTAxNzgzNjIxNjYy.GTXbMv.KrztaTO7-ivsPEAVjsyikSQ-GP-ANwULmDraig')