From 0a7680188f3cb1e1e90b5b381d4831dec2690ee2 Mon Sep 17 00:00:00 2001 From: aaron Date: Wed, 8 Dec 2021 18:35:28 +0100 Subject: [PATCH] first commit --- Dockerfile | 10 ++ bot.py | 370 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 3 files changed, 381 insertions(+) create mode 100644 Dockerfile create mode 100644 bot.py create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e67c0f6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM python:slim + +WORKDIR ./ + +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +CMD [ "python", "./bot.py" ] \ No newline at end of file diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..f3a4080 --- /dev/null +++ b/bot.py @@ -0,0 +1,370 @@ +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 + +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'] + +client = discord.Client() +bot = commands.Bot(command_prefix='!') + +def permission(message): + if client.get_guild(261575556708040705).get_role(261603488331595776) in message.author.roles: + return True +def member(message): + if client.get_guild(261575556708040705).get_role(261603747711418371) in message.author.roles: + return True +emojinumbers = ["0\u20E3", "1\u20E3" , "2\u20E3" , "3\u20E3" , "4\u20E3" , "5\u20E3" , "6\u20E3" , "7\u20E3" , "8\u20E3" , "9\u20E3"] + +@client.event +async def on_ready(): + print("Bot ready on Version %s..." % discord.__version__) +@client.event +async def on_message(message): + if message.content.startswith("!yesno"): + await message.delete() + await message.channel.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) + if message.content == "!help": + if message.channel == message.author.dm_channel: + await message.author.dm_channel.send("Sorry das geht so nicht. Bitte schreibe diese Nachricht in einen Channel auf dem SecondHemd Discord, sonst kann ich nicht sehen was du für Berechtigungen hast. Vielen Dank.") + else: + await message.delete() + if member(message): + if permission(message): + 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 message.author.dm_channel == None: + await message.author.create_dm() + await message.author.dm_channel.send(embed=em) + else: + if message.author.dm_channel == None: + await message.author.create_dm() + await message.author.dm_channel.send("Sorry, du hast leider nicht die nötigen Berechtigungen. :(") + if message.content.startswith("!survey ") and member(message): + if message.content == "!survey": + error_message = await message.channel.send("Nutzung: !survey | | ...") + await message.delete() + await asyncio.sleep(15) + await error_message.delete() + else: + answers_raw = right(message.content, len(message.content)-8) + answers = answers_raw.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=message.author.display_name, url=discord.Embed.Empty, icon_url=message.author.avatar_url) + ask_msg = await message.channel.send(embed=em) + a = 0 + for x in emojinumbers: + if a < z and a != 0: + await ask_msg.add_reaction(x) + a = a + 1 + await message.delete() + if message.content.startswith("!surveyedit") and member(message): + if message.content == "!surveyedit": + await message.delete() + await message.channel.send(content="Nutzung: !surveyedit ID | | | ...", delete_after=15.0) + else: + await message.delete() + answers_raw = right(message.content, len(message.content)-12) + answers = answers_raw.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=message.author.display_name, url=discord.Embed.Empty, icon_url=message.author.avatar_url) + survey_msg = await message.channel.fetch_message((int(survey_id))) + await survey_msg.edit(embed=em) + #---------------------------------------------------------------------------------------- + if message.content.startswith("!vote") and member(message): + if message.content == "!vote": + error_message = await message.channel.send("Nutzung: !vote ") + await message.delete() + await asyncio.sleep(10) + await error_message.delete() + else: + em = discord.Embed(description=str(right(message.content,len(message.content)-6)), colour=0x00E0FF) + em.set_author(name=message.author.display_name, url=discord.Embed.Empty, icon_url=message.author.avatar_url) + ask_msg = await message.channel.send( embed=em) + for x in ["✅", "❔", "❌"]: + await ask_msg.add_reaction(x) + await message.delete() + + if message.content.startswith("!say") and permission(message): + em = discord.Embed(description=str(right(message.content,len(message.content)-5)), colour=0x00E0FF) + await message.channel.send(embed=em) + await message.delete() + + if message.content.startswith("!ttt") and permission(message): + if message.content == ("!ttt"): + error_message = await message.channel.send( "Syntax: !ttt | | <description>") + await asyncio.sleep(10) + await message.delete() + await error_message.delete() + else: + ttt_raw = right(message.content, len(message.content)-5) + content = ttt_raw.split("|") + ttt_url = content[0] + ttt_title = content[1] + ttt_description = content[2] + em = discord.Embed(description=ttt_description,title=ttt_title,url=ttt_url,colour=0x00E0FF) + ask_msg = await message.channel.send( embed=em) + for x in ["✅", "❌"]: + await ask_msg.add_reaction(x) + await message.delete() + + #move Bot + if message.content.startswith("!start") and permission(message): + if message.content == ("!start"): + error_message = await message.channel.send( "Nutzung: !start @Rolle") + await asyncio.sleep(6) + await message.delete() + await error_message.delete() + else: + role_id = message.content.split(" ")[1] + role_id = right(left(role_id, len(role_id)-1), len(role_id) - 4) + await message.delete() + for r in message.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 message.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(client.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 client.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() + + if message.content == "!stop" and permission(message): + text_file = open("start_id.txt", "r") + start_id = text_file.read() + text_file.close() + start_msg = await message.channel.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 message.delete() + await start_msg.edit(content=":game_die: **INFO: PnP Sitzung beendet!** Dauer: %s" % dauer) + + if message.content == "!labor" and permission(message): + await message.author.move_to(client.get_channel(765601577334865972)) + await message.delete() + + if message.content.startswith("!add") and permission(message): + if message.content == "!add": + explain_msg = await message.channel.send("Nutzung: !add \"<Rolle>\" <User Mentions>") + await message.delete() + await asyncio.sleep(10) + await explain_msg.delete() + else: + try: + role_name = message.content.split("\"")[1] + text_name = role_name.lower().replace(" ", "-") + role = await message.guild.create_role(name=role_name, mentionable=True) + overwrites = { + message.guild.default_role: discord.PermissionOverwrite(read_messages=False), + role: discord.PermissionOverwrite(read_messages=True) + } + channel = await message.guild.create_text_channel(text_name, overwrites=overwrites, topic="Dieser Channel wurde von SecondBot erstellt.") + for user in message.mentions: + await user.add_roles(role) + await message.delete() + 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) + error_message = await message.channel.send(content="Das hat nicht funktioniert. Syntax: !add \"<Rolle>\" <User Mentions>", embed=em) + await message.delete() + await asyncio.sleep(15) + await error_message.delete() + if message.content.startswith("!purge") and permission(message): + await message.delete() + if message.content == "!purge": + await message.channel.send(content="Nutzung: !purge all|<Anzahl>|x minutes/hours/days/weeks", delete_after=10.0) + else: + by_limit = False + by_time = False + try: + if message.content.split(" ")[2] == "minutes": + by_time = True + delta = datetime.timedelta(minutes=int(message.content.split(" ")[1])) + if message.content.split(" ")[2] == "hours": + by_time = True + delta = datetime.timedelta(hours=int(message.content.split(" ")[1])) + if message.content.split(" ")[2] == "days": + by_time = True + delta = datetime.timedelta(days=int(message.content.split(" ")[1])) + if message.content.split(" ")[2] == "weeks": + by_time = True + delta = datetime.timedelta(weeks=int(message.content.split(" ")[1])) + except IndexError: + try: + if message.content.split(" ")[1] == "all": + by_limit = True + limit = None + else: + by_limit = True + limit = int(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 message.channel.send("Would you really like to delete all messages of the last {} {}?".format(message.content.split(" ")[1], message.content.split(" ")[2])) + def check(reaction, user): + return user == message.author and str(reaction.emoji) == "✅" + await question.add_reaction("✅") + try: + reaction, user = await client.wait_for("reaction_add", timeout=60.0, check=check) + except asyncio.TimeoutError: + await question.delete() + else: + await question.delete() + deleted = await message.channel.purge(limit=200, after=after_time) + await message.channel.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 message.channel.send("Sollen wirklich {} Nachrichten gelöscht werden?".format(count)) + def check(reaction, user): + return user == message.author and str(reaction.emoji) == "✅" + await question.add_reaction("✅") + try: + reaction, user = await client.wait_for("reaction_add", timeout=60.0, check=check) + except asyncio.TimeoutError: + await question.delete() + else: + await question.delete() + deleted = await message.channel.purge(limit=limit) + await message.channel.send(content='Ich habe {} Nachrichten gelöscht.'.format(len(deleted)), delete_after=5.0) + if message.content.startswith("!love") and member(message): + await message.delete() + for user in message.mentions: + if user.dm_channel == None: + await user.create_dm() + await user.dm_channel.send("❤️") + if message.content.endswith("!?") and member(message): + for x in ["✅", "❌"]: + await message.add_reaction(x) + + if message.content.startswith("!prune") and permission(message): + await message.delete() + count = await message.guild.estimate_pruned_members(days=30) + question = await message.channel.send("Sollen wirklich {} Leichen gekickt werden?".format(count)) + def check(reaction, user): + return user == message.author and str(reaction.emoji) == "✅" + await question.add_reaction("✅") + try: + reaction, user = await client.wait_for("reaction_add", timeout=60.0, check=check) + except asyncio.TimeoutError: + await question.delete() + else: + await question.delete() + deleted = await message.guild.prune_members(days=30) + await message.channel.send(content='Ich habe {} Leichen beseitigt.'.format(deleted), delete_after=5.0) + if message.content.startswith("!roll") and member(message): + if message.content == "!roll": + await message.delete() + await message.channel.send(content="Nutzung: !roll <anzahl_optional>W<seitenzahl> (z.B. !roll W20 oder !roll 10W6)", delete_after=10.0) + else: + rollt = 0 + rolle = " " + roll = message.content.split(" ")[1].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 message.channel.send(embed=em) + if message.content.startswith("!rr") and permission(message): + if message.content == "!rr": + await message.delete() + await message.channel.send(content="Nutzung: !rr Titel | @Vortragender", delete_after=10.0) + else: + rrdata = right(message.content, len(message.content)-4).split(" | ") + rrdate = datetime.date.today() + while rrdate.weekday() != 3: + rrdate += datetime.timedelta(1) + rrdesc = "Thema: **" + rrdata[0] + "**\nVortragender: " + rrdata[1] + "\nDatum: " + datetime.date.strftime(rrdate, "%d.%m.%Y") + " 21 Uhr\n\n*Raffinierte Referate ist ein Projekt von SecondHemd, bei dem ein Freiwilliger etwa 15 Minuten zu einem Thema seiner Wahl einen Vortrag hält. Anschließend findet eine Frage- und Diskussionsrunde statt. Jeder ist herzlich eingeladen zuzuhören.*\n*JEDEN DONNERSTAG AUF DIESEM DISCORD!*" + em = discord.Embed(title="Raffinierte Referate", description=rrdesc, colour=0xffa500) + await message.guild.get_channel(837747488651608080).send(content="📣 " + message.guild.get_role(261603747711418371).mention + " " + message.guild.get_role(518420868221763584).mention, embed=em) + await message.delete() + + if message.content.startswith("!remind") and permission(message): + await message.guild.get_channel(837747488651608080).send(content="📣 Heute 21 Uhr findet ein Referat statt! Jeder kann zuhören! " + message.guild.get_role(261603747711418371).mention + " " + message.guild.get_role(518420868221763584).mention) + +#Shiba Bilder vom Shiba Discord auf den SH Discord hauen + if message.channel.id == 549177598916296723: + if not message.is_system() and len(message.attachments) > 0: + for a in message.attachments: + await client.get_channel(775390209793064980).send(content=a.url) + + if message.content.startswith("!print") and permission(message): + print(message.content) + await message.delete() + + ''' + if message.content == "!shiba": + await message.delete() + async for x in client.get_channel(549177598916296723).history(limit=1000, oldest_first=True): + if not x.is_system() and len(x.attachments) > 0: + for a in x.attachments: + await message.channel.send(content=a.url) + ''' +client.run(token) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..503dba9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +discord.py \ No newline at end of file