#!/usr/bin/env python3 import json import discord import datetime from discord.ext import tasks from pathlib import Path from datetime import date # Konstanten definieren------------------------------------------------------------------------------------ client = discord.Client() glas_json = Path('/home/pi/discord/dasGlas/glasptr.json') ch_coin = 'das-glas-ptr' ch_witz = 'witzigkeit-kennt-keine-grenzen-ptr' emo_coin = '\U0001FA99' emo_sob = '\U0001f62d' react_emo_money_with_wings = '\U0001F4B8' react_emo_moneybag = '\U0001F4B0' react_emo_smiling_face_with_tear = '\U0001f972' snd_coin = '/home/pi/discord/dasGlas/coin.mp3' snd_witz = '/home/pi/discord/dasGlas/kein_Pardon.mp3' # JSON überprüfen/erstellen-------------------------------------------------------------------------------- if not glas_json.is_file(): glas_json.touch() with open(glas_json, 'w') as f: f.write('{}') f.close() # Sprachchannel verlassen---------------------------------------------------------------------------------- async def dc(vc): while True: if not vc.is_playing(): await vc.disconnect() return # Sound abspielen------------------------------------------------------------------------------------------ async def play_sound(name, channel): if(channel == ch_coin): sound = snd_coin elif(channel == ch_witz): sound = snd_witz if not name.voice == None: voicechannel = name.voice.channel if voicechannel != None: vc = await voicechannel.connect() vc.play(discord.FFmpegPCMAudio(sound)) await dc(vc) # Stand erhöhen-------------------------------------------------------------------------------------------- def stand_plus(name, plus, channelname): if channelname == ch_coin: chanel = "coin" elif channelname == ch_witz: chanel = "witz" with open(glas_json, "r+") as stand_json: data = json.load(stand_json) if not name in data: data[name] = {"name": name, chanel: 0} elif chanel not in data[name]: data[name][chanel] = 0 data[name][chanel] = data[name][chanel] + plus stand_json.seek(0) stand_json.truncate() json.dump(data, stand_json, indent=4, sort_keys=True) # Aktuellen Stand ausgeben-------------------------------------------------------------------------------- async def stand_out(channel): if channel.name == ch_coin: chanel = "coin" stdmsg = ['eine Münze in das Glas geworfen', ' Münzen in das Glas geworfen'] elif channel.name == ch_witz: chanel = "witz" stdmsg = ['einen schlechten Witz gemacht', ' schlechte Witze gemacht'] stand = list() with open(glas_json, "r") as stand_json: data = json.load(stand_json) for x in data: if chanel in data[x]: stand.append([data[x][chanel], data[x]["name"]]) stand_json.close() await channel.send('Der Stand ist:') stand.sort(reverse=True) for item in stand: if item[0] == 1: await channel.send(item[1] + ' hat ' +stdmsg[0]) else: await channel.send(item[1] + ' hat ' + str(item[0]) + stdmsg[1]) # Reaktion auf Nachrichten-------------------------------------------------------------------------------- # \U0001FA99 - coin # \U0001f62d - sob # \U0001F4B8 - money with wings # \U0001F4B0 - moneybag # \U0001f972 - smiling face with tear @client.event async def on_ready(): print('We have logged in as {0.user}'.format(client)) output.start() @client.event async def on_message(message): if message.author == client.user: return if message.channel.name == ch_coin: emo = emo_coin react_emo = react_emo_moneybag multi_react_emo = react_emo_money_with_wings elif message.channel.name == ch_witz: emo = emo_sob react_emo = react_emo_smiling_face_with_tear multi_react_emo = react_emo_smiling_face_with_tear if message.content.count(emo) > 0: if len(message.mentions) > 0: await message.add_reaction(multi_react_emo) for j in message.mentions: stand_plus(j.display_name, message.content.count( emo), message.channel.name) else: await message.add_reaction(react_emo) stand_plus(message.author.display_name, message.content.count(emo), message.channel.name) await play_sound(message.author, message.channel.name) elif message.content.startswith('!stand'): await message.delete() for x in message.author.roles: if str(x) == "Meh": await stand_out(message.channel) else: await message.delete() # Automatische Stand ausgabe------------------------------------------------------------------------------ @tasks.loop(hours=1) async def output(): for guild in client.guilds: if guild.name == 'Bärenkatapult': if date.today().day == 1 and datetime.datetime.now().hour == 6: await stand_out(discord.utils.get(guild.channels, name=ch_witz)) await stand_out(discord.utils.get(guild.channels, name=ch_coin)) # Channel verschiebung------------------------------------------------------------------------------------ @client.event async def on_voice_state_update(member, before, after): if after.channel is not None: channel = after.channel if channel.category.name == "Spiele": if discord.utils.get(after.channel.guild.categories, name="belebt") == None: await member.guild.create_category("belebt") B = discord.utils.get( after.channel.guild.categories, name="belebt") await B.edit(position=3) await channel.edit(category=B) if before.channel is not None: if before.channel.category.name == "belebt" and len(before.channel.members) == 0: S = discord.utils.get( before.channel.guild.categories, name="Spiele") channel = before.channel cat = channel.category await channel.edit(category=S) if len(cat.channels) == 0: await cat.delete() sorchan = ["0"] for i in S.channels: sorchan.append(i.name) sorchan.remove("0") sorchan.sort() for i in range(len(sorchan)): await discord.utils.get(before.channel.guild.channels, name=sorchan[i]).edit(position=i) # -------------------------------------------------------------------------------------------------------- #ODE1Mzc0MDc0NDU5OTc5ODM2.YDreSA.q494wu3zvinCJ6QiffrWvoUVibc client.run('ODI4Nzc4MTg0Nzg1OTIwMDIw.YGuh1Q.-MWOKUsNNBOzWFDYHjUtA-7umN0') # --------------------------------------------------------------------------------------------------------