Separated out events

This commit is contained in:
Ev-1 committed 2019-01-26 14:38:15 +01:00
1 parent 17a0723d19
commit 2f1cfe9f5a
5 files changed
+110 -43

No files matched your search

+1
View File
@@ -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"]),
+2
View File
@@ -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()
+21 -4
View File
@@ -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)
+14 -39
View File
@@ -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):
+72
View File
@@ -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))