async def on_voice_state_update(self, member, before, after):

        # If the bot leave a voice channel
        if (before.channel is not None) and (after.channel is None):
            if member == self.bot.user:

                player = self.bot.wavelink.get_player(before.channel.guild.id)
                if player.is_playing:
                    await player.destroy()
                DBQueue(self.bot.dbConnection).clear(before.channel.guild.id)
                DBServer(self.bot.dbConnection).clearMusicParameters(
                    before.channel.guild.id, False, False)

        if (before.channel is not None) and (after.channel
                                             is not before.channel):
            if ((self.bot.user.id in before.channel.voice_states.keys()
                 and len(before.channel.voice_states) == 1)
                    or (member == self.bot.user)):
                if member != self.bot.user:
                    player = self.bot.wavelink.get_player(
                        before.channel.guild.id)
                    await player.disconnect()

                DBServer(self.bot.dbConnection).clearMusicParameters(
                    before.channel.guild.id, False, False)

        # If the bot join a voice channel
        elif (before.channel is None) and (after.channel is not None):
            if member == self.bot.user:

                DBServer(self.bot.dbConnection).clearMusicParameters(
                    after.channel.guild.id, False, False)
Beispiel #2
0
    async def loopqueue(self, ctx):
        
        if not await Check().userInVoiceChannel(ctx, self.bot): return 
        if not await Check().botInVoiceChannel(ctx, self.bot): return 
        if not await Check().userAndBotInSameVoiceChannel(ctx, self.bot): return 
        
        isLoopQueue = DBServer(self.bot.dbConnection).displayServer(ctx.guild.id)[3]

        if isLoopQueue == 1:
            DBServer(self.bot.dbConnection).updateLoopQueue(ctx.guild.id, False)
            await ctx.channel.send(f"{ctx.author.mention} The loop queue mode was disabled!")
        else:
            DBServer(self.bot.dbConnection).updateLoopQueue(ctx.guild.id, True)
            await ctx.channel.send(f"{ctx.author.mention} The loop queue mode was enabled!")
Beispiel #3
0
async def on_ready():
    await bot.change_presence(activity=discord.Activity(
        type=discord.ActivityType.watching, name=f"{bot.command_prefix}help"))

    # Check if each server is in the DB
    print("Database check")
    servers = DBServer(bot.dbConnection).display()
    servers = DBServer(bot.dbConnection).display()
    serversId = [int(i[0]) for i in servers]
    for guild in bot.guilds:
        if guild.id not in serversId:
            DBServer(bot.dbConnection).add(guild.id, "?", False, False, "")
            print(f"* {guild.name} ({guild.id}) added")

    print("----------------------------")
    print(f'We have logged in as {bot.user}')
    print(discord.__version__)
    async def on_guild_remove(self, guild):

        DBServer(self.bot.dbConnection).remove(guild.id)

        # Print the log on the support server
        channel = self.bot.get_channel(799998669926563860)
        if channel is not None:
            await channel.send(
                f":red_circle: Left a server: {guild.name} ({guild.id})")
    async def on_guild_join(self, guild):

        DBServer(self.bot.dbConnection).add(guild.id, "?", False, False, "")

        # Print the log on the support server
        channel = self.bot.get_channel(799998669926563860)
        if channel is not None:
            await channel.send(
                f":green_circle: Joined a server: {guild.name} ({guild.id})")
Beispiel #6
0
async def sendPlayingSongEmbed(self, channel, track): 

    player = self.bot.wavelink.get_player(channel.guild.id)
    
    # Volume
    volume = player.volume
    
    # Track duration
    trackDuration = await Utils().durationFormat(track.duration)
    
    # Queue size and duration
    queueSizeAndDuration = DBQueue(self.bot.dbConnection).queueSizeAndDuration(channel.guild.id)
    if queueSizeAndDuration:
        queueDuration = int(queueSizeAndDuration[0])
        queueDuration = await Utils().durationFormat(queueDuration)
        queueSize = queueSizeAndDuration[1]
    else:
        queueSize = 0
        queueDuration = "00:00"
    
    # Title
    trackTitle = track.title.replace("*", "\\*")

    # Loop and LoopQueue
    isLoop = str(DBServer(self.bot.dbConnection).displayServer(channel.guild.id)[2])
    isLoopQueue = str(DBServer(self.bot.dbConnection).displayServer(channel.guild.id)[3])


    # Embed 
    embed=discord.Embed(title="Playing Song :", description=f"**[{trackTitle}]({track.uri})**", color=discord.Colour.random())
    if track.thumb:
        embed.set_thumbnail(url=track.thumb)
    embed.add_field(name="Requested by :", value=f"`{track.requester}`", inline=True)
    embed.add_field(name="Duration :", value=f"`{trackDuration}`", inline=True)
    embed.add_field(name="Volume :", value=f"`{volume} %`", inline=True)
    embed.add_field(name="Loop :", value=isLoop.replace("1", f"{self.bot.emojiList.true}").replace("0", f"{self.bot.emojiList.false}"), inline=True)
    embed.add_field(name="Loop queue :", value=isLoopQueue.replace("1", f"{self.bot.emojiList.true}").replace("0", f"{self.bot.emojiList.false}"), inline=True)
    embed.add_field(name="Lyrics :", value=f"`{self.bot.command_prefix}lyrics`", inline=True)
    embed.add_field(name="Queue :", value=f"`{queueSize} song(s) ({queueDuration})`", inline=True)
    embed.add_field(name="DJ Role :", value=f"`@role`", inline=True)
    await channel.send(embed=embed)
    async def join(self, ctx):
        
        if not await Check().userInVoiceChannel(ctx, self.bot): return 
        if not await Check().botNotInVoiceChannel(ctx, self.bot): return 

        channel = ctx.author.voice.channel
        
        player = self.bot.wavelink.get_player(ctx.guild.id)
        await player.connect(channel.id)

        # Clear all the queue
        DBQueue(self.bot.dbConnection).clear(ctx.guild.id)
        # Clear all server music parameters
        DBServer(self.bot.dbConnection).clearMusicParameters(ctx.guild.id, False, False)
        
        await ctx.send(f"{ctx.author.mention} Connected in **`{channel.name}`**!")
    async def leave(self, ctx):

        if not await Check().botInVoiceChannel(ctx, self.bot): return

        if not ctx.author.guild_permissions.administrator:
            if not await Check().userInVoiceChannel(ctx, self.bot): return 
            if not await Check().userAndBotInSameVoiceChannel(ctx, self.bot): return 

        player = self.bot.wavelink.get_player(ctx.guild.id)
        channelId = player.channel_id
        channel = self.bot.get_channel(channelId)

        if player.is_playing:
            await player.destroy()
        await player.disconnect()

        # Clear all the queue
        DBQueue(self.bot.dbConnection).clear(ctx.guild.id)
        # Clear all server music parameters
        DBServer(self.bot.dbConnection).clearMusicParameters(ctx.guild.id, False, False)

        await ctx.channel.send(f"{ctx.author.mention} Disconnected from **`{channel.name}`**!")
Beispiel #9
0
    async def on_player_stop(self, node: wavelink.Node, payload):

        serverParameters = DBServer(self.bot.dbConnection).displayServer(
            payload.player.guild_id)
        isLoop = serverParameters[2]
        isLoopQueue = serverParameters[3]

        # Clear the skip DB
        DBSkip(self.bot.dbConnection).clear(payload.player.guild_id)

        if isLoop == 1:
            currentTrack = DBQueue(self.bot.dbConnection).getCurrentSong(
                payload.player.guild_id)
            requester = currentTrack[2]
            channelID = currentTrack[3]
            channel = self.bot.get_channel(int(channelID))
            track = await self.bot.wavelink.get_tracks(currentTrack[4])
            track = track[0]
            await channel.send(f"🔄 Looped!")
            return await playTrack(self, channel, payload.player, track,
                                   requester)

        # If not looped
        track = DBQueue(self.bot.dbConnection).getNextSong(
            payload.player.guild_id)
        if track is None:
            currentTrack = DBQueue(self.bot.dbConnection).getCurrentSong(
                payload.player.guild_id)
            if currentTrack:
                channelID = currentTrack[3]
                channel = self.bot.get_channel(int(channelID))
                if channel:
                    await channel.send(
                        f"{self.bot.emojiList.false} Disconnected because the queue is empty!"
                    )
                    await payload.player.disconnect()
            return

        channelID = track[3]
        channel = self.bot.get_channel(int(channelID))
        requester = track[2]
        track = track[4]

        # Remove the former track
        DBQueue(self.bot.dbConnection).removeFormer(payload.player.guild_id)
        # update playing track to former track (index = 0)
        DBQueue(self.bot.dbConnection).updatePlayingToFormer(
            payload.player.guild_id)
        # Change the new track to isPlaying
        trackIndex = DBQueue(self.bot.dbConnection).getNextIndex(
            payload.player.guild_id)
        DBQueue(self.bot.dbConnection).setIsPlaying(payload.player.guild_id,
                                                    trackIndex)

        await playTrack(self, channel, payload.player, track, requester)

        if isLoopQueue == 1:
            formerTrack = DBQueue(self.bot.dbConnection).displayFormer(
                payload.player.guild_id)

            if len(formerTrack) > 0:
                futureIndex = DBQueue(self.bot.dbConnection).getFutureIndex(
                    payload.player.guild_id)
                futureIndex += 1

                title = formerTrack[5]
                duration = formerTrack[6]

                # Add the former track at the end of the queue
                DBQueue(self.bot.dbConnection).add(payload.player.guild_id,
                                                   False, requester,
                                                   channel.id, track, title,
                                                   duration, futureIndex)
async def addTrack(self, ctx, tracks):

    if not await Check().userInVoiceChannel(ctx, self.bot): return 

    # If there is only one track
    if not isinstance(tracks, list):
        tracks = [tracks]

    player = self.bot.wavelink.get_player(ctx.guild.id)

    if not player.is_connected:
        # Clear all the queue
        DBQueue(self.bot.dbConnection).clear(ctx.guild.id)

        channel = ctx.author.voice.channel
        await player.connect(channel.id)
        await ctx.send(f"{ctx.author.mention} Connected in **`{channel.name}`**!")

    playlistMessage = None

    for track in tracks:
        
        tempLink = track
        if isinstance(track, str):
            # Convert the link in a track
            track = await self.bot.wavelink.get_tracks(track)
            track = track[0]
            if track is None:
                return await channel.send(f"{self.bot.emojiList.false} The link `{tempLink}` is invalid!")

        requester = f"{ctx.author.name}#{ctx.author.discriminator}"
        # Add the requester
        if player.is_playing:
            queueSize = DBQueue(self.bot.dbConnection).countQueueItems(ctx.guild.id)
            if queueSize >= 50:
                return await ctx.channel.send(f"{self.bot.emojiList.false} {ctx.author.mention} You are over the queue limit! The limit of the queue is 50 songs.")
            index = DBQueue(self.bot.dbConnection).getFutureIndex(ctx.guild.id)
            if index is not None:
                index += 1
            # Add to the queue
            DBQueue(self.bot.dbConnection).add(ctx.guild.id, False, requester, ctx.channel.id, track.uri, track.title, track.duration, index) 

            trackDuration = await Utils().durationFormat(track.duration)
            trackTitle = track.title.replace("*", "\\*")

            if len(tracks) == 1:

                # Queue size and duration
                queueSizeAndDuration = DBQueue(self.bot.dbConnection).queueSizeAndDuration(ctx.guild.id)
                if queueSizeAndDuration:
                    queueDuration = int(queueSizeAndDuration[0])
                    queueDuration = await Utils().durationFormat(queueDuration)
                    queueSize = queueSizeAndDuration[1]
                else:
                    queueSize = 0
                    queueDuration = "00:00"

                embed=discord.Embed(title="Song added in the queue", description=f"New song added : **[{trackTitle}]({track.uri})** ({trackDuration})", color=discord.Colour.random())
                embed.add_field(name="Place in the queue : ", value=f"`{queueSize}`", inline=True)
                embed.add_field(name="Estimated time before playing :", value=f"`{queueDuration}`", inline=True)
                embed.set_thumbnail(url=track.thumb)
                await ctx.channel.send(embed=embed)
            else:
                # If it's a playlist => Update the same message to do not spam the channel
                if playlistMessage is None:
                    embed=discord.Embed(title="Song added in the queue", description=f"- **[{trackTitle}]({track.uri})** ({trackDuration})", color=discord.Colour.random())
                    embed.set_thumbnail(url=track.thumb)
                    playlistMessage = await ctx.channel.send(embed=embed)
                else:
                    # Update the message
                    embedEdited = discord.Embed(title="Songs added in the queue", description= playlistMessage.embeds[0].description + f"\n- **[{trackTitle}]({track.uri})** ({trackDuration})", color=discord.Colour.random())
                    playlistMessage.embeds[0].description = embedEdited.description
                    if len(playlistMessage.embeds[0].description) > 1800:
                        embed=discord.Embed(title="Song added in the queue", description=f"- **[{trackTitle}]({track.uri})** ({trackDuration})", color=discord.Colour.random())
                        embed.set_thumbnail(url=track.thumb)
                        playlistMessage = await ctx.channel.send(embed=embed)
                    else:
                        await playlistMessage.edit(embed=embedEdited)
        else:
            DBServer(self.bot.dbConnection).clearMusicParameters(ctx.guild.id, False, False)

            DBQueue(self.bot.dbConnection).add(ctx.guild.id, True, requester, ctx.channel.id, track.uri, track.title, track.duration, 1) # Add to the DB
            # Play the track
            await playTrack(self, ctx, player, track, requester)