feat: added UpsertExtension to add a Queue into the first place of the queue
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
This commit is contained in:
parent
1654d24378
commit
e7001f9946
6 changed files with 172 additions and 23 deletions
|
@ -63,6 +63,7 @@ object Bot {
|
||||||
add(::SkipExtension)
|
add(::SkipExtension)
|
||||||
add(::NowPlayingExtension)
|
add(::NowPlayingExtension)
|
||||||
add(::QueueExtension)
|
add(::QueueExtension)
|
||||||
|
add(::UpsertExtension)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.presence {
|
this.presence {
|
||||||
|
|
|
@ -19,12 +19,11 @@
|
||||||
|
|
||||||
package de.limited_dev.botendo.extensions.music
|
package de.limited_dev.botendo.extensions.music
|
||||||
|
|
||||||
import com.kotlindiscord.kord.extensions.commands.Arguments
|
|
||||||
import com.kotlindiscord.kord.extensions.commands.converters.impl.string
|
|
||||||
import com.kotlindiscord.kord.extensions.extensions.Extension
|
import com.kotlindiscord.kord.extensions.extensions.Extension
|
||||||
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
|
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
|
||||||
import com.kotlindiscord.kord.extensions.types.respond
|
import com.kotlindiscord.kord.extensions.types.respond
|
||||||
import de.limited_dev.botendo.Bot
|
import de.limited_dev.botendo.Bot
|
||||||
|
import de.limited_dev.botendo.extensions.music.components.LinkArguments
|
||||||
import de.limited_dev.botendo.extensions.music.components.MusicManager
|
import de.limited_dev.botendo.extensions.music.components.MusicManager
|
||||||
import de.limited_dev.botendo.util.MessageUtil
|
import de.limited_dev.botendo.util.MessageUtil
|
||||||
import dev.kord.common.Color
|
import dev.kord.common.Color
|
||||||
|
@ -37,7 +36,7 @@ class PlayExtension : Extension() {
|
||||||
override val name = "play"
|
override val name = "play"
|
||||||
|
|
||||||
override suspend fun setup() {
|
override suspend fun setup() {
|
||||||
publicSlashCommand(::PlayArgs) {
|
publicSlashCommand(::LinkArguments) {
|
||||||
name = "play"
|
name = "play"
|
||||||
description = "Play music"
|
description = "Play music"
|
||||||
this.action {
|
this.action {
|
||||||
|
@ -97,12 +96,5 @@ class PlayExtension : Extension() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class PlayArgs : Arguments() {
|
|
||||||
val linkquery by string {
|
|
||||||
name = "linkqery"
|
|
||||||
description = "Song link or search query"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* Botendo
|
||||||
|
* Copyright (C) 2023 moonleay
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.limited_dev.botendo.extensions.music
|
||||||
|
|
||||||
|
import com.kotlindiscord.kord.extensions.extensions.Extension
|
||||||
|
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
|
||||||
|
import com.kotlindiscord.kord.extensions.types.respond
|
||||||
|
import de.limited_dev.botendo.Bot
|
||||||
|
import de.limited_dev.botendo.extensions.music.components.LinkArguments
|
||||||
|
import de.limited_dev.botendo.extensions.music.components.MusicManager
|
||||||
|
import de.limited_dev.botendo.util.MessageUtil
|
||||||
|
import dev.kord.common.Color
|
||||||
|
import dev.schlaubi.lavakord.audio.Link
|
||||||
|
import dev.schlaubi.lavakord.kord.getLink
|
||||||
|
|
||||||
|
|
||||||
|
class UpsertExtension : Extension() {
|
||||||
|
|
||||||
|
override val name = "upsert"
|
||||||
|
|
||||||
|
override suspend fun setup() {
|
||||||
|
publicSlashCommand(::LinkArguments) {
|
||||||
|
name = "upsert"
|
||||||
|
description = "Upsert music"
|
||||||
|
this.action {
|
||||||
|
val guildId = this.guild!!.id
|
||||||
|
val link = Bot.lava.getLink(guildId)
|
||||||
|
val u = this.user
|
||||||
|
val vcsUser = u.asMember(guildId).getVoiceStateOrNull()
|
||||||
|
if (vcsUser == null) {
|
||||||
|
this.respond {
|
||||||
|
embeds.add(
|
||||||
|
MessageUtil.getEmbed(
|
||||||
|
Color(0xE0311A),
|
||||||
|
"You are not connected to a VC",
|
||||||
|
"Please connect to a VC",
|
||||||
|
u.asUser().username + "#" + u.asUser().discriminator
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return@action
|
||||||
|
}
|
||||||
|
|
||||||
|
val channelId = vcsUser.channelId
|
||||||
|
|
||||||
|
if (link.state != Link.State.CONNECTED) {
|
||||||
|
link.connectAudio(channelId!!.value)
|
||||||
|
} else if (link.state == Link.State.CONNECTED && link.lastChannelId != channelId!!.value) {
|
||||||
|
this.respond {
|
||||||
|
embeds.add(
|
||||||
|
MessageUtil.getEmbed(
|
||||||
|
Color(0xE0311A),
|
||||||
|
"You are not in my VC",
|
||||||
|
"We are not in the same VC and therefore, you cannot play any music",
|
||||||
|
u.asUser().username + "#" + u.asUser().discriminator
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return@action
|
||||||
|
}
|
||||||
|
|
||||||
|
val query = arguments.linkquery
|
||||||
|
val search = if (query.startsWith("http")) {
|
||||||
|
query
|
||||||
|
} else {
|
||||||
|
"ytsearch:$query"
|
||||||
|
}
|
||||||
|
this.respond {
|
||||||
|
embeds.add(
|
||||||
|
MessageUtil.getEmbed(
|
||||||
|
Color(0xE0A81A),
|
||||||
|
"Searching...",
|
||||||
|
"We are looking for $query",
|
||||||
|
u.asUser().username + "#" + u.asUser().discriminator
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
MusicManager.upsertIntoQueue(this, link, search)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -34,12 +34,25 @@ class GuildTrackScheduler(val pl: Player) {
|
||||||
private var hasRegisteredEvents = false
|
private var hasRegisteredEvents = false
|
||||||
|
|
||||||
///Add a track to queue and start playing, if there is no song currently playing
|
///Add a track to queue and start playing, if there is no song currently playing
|
||||||
suspend fun queue(track: PartialTrack) {
|
suspend fun queue(track: PartialTrack, type: MusicManager.AddType) {
|
||||||
if (this.pl.playingTrack == null) {
|
if (this.pl.playingTrack == null) {
|
||||||
play(track)
|
play(track)
|
||||||
} else {
|
return
|
||||||
|
}
|
||||||
|
when (type) {
|
||||||
|
MusicManager.AddType.QUEUE -> {
|
||||||
queue.offer(track)
|
queue.offer(track)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MusicManager.AddType.UPSERT -> {
|
||||||
|
val nq = LinkedBlockingQueue<PartialTrack>()
|
||||||
|
nq.offer(track)
|
||||||
|
for (t in queue.toList()) {
|
||||||
|
nq.offer(t)
|
||||||
|
}
|
||||||
|
queue = nq
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun playNext(link: Link) {
|
suspend fun playNext(link: Link) {
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Botendo
|
||||||
|
* Copyright (C) 2023 moonleay
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.limited_dev.botendo.extensions.music.components
|
||||||
|
|
||||||
|
import com.kotlindiscord.kord.extensions.commands.Arguments
|
||||||
|
import com.kotlindiscord.kord.extensions.commands.converters.impl.string
|
||||||
|
|
||||||
|
class LinkArguments : Arguments() {
|
||||||
|
val linkquery by string {
|
||||||
|
name = "linkqery"
|
||||||
|
description = "Song link or search query"
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,7 +22,6 @@ package de.limited_dev.botendo.extensions.music.components
|
||||||
import com.kotlindiscord.kord.extensions.commands.application.slash.PublicSlashCommandContext
|
import com.kotlindiscord.kord.extensions.commands.application.slash.PublicSlashCommandContext
|
||||||
import com.kotlindiscord.kord.extensions.components.forms.ModalForm
|
import com.kotlindiscord.kord.extensions.components.forms.ModalForm
|
||||||
import com.kotlindiscord.kord.extensions.types.respond
|
import com.kotlindiscord.kord.extensions.types.respond
|
||||||
import de.limited_dev.botendo.extensions.music.PlayExtension
|
|
||||||
import de.limited_dev.botendo.util.ButtonUtil
|
import de.limited_dev.botendo.util.ButtonUtil
|
||||||
import de.limited_dev.botendo.util.MessageUtil
|
import de.limited_dev.botendo.util.MessageUtil
|
||||||
import de.limited_dev.botendo.util.TimeUtil
|
import de.limited_dev.botendo.util.TimeUtil
|
||||||
|
@ -47,17 +46,26 @@ object MusicManager {
|
||||||
|
|
||||||
|
|
||||||
suspend fun addToQueue(
|
suspend fun addToQueue(
|
||||||
ctx: PublicSlashCommandContext<PlayExtension.PlayArgs, ModalForm>,
|
ctx: PublicSlashCommandContext<LinkArguments, ModalForm>,
|
||||||
link: Link,
|
link: Link,
|
||||||
search: String
|
search: String
|
||||||
) {
|
) {
|
||||||
addToQueue(ctx, link, search, false)
|
addToQueue(ctx, link, search, AddType.QUEUE, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun upsertIntoQueue(
|
||||||
|
ctx: PublicSlashCommandContext<LinkArguments, ModalForm>,
|
||||||
|
link: Link,
|
||||||
|
search: String
|
||||||
|
) {
|
||||||
|
addToQueue(ctx, link, search, AddType.UPSERT, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun addToQueue(
|
suspend fun addToQueue(
|
||||||
ctx: PublicSlashCommandContext<PlayExtension.PlayArgs, ModalForm>,
|
ctx: PublicSlashCommandContext<LinkArguments, ModalForm>,
|
||||||
link: Link,
|
link: Link,
|
||||||
search: String,
|
search: String,
|
||||||
|
type: AddType,
|
||||||
silent: Boolean
|
silent: Boolean
|
||||||
) {
|
) {
|
||||||
val player = link.player
|
val player = link.player
|
||||||
|
@ -69,13 +77,13 @@ object MusicManager {
|
||||||
|
|
||||||
when (item.loadType) {
|
when (item.loadType) {
|
||||||
TrackResponse.LoadType.TRACK_LOADED -> {
|
TrackResponse.LoadType.TRACK_LOADED -> {
|
||||||
gts.queue(item.track)
|
gts.queue(item.track, type)
|
||||||
if (!silent)
|
if (!silent)
|
||||||
ctx.respond {
|
ctx.respond {
|
||||||
this.embeds.add(
|
this.embeds.add(
|
||||||
MessageUtil.getEmbedWithImage(
|
MessageUtil.getEmbedWithImage(
|
||||||
Color(0x52E01A),
|
Color(0x52E01A),
|
||||||
"Queuing track from link",
|
"${type.s} track from link",
|
||||||
"**${item.track.info.title}**\n*Queue*\nby ${item.track.info.author} ;: ${
|
"**${item.track.info.title}**\n*Queue*\nby ${item.track.info.author} ;: ${
|
||||||
TimeUtil.getTimeFormatedRaw(
|
TimeUtil.getTimeFormatedRaw(
|
||||||
item.track.info.length
|
item.track.info.length
|
||||||
|
@ -100,14 +108,14 @@ object MusicManager {
|
||||||
TrackResponse.LoadType.PLAYLIST_LOADED -> {
|
TrackResponse.LoadType.PLAYLIST_LOADED -> {
|
||||||
val l = item.tracks.reversed()
|
val l = item.tracks.reversed()
|
||||||
for (partialTrack in l) {
|
for (partialTrack in l) {
|
||||||
gts.queue(partialTrack)
|
gts.queue(partialTrack, type)
|
||||||
}
|
}
|
||||||
if (!silent)
|
if (!silent)
|
||||||
ctx.respond {
|
ctx.respond {
|
||||||
this.embeds.add(
|
this.embeds.add(
|
||||||
MessageUtil.getEmbedWithImage(
|
MessageUtil.getEmbedWithImage(
|
||||||
Color(0x52E01A),
|
Color(0x52E01A),
|
||||||
"Queuing playlist from link",
|
"${type.s} playlist from link",
|
||||||
"**${item.tracks.first().info.title}**\n*${item.playlistInfo.name}*\nby ${item.tracks.first().info.author} ;: ${
|
"**${item.tracks.first().info.title}**\n*${item.playlistInfo.name}*\nby ${item.tracks.first().info.author} ;: ${
|
||||||
TimeUtil.getTimeFormatedRaw(
|
TimeUtil.getTimeFormatedRaw(
|
||||||
item.tracks.first().info.length
|
item.tracks.first().info.length
|
||||||
|
@ -130,13 +138,13 @@ object MusicManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
TrackResponse.LoadType.SEARCH_RESULT -> {
|
TrackResponse.LoadType.SEARCH_RESULT -> {
|
||||||
gts.queue(item.tracks.first())
|
gts.queue(item.tracks.first(), type)
|
||||||
if (!silent)
|
if (!silent)
|
||||||
ctx.respond {
|
ctx.respond {
|
||||||
this.embeds.add(
|
this.embeds.add(
|
||||||
MessageUtil.getEmbedWithImage(
|
MessageUtil.getEmbedWithImage(
|
||||||
Color(0x52E01A),
|
Color(0x52E01A),
|
||||||
"Queuing track from query",
|
"${type.s} track from query",
|
||||||
"**${item.tracks.first().info.title}**\n*Queue*\nby ${item.tracks.first().info.author} ;: ${
|
"**${item.tracks.first().info.title}**\n*Queue*\nby ${item.tracks.first().info.author} ;: ${
|
||||||
TimeUtil.getTimeFormatedRaw(
|
TimeUtil.getTimeFormatedRaw(
|
||||||
item.tracks.first().info.length
|
item.tracks.first().info.length
|
||||||
|
@ -186,4 +194,9 @@ object MusicManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum class AddType(val s: String) {
|
||||||
|
QUEUE("Added"),
|
||||||
|
UPSERT("Upserted")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue