172 lines
5.8 KiB
Python
172 lines
5.8 KiB
Python
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')
|