async def kill(self, ctx, member: Member, *args): Grund = " ".join(args) if Grund.rstrip() == "": Grund = "Leer" VoiceState = member.voice if VoiceState: if VoiceState.channel.permissions_for(ctx.author).move_members: if VoiceState.channel.permissions_for( ctx.guild.get_member(self.bot.user.id)).move_members: if ctx.author.roles[-1] >= member.roles[-1]: await member.edit( voice_channel=None, reason="Von Moderator " + ctx.author.name + "#" + ctx.author.discriminator + " angefordert: " + Grund) raise SuccessMessage("Benutzer Getötet", fields=[("Betroffener", member.mention), ("Grund", Grund)]) raise ErrorMessage( message= "Deine Rolle ist nicht höher als oder gleich wie die des Benutzers, den du töten wolltest!" ) raise commands.BotMissingPermissions([]) raise commands.MissingPermissions([]) raise ErrorMessage( message="Der Benutzer befindet sich nicht in einem Sprachkanal.")
async def dns(self, ctx, domain: str, typ: str): typ = typ.upper() try: result = dns.resolver.query(domain, typ) if typ == "A": await ctx.sendEmbed( title="DNS-Info", description=f"DNS-Einträge des Typs A für '{domain}'!", inline=False, fields=[ ("IP", ipval.to_text()) for ipval in result ] ) elif typ == "CNAME": await ctx.sendEmbed( title="DNS-Info", description=f"DNS-Einträge des Typs CNAME für '{domain}'!", inline=False, fields=[ ("CNAME Target", cnameval.target) for cnameval in result ] ) elif typ == "MX": await ctx.sendEmbed( title="DNS-Info", description=f"DNS-Einträge des Typs MX für '{domain}'!", inline=False, fields=[ ("MX Record", mxdata.exchange) for mxdata in result ] ) else: await ctx.sendEmbed( title="DNS-Info", description=f"DNS-Einträge des Typs '{typ}' für '{domain}'!", inline=False, fields=[ ("Eintrag", str(data)) for data in result ] ) except dns.resolver.NXDOMAIN: raise ErrorMessage( f"Die Domain '{domain}' konnte nicht gefunden werden!") except dns.resolver.NoAnswer: raise ErrorMessage( f"Für die Domain '{domain}' konnten keine DNS-Einträge des Typs '{typ}' gefunden werden!") except dns.rdatatype.UnknownRdatatype: raise ErrorMessage( f"Unbekannter DNS-Record Typ: {typ}")
async def meme(self, ctx, search: str = "windows-xp-error", *args): search = " ".join((search, ) + args) filenames = list(os.listdir(MEMESPATH)) result = process.extractOne(search, filenames) filename = result[0] print("[Music] - Suchergebnis:", search, result) if result[1] >= 75: player = PCMVolumeTransformer( FFmpegPCMAudio(source=os.path.join( MEMESPATH, filename), **FFMPEG_OPTIONS)) if ctx.voice_client.is_playing(): ctx.voice_client.stop() ctx.voice_client.play( player, after=lambda e: print('[Music] - Fehler: %s' % e) if e else None) await ctx.sendEmbed(title="Memetime!", fields=[("Meme", str(filename).split(".")[0])]) else: raise ErrorMessage( message= "Es wurden keine mit '{}' übereinstimmende Audiodatei gefunden." .format(search))
def getProfile(cls, NAME: str): r = requests.get( 'https://api.mojang.com/users/profiles/minecraft/'+NAME) if not r.status_code == 204: return r.json() else: raise ErrorMessage(message="Spieler wurde nicht gefunden!")
async def sendNowPlaying(self, ctx): if ctx.voice_client and ctx.voice_client.source: if isinstance(ctx.voice_client.source, YouTubePlayer): await ctx.voice_client.source.send( ctx, status="Wird aktuell gespielt.") else: raise ErrorMessage("Aktuell wird nichts abgespielt.")
async def viergewinnt_duell(self, ctx, user: typing.Union[User, Member], width: int = 7, height: int = 6): if not (user == ctx.author or user.bot): msg = await ctx.sendEmbed( title="Vier Gewinnt", color=0x0078D7, description=f"Duell gegen {user.mention} wird erstellt...") game = await VierGewinntGame.creategame( width=width, height=height, channel_id=str(ctx.channel.id), message_id=str(msg.id), player_1_id=str(ctx.author.id), player_2_id=str(user.id)) embed = ctx.bot.getEmbed(title=f"Vier Gewinnt (#{game.pk})", color=0x0078D7, description=game.get_description()) await msg.edit(embed=embed) for emoji in VIERGEWINNT_NUMBER_EMOJIS[:game.width]: await msg.add_reaction(emoji) else: raise ErrorMessage( "Du kannst nicht gegen dich selbst oder Bots spielen... Wenn du einen Bot herausfordern möchtest, benutze bitte `/viergewinnt challenge`!" )
async def voicechannel(self, ctx): if ctx.invoked_subcommand is None: await ctx.send_help() elif await getUserChannelCategory(ctx.guild) is None: raise ErrorMessage( "Dieses Modul wurde nicht aktiviert! Ein Administrator kann dieses Modul mit `/channelsetup` aktivieren." )
async def voicechannel_invite(self, ctx, wer: typing.Union[Member, Role]): channel = await self.get_voice_channel(ctx.author) if not channel: raise ErrorMessage(message="Du hast noch keinen Sprachkanal!") await channel.set_permissions( wer, reason="Benuter hat Benutzer/Rolle eingeladen", read_messages=True, connect=True, speak=True) if isinstance(wer, Member): #EMBED = ctx.getEmbed(title="Benutzer zu Sprachkanal eingeladen", fields=[("Server", ctx.guild.name),("Benutzer", wer.mention)]) # await ctx.author.send(embed=EMBED) if not wer.bot: EMBED2 = ctx.getEmbed( title="Du wurdest zu einem Sprachkanal eingeladen", fields=[("Server", ctx.guild.name), ("Von", ctx.author.mention)]) await wer.send(embed=EMBED2) raise SuccessMessage("Benutzer zu Sprachkanal eingeladen", fields=[("Benutzer", wer.mention)]) if isinstance(wer, Role): #EMBED = ctx.getEmbed(title="Rolle zu Sprachkanal eingeladen", fields=[("Server", ctx.guild.name),("Rolle", wer.name)]) # await ctx.author.send(embed=EMBED) await ctx.send("Alle mit der Rolle " + wer.mention + " wurden von " + ctx.author.mention + " zu seinem/ihrem Sprachkanal eingeladen.") raise SuccessMessage("Rolle zu Sprachkanal eingeladen", fields=[("Rolle", wer.name)])
async def unban(self, ctx, userid: int, *args): Grund = " ".join(args) if Grund.rstrip() == "": Grund = "Leer" user = self.bot.get_user(userid) if user is None: raise ErrorMessage(message="Benutzer wurde nicht gefunden!") try: await ctx.guild.unban(user, reason="Von Moderator " + ctx.author.name + "#" + ctx.author.discriminator + " angefordert: " + Grund) raise SuccessMessage("Benutzer Entbannt", fields=[("Betroffener", user.mention), ("Grund", Grund)]) except DiscordException: raise ErrorMessage(message="Benutzer wurde nicht gefunden!")
async def votekill(self, ctx, member: Member): if ctx.author.voice and ctx.author.voice.channel is not None: if member.voice and member.voice.channel == ctx.author.voice.channel: msg = await ctx.sendEmbed( title= f"[Votekill] '{member.id}' in '{ctx.author.voice.channel.id}'", color=0x0078D7, description= f"Stimme mit {VOTEKILL_EMOJI} ab um dafür zu stimmen, dass {member.mention} aus dem Sprachkanal fliegt! (er kann danach jederzeit wieder beitreten)" ) await msg.add_reaction(VOTEKILL_EMOJI) else: raise ErrorMessage( "Du musst dich im gleichen Sprachkanal wie der betroffene Benutzer befinden." ) else: raise ErrorMessage("Du musst dich in einem Sprachkanal befinden!")
async def reports_delete(self, ctx, *repids): for repid in repids: if await ctx.database.deleteReport(repid=repid): await ctx.sendEmbed(title=f"Report #{repid} gelöscht!") else: raise ErrorMessage( f"Report mit der ID {repid} wurde nicht gefunden!") return
def __get_headers(self): key = os.environ.get("TRNAPIKEY", None) if key is None: raise ErrorMessage( message= "Der Fortnite-Befehl ist leider deaktiviert (nicht konfiguriert)!" ) else: return {'TRN-Api-Key': key}
async def amongus_reset(self, ctx): if await ctx.database.hasAmongUsGame(): game = await ctx.database.getAmongUsGame() voicechannel = ctx.guild.get_channel(int(game.voice_channel_id)) if voicechannel is None: raise ErrorMessage( message= "Der Sprachkanal zu deinem Spiel wurde nicht gefunden. Versuche dein Spiel mit `/amongus close` zu löschen" ) game.reset() await ctx.database._save(game) await voicechannel.edit(sync_permissions=True) raise SuccessMessage( "Dein AmongUs Spiel wurde erfolgreich zurückgesetzt!") raise ErrorMessage( message="Du hast kein AmongUs-Spiel auf diesem Server!")
async def getip(self, ctx, domain:str): try: ip = socket.gethostbyname(domain) await ctx.sendEmbed( title="IP-Info", description=f"Die IP hinter '{domain}' lautet '{ip}'!", ) except socket.gaierror: raise ErrorMessage(f"Die Domain '{domain}' konnte nicht gefunden werden!")
async def amongus_create(self, ctx): if await ctx.database.hasAmongUsGame(): game = await ctx.database.getAmongUsGame() textchannel = ctx.guild.get_channel(int(game.text_channel_id)) voicechannel = ctx.guild.get_channel(int(game.voice_channel_id)) if textchannel and voicechannel: raise ErrorMessage( message= f"Du hast bereits ein AmongUs-Spiel auf diesem Server! (ID { game.pk } - { textchannel.mention })" ) elif textchannel: raise ErrorMessage( message= f"Du hast bereits ein AmongUs-Spiel auf diesem Server, jedoch konnte der Sprachkanal nicht mehr gefunden werden! Versuche dein Game mit `/au delete` zu löschen. (ID { game.pk } - { textchannel.mention })" ) else: raise ErrorMessage( message= f"Du hast bereits ein AmongUs-Spiel auf diesem Server, jedoch konnte der Textkanal nicht mehr gefunden werden! (ID { game.pk })" ) else: category = await getAmongUsCategory(ctx.guild) textchannel = await category.create_text_channel( name=f"au-{ctx.author.name}#{ctx.author.discriminator}", reason="Benutzer hat AmongUs-Spiel erstellt.", topic= f"AmongUs Spiel von {ctx.author.name}#{ctx.author.discriminator}" ) voicechannel = await category.create_voice_channel( name=f"[AU] - {ctx.author.name}#{ctx.author.discriminator}", reason="Benutzer hat AmongUs-Spiel erstellt.") game = await ctx.database.createAmongUsGame( text_channel_id=str(textchannel.id), voice_channel_id=str(voicechannel.id)) embed = ctx.getEmbed(title=f"AmongUs Spiel erstellt", description=AMONGUS_TRACKER_INSTALL, color=0xFEDE29, fields=[("Url", str(game.get_tracker_url())), ("ID", str(game.pk)), ("API-Key", str(game.api_key)), ("Kanal", str(textchannel.mention))]) await ctx.author.send(embed=embed)
async def ensure_voice(self, ctx): if ctx.author.voice and ctx.author.voice.channel.guild == ctx.guild: if ctx.voice_client is None: await ctx.author.voice.channel.connect() # elif ctx.voice_client.is_playing(): # ctx.voice_client.stop() await ctx.voice_client.move_to(ctx.author.voice.channel) else: raise ErrorMessage( "Du bist mit keinem Sprachkanal in diesem Server verbunden!")
def morse_encrypt(message): message = message.upper().lstrip() morsecode = '' for letter in message: if letter != ' ': morsecode += (MORSE_CODE_DICT[letter] if letter in MORSE_CODE_DICT else letter) morsecode += ' ' if not morsecode.strip(): raise ErrorMessage(message="Der Text ist entweder leer oder enthält nur ungültige Zeichen!") return morsecode
async def textchannel_open(self, ctx): channel = await self.get_text_channel(ctx) if not channel: raise ErrorMessage(message="Du hast noch keinen Textkanal!") await channel.set_permissions( ctx.guild.default_role, reason="Benuter hat den Kanal für alle Geöffnet", read_messages=True, send_messages=True) raise SuccessMessage( "Der Kanal ist nun für alle auf diesem Server geöffnet!")
async def remote_allowraw(self, ctx, id: int): if not await ctx.database._has(BotPermission, id_1=str(ctx.author.id), id_2=str(id), typ="remote_permission"): await ctx.database._create(BotPermission, id_1=str(ctx.author.id), id_2=str(id), typ="remote_permission") raise SuccessMessage( str(id) + " darf nun Befehle für dich ausführen!") raise ErrorMessage("Diese ID darf bereits Befehle für dich ausführen!")
async def voicechannel_open(self, ctx): channel = await self.get_voice_channel(ctx.author) if not channel: raise ErrorMessage(message="Du hast noch keinen Sprachkanal!") await channel.set_permissions( ctx.guild.default_role, reason="Benuter hat den Kanal für alle geöffnet", read_messages=True, connect=True, speak=True) raise SuccessMessage( "Der Sprachkanal ist nun für alle auf diesem Server geöffnet!")
async def remote_disallowraw(self, ctx, id: int): if await ctx.database._has(BotPermission, id_1=str(ctx.author.id), id_2=str(id), typ="remote_permission"): await ctx.database._listdelete(BotPermission, id_1=str(ctx.author.id), id_2=str(id), typ="remote_permission") raise SuccessMessage( str(id) + " darf nun nicht mehr Befehle für dich ausführen!") raise ErrorMessage("Diese ID steht nicht auf deiner Liste!")
def getProfiles(cls, UUID: str): r = requests.get( 'https://api.mojang.com/user/profiles/'+str(UUID)+'/names') if not r.status_code == 204: data = r.json() for i in data: if "changedToAt" in i: i["changedToAt"] = datetime.datetime.fromtimestamp( int(i["changedToAt"])/1000) return data else: raise ErrorMessage(message="UUID wurde nicht gefunden!")
async def reports_delete(self, ctx, *repids: int): successids = [] for repid in repids: if await ctx.database.deleteReport(repid=repid): successids.append(f'#{repid}') if not successids: raise ErrorMessage( f"Report mit der ID {repid} wurde nicht gefunden!") if len(successids) > 1: raise SuccessMessage( f"Reports mit folgenden IDs gelöscht: {successids}") raise SuccessMessage(f"Report #{repid} gelöscht!")
async def usersong(self, ctx, member: discord.Member): found = False for activity in member.activities: if str(activity.type) == "ActivityType.listening": try: await ctx.sendEmbed( title="Spotify Song", fields=[("Titel", activity.title), ("Künstler", activity.artist), ("Link", ("[Spotify](https://open.spotify.com/track/" + activity.track_id + ")")), ("Benutzer", member.mention)]) except AttributeError: raise ErrorMessage( message= "Scheinbar hört dieser Benutzer keinen richtigen Song." ) found = True if not found: raise ErrorMessage(message="Dieser Benutzer hört keinen Song!")
def getSkin(cls, UUID: str): r = requests.get( 'https://sessionserver.mojang.com/session/minecraft/profile/'+str(UUID)) if not r.status_code == 204: data = r.json() if not "error" in data: ppty = data["properties"][0] base64_message = ppty["value"] base64_bytes = base64_message.encode('ascii') message_bytes = base64.b64decode(base64_bytes) message = message_bytes.decode('ascii') dictmessage = eval(message) if not dictmessage["textures"] == {}: skinurl = dictmessage["textures"]["SKIN"]["url"] data["skin"] = skinurl else: data["skin"] = None data.pop("properties") return data raise ErrorMessage( message="Abfrage für einen Skin kann pro UUID maximal ein Mal pro Minute erfolgen!") raise ErrorMessage(message="UUID wurde nicht gefunden!")
async def remote_allow(self, ctx, member: typing.Union[Member, User]): if not await ctx.database._has(BotPermission, id_1=str(ctx.author.id), id_2=str(member.id), typ="remote_permission"): await ctx.database._create(BotPermission, id_1=str(ctx.author.id), id_2=str(member.id), typ="remote_permission") raise SuccessMessage(member.mention + " darf nun Befehle für dich ausführen!") raise ErrorMessage( "Dieser Benutzer darf bereits Befehle für dich ausführen!")
async def remote_disallow(self, ctx, member: typing.Union[Member, User]): if await ctx.database._has(BotPermission, id_1=str(ctx.author.id), id_2=str(member.id), typ="remote_permission"): await ctx.database._listdelete(BotPermission, id_1=str(ctx.author.id), id_2=str(member.id), typ="remote_permission") raise SuccessMessage( member.mention + " darf nun nicht mehr Befehle für dich ausführen!") raise ErrorMessage("Dieser Benutzer steht nicht auf deiner Liste!")
async def movehere(self, ctx, member: Member): if member.voice: if ctx.author.voice: if member.voice.channel.permissions_for( ctx.author).move_members: if member.voice.channel.permissions_for( ctx.guild.get_member( self.bot.user.id)).move_members: await member.edit( voice_channel=ctx.author.voice.channel, reason="Von Moderator " + ctx.author.name + "#" + ctx.author.discriminator + " angefordert.") raise SuccessMessage( "Hierhin bewegt", fields=[("Betroffener", member.mention), ("Kanal", ctx.author.voice.channel.name)]) raise commands.BotMissingPermissions([]) raise commands.MissingPermissions([]) raise ErrorMessage( message="Du befindest sich nicht in einem Sprachkanal.") raise ErrorMessage( message="Der Benutzer befindet sich nicht in einem Sprachkanal.")
async def textchannel_delete(self, ctx): channel = await self.get_text_channel(ctx) if channel: await channel.delete(reason="Benutzer hat den Textkanal gelöscht") member = await ctx.database.get_member() member.setSetting("CHANNELS_TEXT_ID", None) await ctx.database._save(member) if not ctx.channel == channel: raise SuccessMessage("Textkanal gelöscht") else: raise ErrorMessage(message="Du hattest gar keinen Textkanal!")
async def ban(self, ctx, member: Member, *args): if not ctx.author.roles[-1] > member.roles[-1]: raise ErrorMessage( message= "Deine Rolle ist nicht höher als die des Benutzers, den du bannen wolltest!" ) Grund = " ".join(args) if Grund.rstrip() == "": Grund = "Leer" await member.ban(reason="Von Moderator " + ctx.author.name + "#" + ctx.author.discriminator + " angefordert: " + Grund) raise SuccessMessage("Benutzer Gebannt", fields=[("Betroffener", member.mention), ("Grund", Grund)])