mirror of
https://github.com/UiO-Gaming/ShiteMusicBot.git
synced 2026-11-05 13:56:51 +01:00
Separated out events
This commit is contained in:
1 parent
17a0723d19
commit
2f1cfe9f5a
5 files changed
+110
-43
No files matched your search
@@ -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,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
@@ -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
@@ -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):
|
||||
|
||||
@@ -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))
|
||||
Reference in new issue
Block a user