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 ' ]
client = discord . Client ( )
2022-01-22 19:20:18 +01:00
async def admin ( ctx ) :
if ctx . guild . get_role ( 261603488331595776 ) in ctx . author . roles :
2021-12-08 18:35:28 +01:00
return True
2022-01-22 19:20:18 +01:00
async def member ( ctx ) :
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 19:41:03 +01:00
await admin ( ctx )
2022-01-22 19:20:18 +01:00
return commands . check ( predicate )
def is_member ( ) :
async def predicate ( ctx ) :
2022-01-22 19:41:03 +01:00
await member ( ctx )
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
@client.event
async def on_ready ( ) :
print ( " Bot ready on Version %s ... " % discord . __version__ )
2022-01-22 19:20:18 +01:00
bot = commands . Bot ( command_prefix = ' ! ' )
2022-01-22 19:41:03 +01:00
@bot.command ( )
async def test ( ctx , arg ) :
await ctx . send ( arg )
2022-01-22 19:20:18 +01:00
@bot.command ( )
@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 ( )
@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 )
2021-12-08 18:35:28 +01:00
@client.event
async def on_message ( message ) :
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 \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 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. :( " )
2021-12-08 20:44:55 +01:00
2021-12-08 18:35:28 +01:00
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 )
2021-12-08 19:21:38 +01:00
ask_msg = await message . channel . send ( content = " ||@here|| " , embed = em )
2021-12-08 18:35:28 +01:00
a = 0
for x in emojinumbers :
if a < z and a != 0 :
await ask_msg . add_reaction ( x )
a = a + 1
await message . delete ( )
2021-12-08 20:44:55 +01:00
2021-12-08 18:35:28 +01:00
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 )
2022-01-12 16:43:39 +01:00
ask_msg = await message . channel . send ( content = " ||@here|| " , embed = em )
2021-12-08 18:35:28 +01:00
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 \n Teilnehmer (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 ( )
2021-12-08 20:44:55 +01:00
2021-12-08 18:35:28 +01:00
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 )
2021-12-08 20:44:55 +01:00
2021-12-08 18:35:28 +01:00
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 ( " ❤️ " )
2021-12-08 20:44:55 +01:00
2021-12-08 18:35:28 +01:00
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 )
2021-12-08 20:44:55 +01:00
2021-12-08 18:35:28 +01:00
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 )
2021-12-08 20:44:55 +01:00
2021-12-08 18:35:28 +01:00
#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 )
2021-12-08 20:44:55 +01:00
2021-12-08 18:35:28 +01:00
if message . content . startswith ( " !print " ) and permission ( message ) :
print ( message . content )
await message . delete ( )
2022-01-22 19:20:18 +01:00
client . run ( token )