From 2f1cfe9f5a2eeaf706bbf4a96ff703f5a52d74de Mon Sep 17 00:00:00 2001 From: Ev-1 <33662061+Ev-1@users.noreply.github.com> Date: Sat, 26 Jan 2019 14:38:15 +0100 Subject: [PATCH] Separated out events --- bot.py | 1 + cogs/cogs.py | 2 ++ cogs/misc.py | 25 +++++++++++++--- cogs/music.py | 53 +++++++++------------------------ cogs/musicevents.py | 72 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 110 insertions(+), 43 deletions(-) create mode 100644 cogs/musicevents.py diff --git a/bot.py b/bot.py index 42dab77..f3f5117 100644 --- a/bot.py +++ b/bot.py @@ -84,6 +84,7 @@ class Bot(commands.Bot): print(f'Version: {discord.__version__}\n') self.load_extension('cogs.music') + self.load_extension('cogs.musicevents') await self.change_presence(activity=discord.Game(type=0, name=config["playing"]), diff --git a/cogs/cogs.py b/cogs/cogs.py index 7b104c8..2ad85ce 100644 --- a/cogs/cogs.py +++ b/cogs/cogs.py @@ -2,6 +2,7 @@ import discord import os import json import codecs +import traceback from discord.ext import commands from cogs.utils import checks @@ -66,6 +67,7 @@ class Cogs: @checks.is_owner() async def _shutdown(self, ctx): """Logs out and stops.""" + self.bot.lavalink.players.clear() await self.bot.logout() diff --git a/cogs/misc.py b/cogs/misc.py index 1bf8203..68baf34 100644 --- a/cogs/misc.py +++ b/cogs/misc.py @@ -14,7 +14,6 @@ class Misc: self.bot = bot @commands.command(name='ping', hidden=True) - @checks.is_mod() async def _ping(self, ctx): start = time.perf_counter() message = await ctx.send('Ping...') @@ -40,6 +39,23 @@ class Misc: for guild in self.bot.guilds: guilds += f"{guild.name}\n" await ctx.send(guilds) + + @commands.command() + async def musicinfo(self, ctx): + """ + Info om musikkspilleren + """ + embed = discord.Embed(title='Music info', color=ctx.me.color) + lavalink = self.bot.lavalink + + listeners = 0 + for guild, player in lavalink.players: + listeners += len(player.listeners) + + embed.add_field(name='Players', value=f'{len(lavalink.players)}') + embed.add_field(name='Listeners', value=f'{listeners}') + await ctx.send(embed=embed) + @commands.command() async def info(self, ctx): @@ -65,14 +81,15 @@ class Misc: size=1024) infotext = f'Musikkbot skrevet for bruk på /r/Norge sine Discord Servere. Kildekoden er åpen! Den kan du finne [HER](https://gitlab.com/Ev-1/shite-music-bot)' spectext = f'**Python:** [{platform.python_version()}](https://www.python.org/)\n**Discord.py:** [{discord.__version__}](https://github.com/Rapptz/discord.py/tree/rewrite)\n**Lavalink:** [{LavalinkVersion}](https://github.com/Devoxin/Lavalink.py)' - stattext = f'**Guilder:** {guilds}\n**Brukere:** {members}' + stattext = f'**Tenarar:** {guilds}\n**Brukere:** {members}' uptimetext = f'{days}d {hours}t {minutes}m {seconds}s' - embed = discord.Embed(color=0xD9C04D) + embed = discord.Embed(color=ctx.me.color) embed.set_author(name=self.bot.user.name, icon_url=avatar) embed.set_thumbnail(url=avatar) + embed.set_image(url='https://cdn.discordapp.com/attachments/298524946454282250/368118192251469835/vintage1turntable.png') embed.add_field(name="Hva?", value=infotext, inline=False) - embed.set_footer(icon_url="https://cdn.discordapp.com/icons/297798952538079233/0198dc7b01ccf288b985b8a394cb1d44.jpg?size=64", + embed.set_footer(icon_url="https://cdn.discordapp.com/icons/532176350019321917/92f43a1f67308a99a30c169db4b671dd.png?size=64", text="Laget av /r/Norge, for /r/Norge") embed.add_field(name="Hvordan?", value=spectext) diff --git a/cogs/music.py b/cogs/music.py index 93253b6..fb58a5f 100644 --- a/cogs/music.py +++ b/cogs/music.py @@ -1,6 +1,5 @@ """ -This is an example cog that shows how you would make use of Lavalink.py. -This example cog requires that you have python 3.6 or higher due to the f-strings. +Music commands """ import math import re @@ -31,19 +30,9 @@ class Music: bot.lavalink.add_node(host, port, password, region, 'default-node') # Host, Port, Password, Region, Name bot.add_listener(bot.lavalink.voice_update_handler, 'on_socket_response') - bot.lavalink.add_event_hook(self.track_hook) - - def __unload(self): - self.bot.lavalink._event_hooks.clear() - - async def track_hook(self, event): - if isinstance(event, lavalink.events.TrackEndEvent): - pass # Send track ended message to channel. - if isinstance(event, lavalink.events.QueueEndEvent): - channel = self.bot.get_channel(event.player.fetch('channel')) - await self.check_leave_voice(channel.guild) - async def __before_invoke(self, ctx): + # TODO: rewrite this thing. Probably remove ensure_voice. + guild_check = ctx.guild is not None # This is essentially the same as `@commands.guild_only()` # except it saves us repeating ourselves (and also a few lines). @@ -74,7 +63,7 @@ class Music: if not results or not results['tracks']: return await ctx.send('Nothing found!') - embed = discord.Embed(color=0xEFD26C) + embed = discord.Embed(color=ctx.me.color) if results['loadType'] == 'PLAYLIST_LOADED': tracks = results['tracks'] @@ -185,7 +174,7 @@ class Music: member = ctx.guild.get_member(player.current.requester) - embed = discord.Embed(color=0xEFD26C, description=song, title='Now playing') + embed = discord.Embed(color=ctx.me.color, description=song, title='Now playing') thumbnail_url = await RoxUtils.ThumbNailer.identify(self,player.current.identifier, player.current.uri) if thumbnail_url: embed.set_thumbnail(url=thumbnail_url) @@ -267,7 +256,7 @@ class Music: if not user_queue: return await ctx.send('Your queue is empty') - if not all(x in range(1,len(user_queue)+1) for x in [from_pos, to_pos]): + if not all(x in range(1, len(user_queue) + 1) for x in [from_pos, to_pos]): return await ctx.send(f'Positions must be between 1 and {len(user_queue)}') moved = player.move_user_track(ctx.author.id, from_pos - 1, to_pos - 1) @@ -340,7 +329,7 @@ class Music: return player.remove_user_queue(user.id) - embed = discord.Embed(color=0x36393F) + embed = discord.Embed(color=ctx.me.color) embed.description = f'Removed all songs queued by <@{user.id}>.' await ctx.send(embed=embed) @@ -404,7 +393,7 @@ class Music: embed.description = search_results embed.title = 'Results' - embed.color = 0xEFD26C + embed.color = ctx.me.color await result_msg.edit(embed=embed) try: @@ -444,7 +433,7 @@ class Music: player.queue.clear() await player.stop() await self.connect_to(ctx.guild.id, None) - embed = discord.Embed(description='Disconnected', color=0x36393F) + embed = discord.Embed(description='Disconnected', color=ctx.me.color) await ctx.send(embed=embed) @commands.command(aliases=['vol']) @@ -461,7 +450,7 @@ class Music: return await ctx.send(f'you can only set the volume between 50 and 125') await player.set_volume(volume) - embed = discord.Embed(color=0x36393F) + embed = discord.Embed(color=ctx.me.color) embed.description = f'Volume set to {player.volume}' await ctx.send(embed=embed) @@ -473,7 +462,7 @@ class Music: await player.set_volume(100) await player.bassboost(False) - embed = discord.Embed(color=0x36393F) + embed = discord.Embed(color=ctx.me.color) embed.description = 'Volume and equalizer reset' await ctx.send(embed=embed) @@ -486,7 +475,7 @@ class Music: if boost is not None: await player.bassboost(boost) - embed = discord.Embed(color=0x36393F) + embed = discord.Embed(color=ctx.me.color) if player.boosted: embed.description = 'Bass boost is on' @@ -510,7 +499,7 @@ class Music: for index, track in enumerate(history[1:], start=1): description += f'`{-index}.` **[{track.title}]({track.uri})** _by <@{track.requester}>_\n' - embed = discord.Embed(title='Track history', color=0xEFD26C, description=description) + embed = discord.Embed(title='Track history', color=ctx.me.color, description=description) if thumb_url: embed.set_thumbnail(url=thumb_url) @@ -530,7 +519,7 @@ class Music: Skip to beginning/end of song: \N{BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR} \N{BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR} ''' - embed = discord.Embed(description='Nothing playing', color=0x36393F) + embed = discord.Embed(description='Nothing playing', color=ctx.me.color) if player.current is None: return await ctx.send(embed=embed) @@ -630,20 +619,6 @@ class Music: if int(player.channel_id) != ctx.author.voice.channel.id: raise commands.CommandInvokeError('You need to be in my voicechannel.') - async def on_voice_state_update(self, member, before, after): - if not member.bot: - player = self.bot.lavalink.players.get(member.guild.id) - if player is not None: - player.update_listeners(member, after) - await self.check_leave_voice(member.guild) - - async def check_leave_voice(self, guild): - player = self.bot.lavalink.players.get(guild.id) - if len(player.listeners) == 0 and player.is_connected: - if player.queue.empty and player.current is None: - await player.stop() - await self.connect_to(guild.id, None) - def max_track_length(self, guild): player = self.bot.lavalink.players.get(guild.id) if len(player.listeners): diff --git a/cogs/musicevents.py b/cogs/musicevents.py new file mode 100644 index 0000000..79e81d5 --- /dev/null +++ b/cogs/musicevents.py @@ -0,0 +1,72 @@ +""" +A cog to separate events from regular music commands +""" + +import asyncio + +import discord +import lavalink +from discord.ext import commands +import time + +from .utils.mixplayer import MixPlayer +from lavalink.events import * + +from lavasettings import * + + +class MusicEvents: + def __init__(self, bot): + self.bot = bot + # TODO: maybe only load when Music loads + if not hasattr(bot, 'lavalink'): # This ensures the client isn't overwritten during cog reloads. + bot.lavalink = lavalink.Client(bot.user.id, player=MixPlayer) + bot.lavalink.add_node(host, port, password, region, 'default-node') # Host, Port, Password, Region, Name + bot.add_listener(bot.lavalink.voice_update_handler, 'on_socket_response') + + bot.lavalink.add_event_hook(self.track_hook) + + def __unload(self): + self.bot.lavalink._event_hooks.clear() + + async def track_hook(self, event): + if isinstance(event, TrackEndEvent): + pass # Send track ended message to channel. + if isinstance(event, TrackStartEvent): + pass + if isinstance(event, QueueEndEvent): + channel = self.bot.get_channel(event.player.fetch('channel')) + await self.check_leave_voice(channel.guild) + if isinstance(event, PlayerUpdateEvent): + pass + if isinstance(event, NodeDisconnectedEvent): + pass + if isinstance(event, NodeConnectedEvent): + pass + if isinstance(event, NodeChangedEvent): + pass + + async def connect_to(self, guild_id: int, channel_id: str): + """ Connects to the given voicechannel ID. A channel_id of `None` means disconnect. """ + ws = self.bot._connection._get_websocket(guild_id) + await ws.voice_state(str(guild_id), channel_id) + + async def on_voice_state_update(self, member, before, after): + if not member.bot: + player = self.bot.lavalink.players.get(member.guild.id) + if player is not None: + player.update_listeners(member, after) + await self.check_leave_voice(member.guild) + + async def check_leave_voice(self, guild): + """ Checks if the bot should leave the voice channel """ + # TODO, disconnect timer? + player = self.bot.lavalink.players.get(guild.id) + if len(player.listeners) == 0 and player.is_connected: + if player.queue.empty and player.current is None: + await player.stop() + await self.connect_to(guild.id, None) + + +def setup(bot): + bot.add_cog(MusicEvents(bot))