2021-12-08 18:35:28 +01:00
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 ' ]
2022-01-22 21:09:45 +01:00
bot = commands . Bot ( command_prefix = os . environ [ ' PREFIX ' ] )
2021-12-08 18:35:28 +01:00
client = discord . Client ( )
2022-01-22 21:09:45 +01:00
def admin ( ctx ) :
2022-01-22 19:20:18 +01:00
if ctx . guild . get_role ( 261603488331595776 ) in ctx . author . roles :
2021-12-08 18:35:28 +01:00
return True
2022-01-22 21:09:45 +01:00
def member ( ctx ) :
2022-01-22 19:20:18 +01:00
if ctx . guild . get_role ( 261603747711418371 ) in ctx . author . roles :
2021-12-08 18:35:28 +01:00
return True
2022-01-22 19:20:18 +01:00
def is_admin ( ) :
async def predicate ( ctx ) :
2022-01-22 21:09:45 +01:00
if ctx . guild . get_role ( 261603488331595776 ) in ctx . author . roles :
return True
2022-01-22 19:20:18 +01:00
return commands . check ( predicate )
def is_member ( ) :
async def predicate ( ctx ) :
2022-01-22 21:09:45 +01:00
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
2022-01-22 19:20:18 +01:00
return commands . check ( predicate )
2021-12-09 01:28:50 +01:00
emojinumbers = [ " 0 \u20E3 " , " 1 \u20E3 " , " 2 \u20E3 " , " 3 \u20E3 " , " 4 \u20E3 " , " 5 \u20E3 " , " 6 \u20E3 " , " 7 \u20E3 " , " 8 \u20E3 " , " 9 \u20E3 " ]
2021-12-08 18:35:28 +01:00
2022-01-23 03:19:43 +01:00
bot . help_command = commands . DefaultHelpCommand ( dm_help = True , no_category = " Befehle die du nutzen kannst: " )
@bot.event
async def on_command_error ( ctx , error ) :
await ctx . message . delete ( )
print ( error )
2022-01-23 03:23:47 +01:00
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 )
2022-01-23 03:19:43 +01:00
2022-01-22 21:09:45 +01:00
@bot.event
2021-12-08 18:35:28 +01:00
async def on_ready ( ) :
print ( " Bot ready on Version %s ... " % discord . __version__ )
2022-01-22 19:20:18 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Wirft den gleichen Text zurück. " , usage = " <Text> " , hidden = True )
2022-01-22 21:09:45 +01:00
@is_admin ( )
2022-01-22 19:41:03 +01:00
async def test ( ctx , arg ) :
await ctx . send ( arg )
2022-01-22 21:44:08 +01:00
@bot.command ( help = " veraltet " , usage = " " )
2022-01-22 19:20:18 +01:00
@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 )
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Zeigt alte Hilfe " , usage = " " )
2022-01-22 19:20:18 +01:00
@is_member ( )
2022-01-22 19:41:03 +01:00
async def helpme ( ctx ) :
2022-01-22 19:20:18 +01:00
if admin ( ctx ) :
admin_text = " \n \n !add = Hinzufügen einer Rolle mit Textchannel und hinzufügen von Usern zur Rolle \n Nutzung: !add \" <Rolle> \" <User Mentions> \n \n !labor = bringt dich ins Labor :) \n Nutzung: !labor \n \n !start = Starte ne Runde PnP \n Nutzung: !start @Rolle \n \n !stop = Beende die gestartete Runde PnP \n Nutzung: !stop \n \n !purge = Löschen von Nachrichten \n Nutzung: !purge all|<Anzahl>|x minutes/hours/days/weeks \n \n !prune - kickt Member ohne Rolle, die 30 Tage nicht online waren \n Nutzung: !prune "
else :
admin_text = " "
em = discord . Embed ( title = " Hilfe " , description = " !survey = Umfrage mit mehreren Antwortmöglichkeiten \n Nutzung: !survey <Frage> | <Antwort1> | <Antwort2> ... \n \n !vote = Ja/Nein Umfrage \n Nutzung: !vote <Frage> \n \n !love = zeige einem User Liebe \n Nutzung: !love <@User1> <@User2> ... \n \n !roll = Rolle einen oder mehrere Würfel \n Nutzung: !roll <anzahl_optional>W<seitenzahl> (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 )
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Umfrage mit mehreren Antwortmöglichkeiten " , usage = " <Frage> | <Antwort1> | <Antwort2> ... " )
2022-01-22 21:09:45 +01:00
@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
2021-12-08 18:35:28 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Umfrage bearbeiten " , usage = " ID | <Frage> | <Antwort1> | <Antwort2> ... " , hidden = True )
2022-01-22 21:09:45 +01:00
@is_member ( )
async def surveyedit ( ctx , * , arg ) :
#Nutzung: !surveyedit ID | <Frage> | <Antwort1> | <Antwort2> ...
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 )
2021-12-08 18:35:28 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Ja/Nein Umfrage " , usage = " <Frage> " )
2022-01-22 21:09:45 +01:00
@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 )
2021-12-08 18:35:28 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " " , usage = " " , hidden = True )
2022-01-22 21:09:45 +01:00
@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 ( )
2021-12-08 18:35:28 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Starte ne Runde PnP " , usage = " @Rolle " )
2022-01-22 21:09:45 +01:00
@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 \n Teilnehmer (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 ( )
2021-12-08 20:44:55 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Beende die gestartete Runde PnP " , usage = " " )
2022-01-22 21:09:45 +01:00
@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 )
2021-12-08 20:44:55 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " bringt dich ins Labor :) " , usage = " " )
2022-01-22 21:09:45 +01:00
@is_admin ( )
async def labor ( ctx ) :
await ctx . message . delete ( )
await ctx . author . move_to ( bot . get_channel ( 765601577334865972 ) )
2021-12-08 20:44:55 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Hinzufügen einer Rolle mit Textchannel und hinzufügen von Usern zur Rolle " , usage = " \" <Rolle> \" <User Mentions> " )
2022-01-22 21:09:45 +01:00
@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 \" <Rolle> \" <User Mentions> " , embed = em , delete_after = 20.0 )
2021-12-08 18:35:28 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Löschen von Nachrichten " , usage = " all|<Anzahl>|x minutes/hours/days/weeks " )
2022-01-22 21:09:45 +01:00
@is_admin ( )
async def purge ( ctx , * , arg ) :
#Nutzung: !purge all|<Anzahl>|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 ] ) )
2021-12-08 18:35:28 +01:00
def check ( reaction , user ) :
2022-01-22 21:09:45 +01:00
return user == ctx . author and str ( reaction . emoji ) == " ✅ "
2021-12-08 18:35:28 +01:00
await question . add_reaction ( " ✅ " )
try :
2022-01-22 21:09:45 +01:00
reaction , user = await bot . wait_for ( " reaction_add " , timeout = 60.0 , check = check )
2021-12-08 18:35:28 +01:00
except asyncio . TimeoutError :
await question . delete ( )
else :
await question . delete ( )
2022-01-22 21:09:45 +01:00
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 "
2021-12-08 18:35:28 +01:00
else :
2022-01-22 21:09:45 +01:00
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 )
2021-12-08 20:44:55 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " zeige einem User Liebe " , usage = " <@User1> <@User2> ... " )
2022-01-22 21:09:45 +01:00
@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 ( " ❤️ " )
2021-12-08 20:44:55 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " kickt Member ohne Rolle, die 30 Tage nicht online waren " , usage = " " )
2022-01-22 21:09:45 +01:00
@is_admin ( )
async def prune ( ctx ) :
await ctx . message . delete ( )
count = await ctx . guild . estimate_pruned_members ( days = 30 )
question = await ctx . channel . send ( " Sollen wirklich {} Leichen gekickt 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 . guild . prune_members ( days = 30 )
await ctx . send ( content = ' Ich habe {} Leichen beseitigt. ' . format ( deleted ) , delete_after = 5.0 )
2022-01-22 19:20:18 +01:00
2022-01-22 21:44:08 +01:00
@bot.command ( help = " Rolle einen oder mehrere Würfel " , usage = " <anzahl_optional>W<seitenzahl> (z.B. !roll W20 oder !roll 10W6) " )
2022-01-22 21:09:45 +01:00
@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 )
2022-01-22 19:20:18 +01:00
2022-01-22 21:09:45 +01:00
bot . run ( token )