import discord import asyncio import time import datetime import random import os from os import system from os import environ from discord.ext import commands from discord.commands import Option def left(s, amount): return s[:amount] def right(s, amount): return s[-amount:] def mid(s, offset, amount): return s[offset:offset+amount] token = os.environ['TOKEN'] prefix = os.environ['PREFIX'] bot = commands.Bot(command_prefix=prefix) client = discord.Client() def admin(ctx): if ctx.guild.get_role(261603488331595776) in ctx.author.roles: return True def member(ctx): if ctx.guild.get_role(261603747711418371) in ctx.author.roles: return True def is_admin(): async def predicate(ctx): if ctx.guild.get_role(261603488331595776) in ctx.author.roles: return True return commands.check(predicate) def is_member(): async def predicate(ctx): if ctx.guild.get_role(261603747711418371) in ctx.author.roles: return True return commands.check(predicate) def is_gm(): async def predicate(ctx): if ctx.guild.get_role(511893805956595722) in ctx.author.roles: return True return commands.check(predicate) emojinumbers = ["0\u20E3", "1\u20E3" , "2\u20E3" , "3\u20E3" , "4\u20E3" , "5\u20E3" , "6\u20E3" , "7\u20E3" , "8\u20E3" , "9\u20E3"] bot.help_command = commands.DefaultHelpCommand(dm_help=False, no_category="Befehle die du nutzen kannst") @bot.event async def on_command_error(ctx, error): await ctx.message.delete() print(error) em = discord.Embed(title="Error", description=error, colour=0xFF0000) await ctx.send(content="ups, da ist wohl was schief gegangen :( traurige Bot Geräusche...", embed=em, delete_after=20) @bot.event async def on_ready(): print("Bot ready on Version %s..." % discord.__version__) class Confirm(discord.ui.View): def __init__(self): super().__init__() self.value = None @discord.ui.button(label="Confirm", style=discord.ButtonStyle.green) async def confirm( self, button: discord.ui.Button, interaction: discord.Interaction ): await interaction.response.send_message("Bestätigt", ephemeral=True, delete_after=5.0) self.value = True self.stop() @discord.ui.button(label="Cancel", style=discord.ButtonStyle.grey) async def cancel(self, button: discord.ui.Button, interaction: discord.Interaction): await interaction.response.send_message("Abgebrochen", ephemeral=True, delete_after=5.0) self.value = False self.stop() @bot.slash_command(guild_ids=[261575556708040705]) # create a slash command for the supplied guilds async def hello(ctx): """Say hello to the bot""" await ctx.respond(content="Hallo %s" % ctx.author.display_name, ephemeral=True) @bot.slash_command(guild_ids=[261575556708040705]) async def roll(ctx, dice: Option(str, "Würfel die du werfen willst. z.B. 4W20"), ): await ctx.defer() rollt = 0 rolle = " " roll = dice.lower() if "d" in roll: rolls = "d" if "w" in roll: rolls = "w" rollc = roll.split(rolls)[0] if rollc == "": rollc = 1 else: rollc = int(rollc) rolld = int(roll.split(rolls)[1]) for x in range(rollc): rollo = random.randint(1, rolld) rollt = rollt + rollo rolle = rolle + " :game_die: " + str(rollo) + " " if rollc > 1: rolltotal = "Total: " + str(rollt) else: rolltotal = "" if rollc > 12: rolltotal = rolle + "\n" + rolltotal rolle = "" em = discord.Embed(title=rolle, description=rolltotal, colour=0x009933) await ctx.respond(embed=em) @bot.command(help="Wirft den gleichen Text zurück.", usage="", hidden=True) @is_admin() async def test(ctx, arg): await ctx.send(arg) @bot.command(help="veraltet", usage="", hidden=True) @is_member() async def yesno(ctx): await ctx.message.delete() await ctx.send(content="Sorry das geht so nicht. Der Befehl hat sich geändert in !vote... für mehr Informationen schreib bitte !help oder frage deinen Admin oder Apotheker. Liebste Grüße, SecondBot <3", delete_after=20.0) @bot.command(help="Zeigt alte Hilfe", usage="") @is_member() async def helpme(ctx): if admin(ctx): admin_text = "\n\n!add = Hinzufügen einer Rolle mit Textchannel und hinzufügen von Usern zur Rolle\nNutzung: !add \"\" \n\n!labor = bringt dich ins Labor :)\nNutzung: !labor\n\n!start = Starte ne Runde PnP\nNutzung: !start @Rolle\n\n!stop = Beende die gestartete Runde PnP\nNutzung: !stop\n\n!purge = Löschen von Nachrichten\nNutzung: !purge all||x minutes/hours/days/weeks\n\n!prune - kickt Member ohne Rolle, die 30 Tage nicht online waren\nNutzung: !prune" else: admin_text = "" em = discord.Embed(title="Hilfe",description="!survey = Umfrage mit mehreren Antwortmöglichkeiten\nNutzung: !survey | | ...\n\n!vote = Ja/Nein Umfrage\nNutzung: !vote \n\n!love = zeige einem User Liebe\nNutzung: !love <@User1> <@User2> ...\n\n!roll = Rolle einen oder mehrere Würfel\nNutzung: !roll W (z.B. !roll W20 oder !roll 10W6)%s" % admin_text, colour=0x00FF00) if ctx.author.dm_channel == None: await ctx.author.create_dm() await ctx.author.dm_channel.send(embed=em) @bot.command(help="Umfrage mit mehreren Antwortmöglichkeiten", usage=" | | ...") @is_member() async def survey(ctx, *, arg): await ctx.message.delete() answers = arg.split("|") question = answers[0] answers.remove(question) desc = "" z = 1 for y in answers: desc = desc + emojinumbers[z] + " - " + y + "\n" z = z + 1 em = discord.Embed(title=question, description=desc, colour=0x00E0FF) em.set_author(name=ctx.author.display_name, url=discord.Embed.Empty, icon_url=ctx.author.avatar_url) ask_msg = await ctx.send(content="||@here||",embed=em) a = 0 for x in emojinumbers: if a < z and a != 0: await ask_msg.add_reaction(x) a = a + 1 @bot.command(help="Umfrage bearbeiten", usage="ID | | | ...", hidden=True) @is_member() async def surveyedit(ctx, *, arg): #Nutzung: !surveyedit ID | | | ... await ctx.message.delete() answers = arg.split("|") survey_id = answers[0] question = answers[1] answers.remove(survey_id) answers.remove(question) desc = "" z = 1 for y in answers: desc = desc + emojinumbers[z] + " - " + y + "\n" z = z + 1 em = discord.Embed(title=question, description=desc, colour=0x00E0FF) em.set_author(name=ctx.author.display_name, url=discord.Embed.Empty, icon_url=ctx.author.avatar_url) survey_msg = await ctx.channel.fetch_message((int(survey_id))) await survey_msg.edit(embed=em) @bot.command(help="Ja/Nein Umfrage", usage="") @is_member() async def vote(ctx, *, arg): await ctx.message.delete() em = discord.Embed(description=arg, colour=0x00E0FF) em.set_author(name=ctx.author.display_name, url=discord.Embed.Empty, icon_url=ctx.author.avatar_url) ask_msg = await ctx.send(content="||@here||",embed=em) for x in ["✅", "❔", "❌"]: await ask_msg.add_reaction(x) @bot.command(help="den Bot etwas sagen lassen", usage="") @is_admin() async def say(ctx, *, arg): await ctx.message.delete() em = discord.Embed(description=arg, colour=0x00E0FF) await message.channel.send(embed=em) await message.delete() @bot.command(help="Starte ne Runde PnP", usage="@Rolle") @is_gm() async def start(ctx, role_id): await ctx.message.delete() role_id = right(left(role_id, len(role_id)-1), len(role_id) - 4) for r in ctx.author.roles: if str(r.id) == role_id: role = r em = discord.Embed(description='gespieltes PnP: %s\nTeilnehmer (zum Start):' % role.mention, colour=0x00770d) move_member = [] for c in ctx.guild.channels: if str(c.type) == "voice": for m in c.members: if role in m.roles: move_member.append(m) for m in move_member: await m.move_to(bot.get_channel(435869507123281920)) em.add_field(name=":white_check_mark: " + m.display_name, value = m.mention + "ist am Start! Juhu!", inline=False) start_msg = await bot.get_channel(435501602485305345).send(content=":game_die: **INFO: PnP Sitzung gestartet!**",embed=em) text_file = open("start_id.txt", "w") text_file.write(str(start_msg.id)) text_file.close() @bot.command(help="Beende die gestartete Runde PnP", usage="") @is_gm() async def stop(ctx): await ctx.message.delete() text_file = open("start_id.txt", "r") start_id = text_file.read() text_file.close() start_msg = await bot.get_channel(435501602485305345).fetch_message(start_id) now_time = datetime.datetime.utcnow().replace(microsecond=0) then_time = start_msg.created_at.replace(microsecond=0) dauer = str(now_time - then_time) for m in client.get_channel(435869507123281920).members: await m.move_to(client.get_channel(801869864745697280)) await start_msg.edit(content=":game_die: **INFO: PnP Sitzung beendet!** Dauer: %s" % dauer) @bot.command(help="bringt dich ins Labor :)", usage="") @is_admin() async def labor(ctx): await ctx.message.delete() await ctx.author.move_to(bot.get_channel(765601577334865972)) @bot.command(help="Hinzufügen einer Rolle mit Textchannel und hinzufügen von Usern zur Rolle", usage="\"Name der Rolle\" @User1 @User2 ...") @is_admin() async def add(ctx, *, arg): await ctx.message.delete() try: role_name = ctx.message.content.split("\"")[1] text_name = role_name.lower().replace(" ", "-") role = await ctx.guild.create_role(name=role_name, mentionable=True) overwrites = { ctx.guild.default_role: discord.PermissionOverwrite(read_messages=False), role: discord.PermissionOverwrite(read_messages=True) } channel = await ctx.guild.create_text_channel(text_name, overwrites=overwrites, topic="Dieser Channel wurde von SecondBot erstellt.") for user in ctx.message.mentions: await user.add_roles(role) em = discord.Embed(title=':loudspeaker: Ein neuer Channel für %s!' % role_name, description='Herzlich Willkommen! Es gibt nun eine neue Gruppe %s und diesen wunderbaren Channel hier! Der Channel ist nur für euch und die Admins sichtbar.' % role.mention, colour=0xffa500) await channel.send(embed=em) except Exception as e: em = discord.Embed(title="Error Code", description=e, color=0xff0000) await ctx.channel.send(content="Das hat nicht funktioniert. Syntax: !add \"\" ", embed=em, delete_after=20.0) @bot.command(help="Löschen von Nachrichten", usage="all||x minutes/hours/days/weeks") @is_admin() async def purge(ctx, *, arg): #Nutzung: !purge all||x minutes/hours/days/weeks await ctx.message.delete() by_limit = False by_time = False try: if ctx.message.content.split(" ")[2] == "minutes": by_time = True delta = datetime.timedelta(minutes=int(ctx.message.content.split(" ")[1])) if ctx.message.content.split(" ")[2] == "hours": by_time = True delta = datetime.timedelta(hours=int(ctx.message.content.split(" ")[1])) if ctx.message.content.split(" ")[2] == "days": by_time = True delta = datetime.timedelta(days=int(ctx.message.content.split(" ")[1])) if ctx.message.content.split(" ")[2] == "weeks": by_time = True delta = datetime.timedelta(weeks=int(ctx.message.content.split(" ")[1])) except IndexError: try: if ctx.message.content.split(" ")[1] == "all": by_limit = True limit = None else: by_limit = True limit = int(ctx.message.content.split(" ")[1]) except: print("List error, ploz ignore") except: print("List error, ploz ignore") if by_time: after_time = datetime.datetime.utcnow() - delta question = await ctx.send("Would you really like to delete all messages of the last {} {}?".format(ctx.message.content.split(" ")[1], ctx.message.content.split(" ")[2])) def check(reaction, user): return user == ctx.author and str(reaction.emoji) == "✅" await question.add_reaction("✅") try: reaction, user = await bot.wait_for("reaction_add", timeout=60.0, check=check) except asyncio.TimeoutError: await question.delete() else: await question.delete() deleted = await ctx.channel.purge(limit=200, after=after_time) await ctx.send(content='Ich habe {} Nachrichten gelöscht.'.format(len(deleted)), delete_after=5.0) if by_limit: if limit == None: count = "alle" else: count = str(limit) question = await ctx.send("Sollen wirklich {} Nachrichten gelöscht werden?".format(count)) def check(reaction, user): return user == ctx.author and str(reaction.emoji) == "✅" await question.add_reaction("✅") try: reaction, user = await bot.wait_for("reaction_add", timeout=60.0, check=check) except asyncio.TimeoutError: await question.delete() else: await question.delete() deleted = await ctx.channel.purge(limit=limit) await ctx.send(content='Ich habe {} Nachrichten gelöscht.'.format(len(deleted)), delete_after=5.0) @bot.command(help="zeige einem User Liebe", usage="<@User1> <@User2> ...", hidden=True) @is_member() async def love(ctx, *, arg): await ctx.message.delete() for user in ctx.message.mentions: if user.dm_channel == None: await user.create_dm() await user.dm_channel.send("❤️") @bot.command(help="kickt Member ohne Rolle, die 30 Tage nicht online waren", usage="") @is_admin() async def prune(ctx): await ctx.message.delete() count = await ctx.guild.estimate_pruned_members(days=30) view = Confirm() question = await ctx.send("Sollen wirklich {} Leichen gekickt werden?".format(count), view=view) await view.wait() if view.value is None: await question.delete() await ctx.send(content="Zeit ausgelaufen", delete_after=5.0) elif view.value: await question.delete() deleted = await ctx.guild.prune_members(days=30) await ctx.send(content='Ich habe {} Leichen beseitigt.'.format(deleted), delete_after=5.0) else: await question.delete() @bot.command(help="Rolle einen oder mehrere Würfel", usage="W (z.B. %sroll W20 oder %sroll 10W6)" % (prefix, prefix)) @is_member() async def roll(ctx, arg): await ctx.message.delete() rollt = 0 rolle = " " roll = arg.lower() if "d" in roll: rolls = "d" if "w" in roll: rolls = "w" rollc = roll.split(rolls)[0] if rollc == "": rollc = 1 else: rollc = int(rollc) rolld = int(roll.split(rolls)[1]) for x in range(rollc): rollo = random.randint(1, rolld) rollt = rollt + rollo rolle = rolle + " :game_die: " + str(rollo) + " " if rollc > 1: rolltotal = "Total: " + str(rollt) else: rolltotal = "" if rollc > 12: rolltotal = rolle + "\n" + rolltotal rolle = "" em = discord.Embed(title=rolle, description=rolltotal, colour=0x009933) await ctx.send(embed=em) bot.run(token)