shbot/bot.py
2021-12-08 20:22:23 +01:00

325 lines
17 KiB
Python

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 \"<Rolle>\" <User Mentions>\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|<Anzahl>|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 <Frage> | <Antwort1> | <Antwort2> ...\n\n!vote = Ja/Nein Umfrage\nNutzung: !vote <Frage>\n\n!love = zeige einem User Liebe\nNutzung: !love <@User1> <@User2> ...\n\n!roll = Rolle einen oder mehrere Würfel\nNutzung: !roll <anzahl_optional>W<seitenzahl> (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 <Frage> | <Antwort1> | <Antwort2> ...")
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(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
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 | <Frage> | <Antwort1> | <Antwort2> ...", 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 <Frage>")
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()
#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)
#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()
client.run(token)