diff --git a/Bot/bot.py b/Bot/bot.py index 304f33c..5c7d373 100644 --- a/Bot/bot.py +++ b/Bot/bot.py @@ -1,299 +1,299 @@ -''' -Discord bot template. -© by ElBe. - -Version: 1.9 -''' - -#Imports -import discord -from discord import utils -import asyncio -import datetime -import time -import logging -import platform -import psutil -import requests - -#Bot modules -import functions -import errors -import commands as create_commands -import version as bot_version - -#Check modules and python -if not int(platform.python_version().replace('.','')) <= 3110: - errors.OutdatedVersionError('Python', '3.11.0 or higher', 'https://python.org') - -#Start -print('Discord.py Bot') -print('----------------------------') -print('© by ElBe 2022.') -print('') -print('Start Informations') -print('------------------') -print('Discord version: ' + discord.__version__) -print('Bot version: ' + bot_version.version) -print('') -print('Starting') -print('--------') - -#Variables -bold = '**' -italic = '*' -underline = '_' -stroke = '~~' -MISSING = utils.MISSING - -#Starttime -starttime = time.time() - -#JSON data -try: - token = functions.json_module.get_config('Config')['Token'] - version = bot_version.version - credits = functions.json_module.get_config('Config')['Credits'] - footer = functions.json_module.get_config('Config')['Footer'] - memberRole = functions.json_module.get_config('Roles')['Member'] - welcomeChannel = functions.json_module.get_config('Channels')['Welcome'] - goodbyeChannel = functions.json_module.get_config('Channels')['Goodbye'] - commands = functions.json_module.get_config('Commands') -except Exception as e: - print(functions.console.error('Error while trying to get data from the config file.\n' + str(e))) - exit() - -#Setup -logging.basicConfig(filename='log.txt', level=logging.INFO) -intents = discord.Intents.all() - -#Create commands -try: - if functions.json_module.get_config('Created', 'commands.json') == 0: - create_commands - else: - None -except Exception as e: - print(functions.console.error('Error while trying to create the commands.\n' + str(e))) - exit() - -#Main -class Bot(discord.Client): - '''Bot.''' - - async def on_connect(self): - logging.info(str(datetime.datetime.now()) + ' Bot connected to the Discord API.') - print(functions.console.info('Bot connected to the Discord API.')) - - async def on_ready(self): - logging.info(str(datetime.datetime.now()) + ' Bot logged in as ' + client.user.name + '.') - print(functions.console.info('Bot logged in as ' + client.user.name + '.')) - print('Guilds: ' + str(client.user.guilds)) - print('') - print('Log (Consolebased)') - print('------------------') - - while True: - await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=f'/help for help.')) - await asyncio.sleep(10) - await client.change_presence(activity=discord.Game(name=f'Version {version}')) - await asyncio.sleep(10) - if credits: - await client.change_presence(activity=discord.Game(name=' programmed by ElBe.')) - await asyncio.sleep(10) - - async def on_resumed(self): - logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- Bot resumed session.') - print(functions.console.log('Bot resumed a session.')) - - async def on_interaction(self, interaction): - async def log(text: str): - '''Log a text and save it in the logfile and the console.''' - logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- ' + str(text)) - print(functions.console.log(str(text))) - - if interaction.type == discord.InteractionType.application_command: - command_name = str(interaction.data['name']) - await log('Command /' + command_name + ' was used by @' + str(interaction.user) + '.') - - if command_name == 'ping' and commands['ping']: - pingEmbed = discord.Embed(title='Ping', description='Ping of the bot in ms.') - pingEmbed.add_field(name='Latency: ', value=str(round(client.latency * 1000)) + ' ms', inline=False) - pingEmbed.set_thumbnail(url=client.user.avatar.url) - pingEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=pingEmbed, ephemeral=True) - elif command_name == 'ping' and not commands['ping']: - commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') - commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) - commandDisabledEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) - - if command_name == 'info' and commands['info']: - infoEmbed = discord.Embed(title='Information', description='Informations about the bot.') - infoEmbed.add_field(name='Running on: ', value=str(platform.system()) + ' ' + str(platform.release()), inline=False) - infoEmbed.add_field(name='CPU usage: ', value=str(psutil.cpu_percent(2)) + '%', inline=False) - infoEmbed.add_field(name='Uptime: ', value=str(datetime.timedelta(seconds=int(round(time.time()-starttime)))), inline=False) - infoEmbed.set_thumbnail(url=client.user.avatar.url) - infoEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=infoEmbed, ephemeral=True) - elif command_name == 'info' and not commands['info']: - commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') - commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) - commandDisabledEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) - - if command_name == 'stop' and commands['stop']: - if interaction.user.guild_permissions.administrator: - await log('Client stoped.') - exit() - else: - noPermissionsEmbed = discord.Embed(title='Missing permissions', description='You don\'t have permissions to do that.', color=discord.Color.red()) - noPermissionsEmbed.set_thumbnail(url=client.user.avatar.url) - noPermissionsEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=noPermissionsEmbed, ephemeral=True) - elif command_name == 'stop' and not commands['stop']: - commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') - commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) - commandDisabledEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) - - - if command_name == 'help' and commands['help']: - helpEmbed = discord.Embed(title='Help', description='Help for commands and the usage of the bot.') - helpEmbed.add_field(name='Ping', value='Shows the ping of the bot in ms.', inline=True) - helpEmbed.add_field(name='Info', value='Shows information about the bot.', inline=True) - helpEmbed.add_field(name='Help', value='Shows you help for commands and the usage of the bot.', inline=True) - helpEmbed.add_field(name='Kick', value='Kicks a member from the server.', inline=True) - helpEmbed.add_field(name='Ban', value='Bans a member from the server.', inline=True) - helpEmbed.add_field(name='Unban', value='Unbans a member from the server.', inline=True) - helpEmbed.add_field(name='more', value='For more help write a direct message to <@!745695237380243457>.', inline=False) - helpEmbed.set_thumbnail(url=client.user.avatar.url) - helpEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=helpEmbed, ephemeral=True) - - if command_name == 'kick' and commands['kick']: - options = interaction.data['options'] - if interaction.user.guild_permissions.administrator: - member = options[0]['value'] - member = await interaction.guild.fetch_member(int(member)) - reason = options[1]['value'] - if reason == None: reason = 'Kicked by @' + str(interaction.user) + ' with the /kick command.' - - await member.kick(reason=reason) - - kickEmbed = discord.Embed(title='Kick', description='Succesfully kicked <@!' + options[0]['value'] + '>!') - kickEmbed.set_thumbnail(url=client.user.avatar.url) - kickEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=kickEmbed, ephemeral=True) - else: - noPermissionsEmbed = discord.Embed(title='Missing permissions', description='You don\'t have permissions to do that.', color=discord.Color.red()) - noPermissionsEmbed.set_thumbnail(url=client.user.avatar.url) - noPermissionsEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=noPermissionsEmbed, ephemeral=True) - elif command_name == 'kick' and not commands['kick']: - commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') - commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) - commandDisabledEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) - - if command_name == 'ban' and commands['ban']: - options = interaction.data['options'] - if interaction.user.guild_permissions.administrator: - member = options[0]['value'] - member = await interaction.guild.fetch_member(int(member)) - reason = options[1]['value'] - if reason == None: reason = 'Banned by @' + str(interaction.user) + ' with the /ban command.' - - await member.ban(reason=reason) - - banEmbed = discord.Embed(title='Ban', description='Succesfully banned <@!' + options[0]['value'] + '>!') - banEmbed.set_thumbnail(url=client.user.avatar.url) - banEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=banEmbed, ephemeral=True) - else: - noPermissionsEmbed = discord.Embed(title='Missing permissions', description='You don\'t have permissions to do that.', color=discord.Color.red()) - noPermissionsEmbed.set_thumbnail(url=client.user.avatar.url) - noPermissionsEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=noPermissionsEmbed, ephemeral=True) - elif command_name == 'ban' and not commands['ban']: - commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') - commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) - commandDisabledEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) - - if command_name == 'unban' and commands['unban']: - options = interaction.data['options'] - if interaction.user.guild_permissions.administrator: - member = options[0]['value'] - member = await client.fetch_user(int(member)) - reason = options[1]['value'] - if reason == None: reason = 'Unbanned by @' + str(interaction.user) + ' with the /unban command.' - - await interaction.guild.unban(member, reason=reason) - - unbanEmbed = discord.Embed(title='Unban', description='Succesfully unbanned <@!' + options[0]['value'] + '>!') - unbanEmbed.set_thumbnail(url=client.user.avatar.url) - unbanEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=unbanEmbed, ephemeral=True) - else: - noPermissionsEmbed = discord.Embed(title='Missing permissions', description='You don\'t have permissions to do that.', color=discord.Color.red()) - noPermissionsEmbed.set_thumbnail(url=client.user.avatar.url) - noPermissionsEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=noPermissionsEmbed, ephemeral=True) - elif command_name == 'unban' and not commands['unban']: - commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') - commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) - commandDisabledEmbed.set_footer(text=footer) - await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) - - async def on_member_join(self, member): - if not welcomeChannel == "": - async def log(text: str): - '''Log a text and save it in the logfile and the console.''' - logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- ' + str(text)) - print(functions.console.log(str(text))) - - if not welcomeChannel == '': - if not member == client.user: - channel = discord.utils.get(member.guild.text_channels, name=welcomeChannel) - joinEmbed = discord.Embed(title='Welcome!', description='Hello <@!' + str(member.id) + f'>! \nThank you for joining {member.guild.name}!') - joinEmbed.set_thumbnail(url=member.avatar.url) - joinEmbed.set_footer(text=footer) - await channel.send(embed=joinEmbed) - await member.add_roles(discord.utils.get(member.guild.roles, name=str(member))) - await log('@' + str(member) + ' joined to ' + str(member.guild.name) + '.') - - async def on_member_remove(self, member): - if not goodbyeChannel == "": - async def log(text: str): - '''Log a text and save it in the logfile and the console.''' - logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- ' + str(text)) - print(functions.console.log(str(text))) - - if not goodbyeChannel == '': - if not member == client.user: - channel = discord.utils.get(member.guild.text_channels, name=goodbyeChannel) - leaveEmbed = discord.Embed(title='Goodbye!', description='<@!' + str(member.id) + f'> left {member.guild.name}.') - leaveEmbed.set_thumbnail(url=member.avatar.url) - leaveEmbed.set_footer(text=footer) - await channel.send(embed=leaveEmbed) - await log('@' + str(member) + ' left ' + str(member.guild.name) + '.') - - async def on_disconnect(self): - async def error(text: str): - '''Send a error text and save it in the logfile.''' - logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- Error: ' + str(text)) - print(functions.console.error(str(text))) - - await error('Bot disconected from discord.') - -#Run -client = Bot(intents = intents, max_messages=None) -new_version = str(str(str(requests.get('https://raw.githubusercontent.com/ElBe-Plaq/discord.py-bot-template/main/version.py').text).replace('version = ', '')).replace('\n', '')).replace('\'', '') -if version == new_version: - try: - client.run(token, log_handler=None) - except discord.errors.DiscordException: - errors.APIError('Error while trying to connect to discord.') -else: - errors.OutdatedVersionError('the template', new_version, 'https://github.com/ElBe-Plaq/discord.py-bot-template') +''' +Discord bot template. +© by ElBe. + +Version: 1.9 +''' + +#Imports +import discord +from discord import utils +import asyncio +import datetime +import time +import logging +import platform +import psutil +import requests + +#Bot modules +import functions +import errors +import commands as create_commands +import version as bot_version + +#Check modules and python +if not int(platform.python_version().replace('.','')) <= 3110: + errors.OutdatedVersionError('Python', '3.11.0 or higher', 'https://python.org') + +#Start +print('Discord.py Bot') +print('----------------------------') +print('© by ElBe 2022.') +print('') +print('Start Informations') +print('------------------') +print('Discord version: ' + discord.__version__) +print('Bot version: ' + bot_version.version) +print('') +print('Starting') +print('--------') + +#Variables +bold = '**' +italic = '*' +underline = '_' +stroke = '~~' +MISSING = utils.MISSING + +#Starttime +starttime = time.time() + +#JSON data +try: + token = functions.json_module.get_config('Config')['Token'] + version = bot_version.version + credits = functions.json_module.get_config('Config')['Credits'] + footer = functions.json_module.get_config('Config')['Footer'] + memberRole = functions.json_module.get_config('Roles')['Member'] + welcomeChannel = functions.json_module.get_config('Channels')['Welcome'] + goodbyeChannel = functions.json_module.get_config('Channels')['Goodbye'] + commands = functions.json_module.get_config('Commands') +except Exception as e: + print(functions.console.error('Error while trying to get data from the config file.\n' + str(e))) + exit() + +#Setup +logging.basicConfig(filename='log.txt', level=logging.INFO) +intents = discord.Intents.all() + +#Create commands +try: + if functions.json_module.get_config('Created', 'commands.json') == 0: + create_commands + else: + None +except Exception as e: + print(functions.console.error('Error while trying to create the commands.\n' + str(e))) + exit() + +#Main +class Bot(discord.Client): + '''Bot.''' + + async def on_connect(self): + logging.info(str(datetime.datetime.now()) + ' Bot connected to the Discord API.') + print(functions.console.info('Bot connected to the Discord API.')) + + async def on_ready(self): + logging.info(str(datetime.datetime.now()) + ' Bot logged in as ' + client.user.name + '.') + print(functions.console.info('Bot logged in as ' + client.user.name + '.')) + print('Guilds: ' + str(client.user.guilds)) + print('') + print('Log (Consolebased)') + print('------------------') + + while True: + await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=f'/help for help.')) + await asyncio.sleep(10) + await client.change_presence(activity=discord.Game(name=f'Version {version}')) + await asyncio.sleep(10) + if credits: + await client.change_presence(activity=discord.Game(name=' programmed by ElBe.')) + await asyncio.sleep(10) + + async def on_resumed(self): + logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- Bot resumed session.') + print(functions.console.log('Bot resumed a session.')) + + async def on_interaction(self, interaction): + async def log(text: str): + '''Log a text and save it in the logfile and the console.''' + logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- ' + str(text)) + print(functions.console.log(str(text))) + + if interaction.type == discord.InteractionType.application_command: + command_name = str(interaction.data['name']) + await log('Command /' + command_name + ' was used by @' + str(interaction.user) + '.') + + if command_name == 'ping' and commands['ping']: + pingEmbed = discord.Embed(title='Ping', description='Ping of the bot in ms.') + pingEmbed.add_field(name='Latency: ', value=str(round(client.latency * 1000)) + ' ms', inline=False) + pingEmbed.set_thumbnail(url=client.user.avatar.url) + pingEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=pingEmbed, ephemeral=True) + elif command_name == 'ping' and not commands['ping']: + commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') + commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) + commandDisabledEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) + + if command_name == 'info' and commands['info']: + infoEmbed = discord.Embed(title='Information', description='Informations about the bot.') + infoEmbed.add_field(name='Running on: ', value=str(platform.system()) + ' ' + str(platform.release()), inline=False) + infoEmbed.add_field(name='CPU usage: ', value=str(psutil.cpu_percent(2)) + '%', inline=False) + infoEmbed.add_field(name='Uptime: ', value=str(datetime.timedelta(seconds=int(round(time.time()-starttime)))), inline=False) + infoEmbed.set_thumbnail(url=client.user.avatar.url) + infoEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=infoEmbed, ephemeral=True) + elif command_name == 'info' and not commands['info']: + commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') + commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) + commandDisabledEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) + + if command_name == 'stop' and commands['stop']: + if interaction.user.guild_permissions.administrator: + await log('Client stoped.') + exit() + else: + noPermissionsEmbed = discord.Embed(title='Missing permissions', description='You don\'t have permissions to do that.', color=discord.Color.red()) + noPermissionsEmbed.set_thumbnail(url=client.user.avatar.url) + noPermissionsEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=noPermissionsEmbed, ephemeral=True) + elif command_name == 'stop' and not commands['stop']: + commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') + commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) + commandDisabledEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) + + + if command_name == 'help' and commands['help']: + helpEmbed = discord.Embed(title='Help', description='Help for commands and the usage of the bot.') + helpEmbed.add_field(name='Ping', value='Shows the ping of the bot in ms.', inline=True) + helpEmbed.add_field(name='Info', value='Shows information about the bot.', inline=True) + helpEmbed.add_field(name='Help', value='Shows you help for commands and the usage of the bot.', inline=True) + helpEmbed.add_field(name='Kick', value='Kicks a member from the server.', inline=True) + helpEmbed.add_field(name='Ban', value='Bans a member from the server.', inline=True) + helpEmbed.add_field(name='Unban', value='Unbans a member from the server.', inline=True) + helpEmbed.add_field(name='more', value='For more help write a direct message to <@!745695237380243457>.', inline=False) + helpEmbed.set_thumbnail(url=client.user.avatar.url) + helpEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=helpEmbed, ephemeral=True) + + if command_name == 'kick' and commands['kick']: + options = interaction.data['options'] + if interaction.user.guild_permissions.administrator: + member = options[0]['value'] + member = await interaction.guild.fetch_member(int(member)) + reason = options[1]['value'] + if reason == None: reason = 'Kicked by @' + str(interaction.user) + ' with the /kick command.' + + await member.kick(reason=reason) + + kickEmbed = discord.Embed(title='Kick', description='Succesfully kicked <@!' + options[0]['value'] + '>!') + kickEmbed.set_thumbnail(url=client.user.avatar.url) + kickEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=kickEmbed, ephemeral=True) + else: + noPermissionsEmbed = discord.Embed(title='Missing permissions', description='You don\'t have permissions to do that.', color=discord.Color.red()) + noPermissionsEmbed.set_thumbnail(url=client.user.avatar.url) + noPermissionsEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=noPermissionsEmbed, ephemeral=True) + elif command_name == 'kick' and not commands['kick']: + commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') + commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) + commandDisabledEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) + + if command_name == 'ban' and commands['ban']: + options = interaction.data['options'] + if interaction.user.guild_permissions.administrator: + member = options[0]['value'] + member = await interaction.guild.fetch_member(int(member)) + reason = options[1]['value'] + if reason == None: reason = 'Banned by @' + str(interaction.user) + ' with the /ban command.' + + await member.ban(reason=reason) + + banEmbed = discord.Embed(title='Ban', description='Succesfully banned <@!' + options[0]['value'] + '>!') + banEmbed.set_thumbnail(url=client.user.avatar.url) + banEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=banEmbed, ephemeral=True) + else: + noPermissionsEmbed = discord.Embed(title='Missing permissions', description='You don\'t have permissions to do that.', color=discord.Color.red()) + noPermissionsEmbed.set_thumbnail(url=client.user.avatar.url) + noPermissionsEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=noPermissionsEmbed, ephemeral=True) + elif command_name == 'ban' and not commands['ban']: + commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') + commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) + commandDisabledEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) + + if command_name == 'unban' and commands['unban']: + options = interaction.data['options'] + if interaction.user.guild_permissions.administrator: + member = options[0]['value'] + member = await client.fetch_user(int(member)) + reason = options[1]['value'] + if reason == None: reason = 'Unbanned by @' + str(interaction.user) + ' with the /unban command.' + + await interaction.guild.unban(member, reason=reason) + + unbanEmbed = discord.Embed(title='Unban', description='Succesfully unbanned <@!' + options[0]['value'] + '>!') + unbanEmbed.set_thumbnail(url=client.user.avatar.url) + unbanEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=unbanEmbed, ephemeral=True) + else: + noPermissionsEmbed = discord.Embed(title='Missing permissions', description='You don\'t have permissions to do that.', color=discord.Color.red()) + noPermissionsEmbed.set_thumbnail(url=client.user.avatar.url) + noPermissionsEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=noPermissionsEmbed, ephemeral=True) + elif command_name == 'unban' and not commands['unban']: + commandDisabledEmbed = discord.Embed(title='Command disabled', description='This command was disabled in the bot config file. Ask a member with access to the bot to enable this command.') + commandDisabledEmbed.set_thumbnail(url=client.user.avatar.url) + commandDisabledEmbed.set_footer(text=footer) + await interaction.response.send_message(embed=commandDisabledEmbed, ephemeral=True) + + async def on_member_join(self, member): + if not welcomeChannel == "": + async def log(text: str): + '''Log a text and save it in the logfile and the console.''' + logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- ' + str(text)) + print(functions.console.log(str(text))) + + if not welcomeChannel == '': + if not member == client.user: + channel = discord.utils.get(member.guild.text_channels, name=welcomeChannel) + joinEmbed = discord.Embed(title='Welcome!', description='Hello <@!' + str(member.id) + f'>! \nThank you for joining {member.guild.name}!') + joinEmbed.set_thumbnail(url=member.avatar.url) + joinEmbed.set_footer(text=footer) + await channel.send(embed=joinEmbed) + await member.add_roles(discord.utils.get(member.guild.roles, name=str(member))) + await log('@' + str(member) + ' joined to ' + str(member.guild.name) + '.') + + async def on_member_remove(self, member): + if not goodbyeChannel == "": + async def log(text: str): + '''Log a text and save it in the logfile and the console.''' + logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- ' + str(text)) + print(functions.console.log(str(text))) + + if not goodbyeChannel == '': + if not member == client.user: + channel = discord.utils.get(member.guild.text_channels, name=goodbyeChannel) + leaveEmbed = discord.Embed(title='Goodbye!', description='<@!' + str(member.id) + f'> left {member.guild.name}.') + leaveEmbed.set_thumbnail(url=member.avatar.url) + leaveEmbed.set_footer(text=footer) + await channel.send(embed=leaveEmbed) + await log('@' + str(member) + ' left ' + str(member.guild.name) + '.') + + async def on_disconnect(self): + async def error(text: str): + '''Send a error text and save it in the logfile.''' + logging.info(str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + ' -- Error: ' + str(text)) + print(functions.console.error(str(text))) + + await error('Bot disconected from discord.') + +#Run +client = Bot(intents = intents, max_messages=None) +new_version = str(str(str(requests.get('https://raw.githubusercontent.com/ElBe-Plaq/discord.py-bot-template/main/version.py').text).replace('version = ', '')).replace('\n', '')).replace('\'', '') +if version == new_version: + try: + client.run(token, log_handler=None) + except discord.errors.DiscordException: + errors.APIError('Error while trying to connect to discord.') +else: + errors.OutdatedVersionError('the template', new_version, 'https://github.com/ElBe-Plaq/discord.py-bot-template') \ No newline at end of file diff --git a/Bot/command_creator.py b/Bot/command_creator.py index 3159218..e3414ea 100644 --- a/Bot/command_creator.py +++ b/Bot/command_creator.py @@ -2,17 +2,17 @@ Slash command creator for the discord.py Bot. © by ElBe. -Version: 0.1.5 +Version: 1.4 ''' #Imports -import os import requests +import functions #Variables -url = 'https://discord.com/api/v10/applications/' + str(os.environ['application_id']) + '/commands' +url = 'https://discord.com/api/v10/applications/' + str(functions.json_module.get_config('Config')['Application ID']) + '/commands' headers = { - 'Authorization': 'Bot ' + str(os.environ['token']) + 'Authorization': 'Bot ' + str(functions.json_module.get_config('Config')['Token']) } #Example Command @@ -26,6 +26,5 @@ json = { def create_command(json): try: r = requests.post(url, headers=headers, json=json) - print('Command /' + str(json['name']) + ' was sucessfully created.') except Exception as e: print('Error while trying to create the command /' + str(json['name']) + '.\n' + str(e)) \ No newline at end of file diff --git a/Bot/commands.json b/Bot/commands.json new file mode 100644 index 0000000..a672176 --- /dev/null +++ b/Bot/commands.json @@ -0,0 +1 @@ +{"Created": 0} \ No newline at end of file diff --git a/Bot/commands.py b/Bot/commands.py index 10f0055..692813a 100644 --- a/Bot/commands.py +++ b/Bot/commands.py @@ -1,110 +1,110 @@ -''' -Command creator for the discord.py Bot. - -© by ElBe. - -Version: 0.1.5 - -NOTE: Only execute once. -''' - -#Imports -import command_creator - -#Stop command -json = { - 'name': 'stop', - 'type': 1, - 'description': 'Stops the bot.' -} -command_creator.create_command(json) - -#Help command -json = { - 'name': 'help', - 'type': 1, - 'description': 'Shows you help about the bot.' -} -command_creator.create_command(json) - -#Ping command -json = { - 'name': 'ping', - 'type': 1, - 'description': 'Shows you the ping of the bot in ms.' -} -command_creator.create_command(json) - -#Info command -json = { - 'name': 'info', - 'type': 1, - 'description': 'Shows you information about the bot.' -} -command_creator.create_command(json) - -#Kick command -json = { - 'name': 'kick', - 'type': 1, - 'description': 'Kicks a member from the server.', - "options": [ - { - "name": "member", - "description": "The member to kick.", - "type": 6, - "required": True - }, - { - "name": "reason", - "description": "Reason for the kick.", - "type": 3, - "required": False - } - ] -} -command_creator.create_command(json) - -#Ban command -json = { - 'name': 'ban', - 'type': 1, - 'description': 'Bans a member from the server.', - "options": [ - { - "name": "member", - "description": "The member to ban.", - "type": 6, - "required": True - }, - { - "name": "reason", - "description": "Reason for the ban.", - "type": 3, - "required": False - } - ] -} -command_creator.create_command(json) - -#Unban command -json = { - 'name': 'unban', - 'type': 1, - 'description': 'Unbans a member from the server.', - "options": [ - { - "name": "member", - "description": "The member to unban.", - "type": 6, - "required": True - }, - { - "name": "reason", - "description": "Reason for the unban.", - "type": 3, - "required": False - } - ] -} -command_creator.create_command(json) +''' +Command creator for the discord.py Bot. + +© by ElBe. + +Version: 1.5 + +NOTE: Only execute once. +''' + +#Imports +import command_creator + +#Stop command +json = { + 'name': 'stop', + 'type': 1, + 'description': 'Stops the bot.' +} +command_creator.create_command(json) + +#Help command +json = { + 'name': 'help', + 'type': 1, + 'description': 'Shows you help about the bot.' +} +command_creator.create_command(json) + +#Ping command +json = { + 'name': 'ping', + 'type': 1, + 'description': 'Shows you the ping of the bot in ms.' +} +command_creator.create_command(json) + +#Info command +json = { + 'name': 'info', + 'type': 1, + 'description': 'Shows you information about the bot.' +} +command_creator.create_command(json) + +#Kick command +json = { + 'name': 'kick', + 'type': 1, + 'description': 'Kicks a member from the server.', + "options": [ + { + "name": "member", + "description": "The member to kick.", + "type": 6, + "required": True + }, + { + "name": "reason", + "description": "Reason for the kick.", + "type": 3, + "required": False + } + ] +} +command_creator.create_command(json) + +#Ban command +json = { + 'name': 'ban', + 'type': 1, + 'description': 'Bans a member from the server.', + "options": [ + { + "name": "member", + "description": "The member to ban.", + "type": 6, + "required": True + }, + { + "name": "reason", + "description": "Reason for the ban.", + "type": 3, + "required": False + } + ] +} +command_creator.create_command(json) + +#Unban command +json = { + 'name': 'unban', + 'type': 1, + 'description': 'Unbans a member from the server.', + "options": [ + { + "name": "member", + "description": "The member to unban.", + "type": 6, + "required": True + }, + { + "name": "reason", + "description": "Reason for the unban.", + "type": 3, + "required": False + } + ] +} +command_creator.create_command(json) \ No newline at end of file diff --git a/Bot/config.json b/Bot/config.json index c79a8c7..ac3e960 100644 --- a/Bot/config.json +++ b/Bot/config.json @@ -1,13 +1,18 @@ { "Config": { - "Version": "1.9.2 final-r", - "Version-Comment": "Bugfix and error handler.", - "Footer": "Bot made by ElBe.", + "Token": "", + "Application ID": "", + "Version": "1.9.3 final", + "Version-Comment": "Added error handling.", + "Footer": "Made by ElBe.", "Credits": true }, "Channels": { - "Welcome": "", - "Goodbye": "" + "Welcome": "", + "Goodbye": "" + }, + "Roles": { + "Member": "member" }, "Commands": { "stop": true, diff --git a/Bot/errors.py b/Bot/errors.py new file mode 100644 index 0000000..dd2a453 --- /dev/null +++ b/Bot/errors.py @@ -0,0 +1,24 @@ +''' +Errors for the discord.py Bot. +© by ElBe. + +Version: 1.0 +''' +#Imports +import functions + +#Error +class error(): + def __init__(self, name: str, text: str): + functions.console.error(name + '\n' + text) + exit() + +#API error +class APIError(error): + def __init__(self, text: str): + super().__init__('API error', text) + +#OutdatedVersionError +class OutdatedVersionError(): + def __init__(self, outdated: str, version: str, download: str): + functions.console.warn('Outdated version\nYou installed an outdated version of ' + outdated + '. Please install version ' + version + ' from ' + download + '.') \ No newline at end of file diff --git a/Bot/functions.py b/Bot/functions.py index 061b065..719bf3b 100644 --- a/Bot/functions.py +++ b/Bot/functions.py @@ -1,106 +1,118 @@ -''' -Functions for the discord.py Bot. -© by ElBe. - -Version: 0.1.1 -''' - -#Imports -import json -import os -import colorama -import datetime -import re - -class variables(): - '''All variables used in this module.''' - standart_config_file = 'config.json' - standart_datetime_format = datetime.date.isoformat - -class json_module(): - def get_config(name: str, file = variables.standart_config_file): - '''Returns a value from the given/standart JSON file.''' - with open(file, 'r') as f: - return json.load(f)[name] - - def write_json(data, show_text = False, file = variables.standart_config_file): - '''Writes the text to the given/standart JSON file.''' - with open(file, 'w') as f: - json.dump(data, f) - f.close() - - if show_text: - print(console.log('Data ' + str(data) + ' added to ' + str(file) + '.')) - -class console(): - def info(text: str): - '''Returns a info text.''' - i = 0 - if len(re.findall('\n', text)) > 1: - text = '\n' + text - search = len(re.findall('\n', text)) - - if search > 1: - for i in range(search): - text = text.replace('\n', '//n[' + colorama.Fore.LIGHTBLUE_EX + str(i + 1) + colorama.Style.RESET_ALL + '] ', 1) - i = i + 1 - text = text.replace('//n', '\n') - return colorama.Fore.LIGHTBLUE_EX + str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + colorama.Style.RESET_ALL + ' [' + colorama.Fore.GREEN + 'INFO' + colorama.Style.RESET_ALL + '] ' + text - - def error(text: str): - '''Returns a error text.''' - i = 0 - if len(re.findall('\n', text)) > 1: - text = '\n' + text - search = len(re.findall('\n', text)) - - if search > 1: - for i in range(search): - text = text.replace('\n', '//n[' + colorama.Fore.LIGHTBLUE_EX + str(i + 1) + colorama.Style.RESET_ALL + '] ', 1) - i = i + 1 - text = text.replace('//n', '\n') - return colorama.Fore.LIGHTBLUE_EX + str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + colorama.Style.RESET_ALL + ' [' + colorama.Fore.RED + 'ERROR' + colorama.Style.RESET_ALL + '] ' + text - - def warn(text: str): - '''Returns a warn text.''' - i = 0 - if len(re.findall('\n', text)) > 1: - text = '\n' + text - search = len(re.findall('\n', text)) - - if search > 1: - for i in range(search): - text = text.replace('\n', '//n[' + colorama.Fore.LIGHTBLUE_EX + str(i + 1) + colorama.Style.RESET_ALL + '] ', 1) - i = i + 1 - text = text.replace('//n', '\n') - return colorama.Fore.LIGHTBLUE_EX + str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + colorama.Style.RESET_ALL + ' [' + colorama.Fore.YELLOW + 'WARNING' + colorama.Style.RESET_ALL + '] ' + text - - def log(text: str): - '''Returns a log text.''' - i = 0 - if len(re.findall('\n', text)) > 1: - text = '\n' + text - search = len(re.findall('\n', text)) - - if search > 1: - for i in range(search): - text = text.replace('\n', '//n[' + colorama.Fore.LIGHTBLUE_EX + str(i + 1) + colorama.Style.RESET_ALL + '] ', 1) - i = i + 1 - text = text.replace('//n', '\n') - return colorama.Fore.LIGHTBLUE_EX + str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + colorama.Style.RESET_ALL + ' [LOG] ' + text - - def clear(): - '''Clear the console.''' - os.system('cls') - - def crusor_up(): - '''Changes the position of the crusor to the line above.''' - print('\x1b[1A') - - def erase_line(): - '''Erases the current line.''' - print('\x1b[2K') - - def erase_last(): - '''Erases the last line.''' - print('\x1b[1A' + '\x1b[2K' + '\x1b[1A') +''' +Functions for the discord.py Bot. +© by ElBe. + +Version: 1.2 +''' + +#Imports +import json +import os +import colorama +import datetime +import re +import requests + +#Bot modules +import errors + +class variables(): + '''All variables used in this module.''' + standart_config_file = 'config.json' + standart_datetime_format = datetime.date.isoformat + +class json_module(): + def get_config(name: str, file = variables.standart_config_file): + '''Returns a value from the given/standart JSON file.''' + with open(file, 'r') as f: + return json.load(f)[name] + + def write_json(data, show_text = False, file = variables.standart_config_file): + '''Writes the text to the given/standart JSON file.''' + with open(file, 'w') as f: + json.dump(data, f) + f.close() + + if show_text: + print(console.log('Data ' + str(data) + ' added to ' + str(file) + '.')) + +class console(): + def info(text: str): + '''Returns a info text.''' + i = 0 + if len(re.findall('\n', text)) > 1: + text = '\n' + text + search = len(re.findall('\n', text)) + + if search > 1: + for i in range(search): + text = text.replace('\n', '//n[' + colorama.Fore.LIGHTBLUE_EX + str(i + 1) + colorama.Style.RESET_ALL + '] ', 1) + i = i + 1 + text = text.replace('//n', '\n') + return colorama.Fore.LIGHTBLUE_EX + str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + colorama.Style.RESET_ALL + ' [' + colorama.Fore.GREEN + 'INFO' + colorama.Style.RESET_ALL + '] ' + text + + def error(text: str): + '''Returns a error text.''' + i = 0 + if len(re.findall('\n', text)) > 1: + text = '\n' + text + search = len(re.findall('\n', text)) + + if search > 1: + for i in range(search): + text = text.replace('\n', '//n[' + colorama.Fore.LIGHTBLUE_EX + str(i + 1) + colorama.Style.RESET_ALL + '] ', 1) + i = i + 1 + text = text.replace('//n', '\n') + return colorama.Fore.LIGHTBLUE_EX + str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + colorama.Style.RESET_ALL + ' [' + colorama.Fore.RED + 'ERROR' + colorama.Style.RESET_ALL + '] ' + text + + def warn(text: str): + '''Returns a warn text.''' + i = 0 + if len(re.findall('\n', text)) > 1: + text = '\n' + text + search = len(re.findall('\n', text)) + + if search > 1: + for i in range(search): + text = text.replace('\n', '//n[' + colorama.Fore.LIGHTBLUE_EX + str(i + 1) + colorama.Style.RESET_ALL + '] ', 1) + i = i + 1 + text = text.replace('//n', '\n') + return colorama.Fore.LIGHTBLUE_EX + str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + colorama.Style.RESET_ALL + ' [' + colorama.Fore.YELLOW + 'WARNING' + colorama.Style.RESET_ALL + '] ' + text + + def log(text: str): + '''Returns a log text.''' + i = 0 + if len(re.findall('\n', text)) > 1: + text = '\n' + text + search = len(re.findall('\n', text)) + + if search > 1: + for i in range(search): + text = text.replace('\n', '//n[' + colorama.Fore.LIGHTBLUE_EX + str(i + 1) + colorama.Style.RESET_ALL + '] ', 1) + i = i + 1 + text = text.replace('//n', '\n') + return colorama.Fore.LIGHTBLUE_EX + str(datetime.datetime.now().strftime('%d.%m.%Y %T')) + colorama.Style.RESET_ALL + ' [LOG] ' + text + + def clear(): + '''Clear the console.''' + os.system('cls') + + def crusor_up(): + '''Changes the position of the crusor to the line above.''' + print('\x1b[1A') + + def erase_line(): + '''Erases the current line.''' + print('\x1b[2K') + + def erase_last(): + '''Erases the last line.''' + print('\x1b[1A' + '\x1b[2K' + '\x1b[1A') + +class outdated(): + def __init__(package: str, min_version: str): + min_version_int = int(min_version.replace('.','')) + try: + latest_version = int(str(json.loads(requests.get('https://pypi.python.org/pypi/' + package + '/json').text)['info']['version']).replace('.', '')) + except Exception as e: + print(console.error('Package not found.')) \ No newline at end of file diff --git a/Bot/version.py b/Bot/version.py index acbf182..ccc8d53 100644 --- a/Bot/version.py +++ b/Bot/version.py @@ -1 +1 @@ -__version__ = '1.9.2' \ No newline at end of file +version = '1.9.3' \ No newline at end of file