Compare commits

...

9 commits

Author SHA1 Message Date
8cc3e70f24
chore: improved readability
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-14 09:05:27 +01:00
1dec02f40f
chore: upgrade gradle to 8.5
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-13 19:11:28 +01:00
e3d107199e
chore: update Copyright
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-13 19:08:08 +01:00
425c9bf1cd
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-13 19:02:38 +01:00
3d66548a3d
fix: bot now doesn't leave when failing to find a song with no song in queue and one playing
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-13 19:02:12 +01:00
9b51693a75
feat: make the bot leave, if they are the last one in the vc
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-13 18:52:46 +01:00
8b6b7dc5d5
feat: leave vc, if there is no song next up and the current one failed to load 2023-12-13 18:50:38 +01:00
ae507dc4aa
feat: added time delay to allow for lavalink to start in docker container, added debug flag to skip the wait, if in dev env 2023-12-13 18:19:32 +01:00
232a854863
chore: add new command to README 2023-12-13 18:06:14 +01:00
38 changed files with 136 additions and 99 deletions

View file

@ -26,6 +26,7 @@ A Discord music bot, written in Kotlin using the kord library.
- skip -- Skip to the next song - skip -- Skip to the next song
- queue -- Show what songs are next up - queue -- Show what songs are next up
- nowplaying -- Show what is currently playing - nowplaying -- Show what is currently playing
- seek -- Seek to a specific time in the song
- Features - Features
- Button Controller -- You can control the currently playing music using buttons. - Button Controller -- You can control the currently playing music using buttons.

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
import org.jetbrains.gradle.ext.ProjectSettings import org.jetbrains.gradle.ext.ProjectSettings
@ -33,7 +32,7 @@ val ownerID = 372703841151614976L
group = "net.moonleay.botendo" group = "net.moonleay.botendo"
version = System.getenv("CI_COMMIT_TAG")?.let { "$it-${System.getenv("CI_COMMIT_SHORT_SHA")}-prod" } version = System.getenv("CI_COMMIT_TAG")?.let { "$it-${System.getenv("CI_COMMIT_SHORT_SHA")}-prod" }
?: System.getenv("CI_COMMIT_SHORT_SHA")?.let { "$it-dev" } ?: System.getenv("CI_COMMIT_SHORT_SHA")?.let { "$it-dev" }
?: "6.5.3" ?: "6.5.5"
val kordext_ver = "1.7.1-SNAPSHOT" val kordext_ver = "1.7.1-SNAPSHOT"
val lavakord_ver = "6.0.0" val lavakord_ver = "6.0.0"

View file

@ -15,5 +15,4 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
#
kotlin.code.style=official kotlin.code.style=official

Binary file not shown.

View file

@ -15,9 +15,11 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
#
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

42
gradlew vendored
View file

@ -17,7 +17,6 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
#
############################################################################## ##############################################################################
# #
@ -58,7 +57,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -83,13 +82,11 @@ do
esac esac
done done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # This is normally unused
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -136,22 +133,29 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -196,11 +200,15 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
# shell script including quotes and variable substitutions, so put them in DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded. # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
@ -208,6 +216,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \ org.gradle.wrapper.GradleWrapperMain \
"$@" "$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args. # Use "xargs" to parse quoted args.
# #
# With -n1 it outputs one arg per line, with the quotes and backslashes removed. # With -n1 it outputs one arg per line, with the quotes and backslashes removed.

15
gradlew.bat vendored
View file

@ -14,7 +14,7 @@
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@if "%DEBUG%" == "" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@rem Gradle startup script for Windows @rem Gradle startup script for Windows
@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd if %ERRORLEVEL% equ 0 goto mainEnd
:fail :fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code! rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 set EXIT_CODE=%ERRORLEVEL%
exit /b 1 if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd :mainEnd
if "%OS%"=="Windows_NT" endlocal if "%OS%"=="Windows_NT" endlocal

View file

@ -1,20 +1,19 @@
/* /*
* Botendo * Botendo
* Copyright (C) 2023 limited_dev * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * 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/>.
* *
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
rootProject.name = "Botendo" rootProject.name = "Botendo"

View file

@ -14,25 +14,31 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo package net.moonleay.botendo
import com.kotlindiscord.kord.extensions.ExtensibleBot import com.kotlindiscord.kord.extensions.ExtensibleBot
import dev.kord.common.Color import dev.kord.common.Color
import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.getChannelOf
import dev.kord.core.behavior.interaction.response.respond import dev.kord.core.behavior.interaction.response.respond
import dev.kord.core.entity.channel.VoiceChannel
import dev.kord.core.event.interaction.ButtonInteractionCreateEvent import dev.kord.core.event.interaction.ButtonInteractionCreateEvent
import dev.kord.core.event.user.VoiceStateUpdateEvent
import dev.kord.core.on import dev.kord.core.on
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.LavaKord import dev.schlaubi.lavakord.LavaKord
import dev.schlaubi.lavakord.audio.Link
import dev.schlaubi.lavakord.kord.getLink
import dev.schlaubi.lavakord.kord.lavakord import dev.schlaubi.lavakord.kord.lavakord
import kotlinx.coroutines.flow.count
import net.moonleay.botendo.data.CredentialManager import net.moonleay.botendo.data.CredentialManager
import net.moonleay.botendo.extensions.music.* import net.moonleay.botendo.extensions.music.*
import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.extensions.util.InfoExtension import net.moonleay.botendo.extensions.util.InfoExtension
import net.moonleay.botendo.util.Logger import net.moonleay.botendo.util.Logger
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.UserUtil
object Bot { object Bot {
//The kord object gets set at app launch //The kord object gets set at app launch
@ -69,7 +75,7 @@ object Bot {
} }
this.presence { this.presence {
this.streaming("music", "https://twitch.tv/limited_dev") this.streaming("music", "https://twitch.tv/moonleaytv")
} }
} }
@ -91,6 +97,7 @@ object Bot {
b.onInteraction(response, g, u) b.onInteraction(response, g, u)
return@on return@on
} }
// Button not found
response.respond { response.respond {
this.embed { this.embed {
this.color = Color(0xE0311A) this.color = Color(0xE0311A)
@ -103,6 +110,34 @@ object Bot {
} }
} }
// Allow the bot to leave the VC if there are no users in the VC
bot.kordRef.on<VoiceStateUpdateEvent> {
if (this.state.userId == bot.kordRef.selfId) {
// Ignore self
return@on
}
val g = this.state.getGuild().asGuild()
val link = lava.getLink(g.id)
if (link.state != Link.State.CONNECTED) {
// Ignore if not connected
return@on
}
val myChannel = link.lastChannelId!!
if (g.getChannelOrNull(Snowflake(myChannel)) == null) {
// Ignore if channel cannot be found
return@on
}
val ch = g.getChannelOf<VoiceChannel>(Snowflake(myChannel))
if (ch.voiceStates.count() > 1) {
// Ignore if there are other users in the channel
return@on
}
// Stop playing if there are no users in the channel
val pl = MusicManager.getMusicManager(g)!!.pl
pl.stopTrack()
link.destroy()
}
//Start the bot //Start the bot
bot.start() bot.start()
} }

View file

@ -14,14 +14,15 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo package net.moonleay.botendo
import net.moonleay.botendo.util.Logger
///Show the splash and launch the Bot ///Show the splash and launch the Bot
suspend fun main() { suspend fun main(args: Array<String>) {
println( println(
"M#\"\"\"\"\"\"\"'M dP dP \n" + "M#\"\"\"\"\"\"\"'M dP dP \n" +
"## mmmm. `M 88 88 \n" + "## mmmm. `M 88 88 \n" +
@ -33,5 +34,9 @@ suspend fun main() {
" " " "
) )
println("Bot v.${net.moonleay.botendo.build.BuildConstants.version}, Kord Extensions v.${net.moonleay.botendo.build.BuildConstants.kordVersion}, LavaKord v.${net.moonleay.botendo.build.BuildConstants.lavaVersion}, Coroutines v.${net.moonleay.botendo.build.BuildConstants.coroutinesVersion}") println("Bot v.${net.moonleay.botendo.build.BuildConstants.version}, Kord Extensions v.${net.moonleay.botendo.build.BuildConstants.kordVersion}, LavaKord v.${net.moonleay.botendo.build.BuildConstants.lavaVersion}, Coroutines v.${net.moonleay.botendo.build.BuildConstants.coroutinesVersion}")
if(args.isEmpty() || args[0] != "--debug") {
Logger.out("Waiting 10 seconds for Lavalink to start...")
Thread.sleep(10000)
}
Bot.start() Bot.start()
} }

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.buttons package net.moonleay.botendo.buttons

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.buttons package net.moonleay.botendo.buttons

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.buttons.music package net.moonleay.botendo.buttons.music
@ -27,12 +26,10 @@ import dev.kord.core.entity.User
import dev.kord.rest.builder.component.ActionRowBuilder import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.kord.rest.builder.message.modify.actionRow
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.ButtonUtil import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.UserUtil
class PauseButton : net.moonleay.botendo.buttons.Button("btn.music.pause") { class PauseButton : net.moonleay.botendo.buttons.Button("btn.music.pause") {
override suspend fun onInteraction( override suspend fun onInteraction(

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.buttons.music package net.moonleay.botendo.buttons.music
@ -27,13 +26,11 @@ import dev.kord.core.entity.User
import dev.kord.rest.builder.component.ActionRowBuilder import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.kord.rest.builder.message.modify.actionRow
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.ButtonUtil import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.TimeUtil import net.moonleay.botendo.util.TimeUtil
import net.moonleay.botendo.util.UserUtil
class QueueButton : net.moonleay.botendo.buttons.Button("btn.music.queue") { class QueueButton : net.moonleay.botendo.buttons.Button("btn.music.queue") {
override suspend fun onInteraction( override suspend fun onInteraction(

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.buttons.music package net.moonleay.botendo.buttons.music
@ -27,12 +26,10 @@ import dev.kord.core.entity.User
import dev.kord.rest.builder.component.ActionRowBuilder import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.kord.rest.builder.message.modify.actionRow
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.ButtonUtil import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.UserUtil
class RepeatButton : net.moonleay.botendo.buttons.Button("btn.music.repeat") { class RepeatButton : net.moonleay.botendo.buttons.Button("btn.music.repeat") {
override suspend fun onInteraction( override suspend fun onInteraction(

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.buttons.music package net.moonleay.botendo.buttons.music
@ -28,10 +27,12 @@ import dev.kord.core.entity.User
import dev.kord.rest.builder.component.ActionRowBuilder import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.kord.rest.builder.message.modify.actionRow
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.* import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.TimeUtil
import net.moonleay.botendo.util.UrlUtil
class SkipButton : net.moonleay.botendo.buttons.Button("btn.music.skip") { class SkipButton : net.moonleay.botendo.buttons.Button("btn.music.skip") {
override suspend fun onInteraction( override suspend fun onInteraction(

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.buttons.music package net.moonleay.botendo.buttons.music
@ -28,7 +27,6 @@ import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.UserUtil
class StopButton : net.moonleay.botendo.buttons.Button("btn.music.stop") { class StopButton : net.moonleay.botendo.buttons.Button("btn.music.stop") {
override suspend fun onInteraction( override suspend fun onInteraction(

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.data package net.moonleay.botendo.data

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music package net.moonleay.botendo.extensions.music
@ -24,12 +23,14 @@ import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import dev.kord.common.Color import dev.kord.common.Color
import dev.kord.rest.builder.component.ActionRowBuilder import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.create.actionRow
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import dev.schlaubi.lavakord.kord.getLink import dev.schlaubi.lavakord.kord.getLink
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.* import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.TimeUtil
import net.moonleay.botendo.util.UrlUtil
class NowPlayingExtension : Extension() { class NowPlayingExtension : Extension() {
override val name = "nowplaying" override val name = "nowplaying"

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music package net.moonleay.botendo.extensions.music
@ -25,6 +24,7 @@ import dev.kord.common.Color
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import dev.schlaubi.lavakord.kord.getLink import dev.schlaubi.lavakord.kord.getLink
import net.moonleay.botendo.Bot
import net.moonleay.botendo.extensions.music.components.LinkArguments import net.moonleay.botendo.extensions.music.components.LinkArguments
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
@ -41,7 +41,7 @@ class PlayExtension : Extension() {
description = "Play music" description = "Play music"
this.action { this.action {
val guildId = this.guild!!.id val guildId = this.guild!!.id
val link = net.moonleay.botendo.Bot.lava.getLink(guildId) val link = Bot.lava.getLink(guildId)
val u = this.user val u = this.user
val vcsUser = u.asMember(guildId).getVoiceStateOrNull() val vcsUser = u.asMember(guildId).getVoiceStateOrNull()
if (vcsUser == null) { if (vcsUser == null) {

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music package net.moonleay.botendo.extensions.music
@ -23,16 +22,13 @@ import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import dev.kord.common.Color import dev.kord.common.Color
import dev.kord.rest.builder.component.ActionRowBuilder import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.message.EmbedBuilder.Limits.title
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.create.actionRow
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.ButtonUtil import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.TimeUtil import net.moonleay.botendo.util.TimeUtil
import net.moonleay.botendo.util.UserUtil
class QueueExtension : Extension() { class QueueExtension : Extension() {
override val name = "queue" override val name = "queue"

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music package net.moonleay.botendo.extensions.music
@ -28,7 +27,10 @@ import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.extensions.music.components.SeekArguments import net.moonleay.botendo.extensions.music.components.SeekArguments
import net.moonleay.botendo.util.* import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.TimeUtil
import net.moonleay.botendo.util.UrlUtil
class SeekExtension : Extension() { class SeekExtension : Extension() {
override val name = "seek" override val name = "seek"

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music package net.moonleay.botendo.extensions.music
@ -24,11 +23,13 @@ import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import dev.kord.common.Color import dev.kord.common.Color
import dev.kord.rest.builder.component.ActionRowBuilder import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.create.actionRow
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.* import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.TimeUtil
import net.moonleay.botendo.util.UrlUtil
class SkipExtension : Extension() { class SkipExtension : Extension() {
override val name = "skip" override val name = "skip"

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music package net.moonleay.botendo.extensions.music
@ -27,7 +26,6 @@ import dev.schlaubi.lavakord.audio.Link
import dev.schlaubi.lavakord.kord.getLink import dev.schlaubi.lavakord.kord.getLink
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.UserUtil
class StopExtension : Extension() { class StopExtension : Extension() {
override val name = "stop" override val name = "stop"

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music package net.moonleay.botendo.extensions.music
@ -28,7 +27,6 @@ import dev.schlaubi.lavakord.kord.getLink
import net.moonleay.botendo.extensions.music.components.LinkArguments import net.moonleay.botendo.extensions.music.components.LinkArguments
import net.moonleay.botendo.extensions.music.components.MusicManager import net.moonleay.botendo.extensions.music.components.MusicManager
import net.moonleay.botendo.util.MessageUtil import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.UserUtil
class UpsertExtension : Extension() { class UpsertExtension : Extension() {

View file

@ -14,15 +14,14 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music.components package net.moonleay.botendo.extensions.music.components
import dev.arbjerg.lavalink.protocol.v4.LoadResult
import dev.arbjerg.lavalink.protocol.v4.Track import dev.arbjerg.lavalink.protocol.v4.Track
import dev.schlaubi.lavakord.audio.* import dev.schlaubi.lavakord.audio.*
import dev.schlaubi.lavakord.audio.player.Player import dev.schlaubi.lavakord.audio.player.Player
import net.moonleay.botendo.Bot
import net.moonleay.botendo.util.Logger import net.moonleay.botendo.util.Logger
import java.util.concurrent.BlockingQueue import java.util.concurrent.BlockingQueue
import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.LinkedBlockingQueue
@ -97,7 +96,7 @@ class GuildTrackScheduler(val pl: Player) {
return return
} }
Logger.out("Track has ended; Playing next...") Logger.out("Track has ended; Playing next...")
playNext(net.moonleay.botendo.Bot.lava.getLink(e.guildId)) playNext(Bot.lava.getLink(e.guildId))
} }
} }

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music.components package net.moonleay.botendo.extensions.music.components

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music.components package net.moonleay.botendo.extensions.music.components
@ -31,11 +30,18 @@ import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.audio.Link import dev.schlaubi.lavakord.audio.Link
import dev.schlaubi.lavakord.audio.player.Player import dev.schlaubi.lavakord.audio.player.Player
import dev.schlaubi.lavakord.rest.loadItem import dev.schlaubi.lavakord.rest.loadItem
import net.moonleay.botendo.util.* import net.moonleay.botendo.util.ButtonUtil
import net.moonleay.botendo.util.MessageUtil
import net.moonleay.botendo.util.TimeUtil
import net.moonleay.botendo.util.UrlUtil
object MusicManager { object MusicManager {
private var musicManagerMap: MutableMap<Snowflake, GuildTrackScheduler> = mutableMapOf() private var musicManagerMap: MutableMap<Snowflake, GuildTrackScheduler> = mutableMapOf()
fun getMusicManager(guild: Guild): GuildTrackScheduler? {
return musicManagerMap[guild.id]
}
fun getGuildTrackScheduler(guild: Guild, player: Player): GuildTrackScheduler { fun getGuildTrackScheduler(guild: Guild, player: Player): GuildTrackScheduler {
return musicManagerMap.computeIfAbsent(guild.id) { return musicManagerMap.computeIfAbsent(guild.id) {
GuildTrackScheduler(player) GuildTrackScheduler(player)
@ -181,6 +187,10 @@ object MusicManager {
} }
is LoadResult.NoMatches -> { is LoadResult.NoMatches -> {
if (gts.isEmpty() && player.playingTrack == null) {
player.stopTrack()
link.destroy()
}
if (!silent) if (!silent)
ctx.respond { ctx.respond {
this.embed { this.embed {
@ -194,6 +204,10 @@ object MusicManager {
} }
} }
is LoadResult.LoadFailed -> { is LoadResult.LoadFailed -> {
if (gts.isEmpty() && player.playingTrack == null) {
player.stopTrack()
link.destroy()
}
if (!silent) if (!silent)
ctx.respond { ctx.respond {
this.embed { this.embed {

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.music.components package net.moonleay.botendo.extensions.music.components

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.extensions.util package net.moonleay.botendo.extensions.util

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.util package net.moonleay.botendo.util

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.util package net.moonleay.botendo.util

View file

@ -14,17 +14,11 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.util package net.moonleay.botendo.util
import com.kotlindiscord.kord.extensions.commands.Arguments
import com.kotlindiscord.kord.extensions.commands.application.slash.PublicSlashCommandContext
import com.kotlindiscord.kord.extensions.components.forms.ModalForm
import dev.kord.common.Color
import dev.kord.core.behavior.UserBehavior import dev.kord.core.behavior.UserBehavior
import dev.kord.rest.builder.message.EmbedBuilder
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.util package net.moonleay.botendo.util

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.util package net.moonleay.botendo.util

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.util package net.moonleay.botendo.util

View file

@ -14,7 +14,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
package net.moonleay.botendo.util package net.moonleay.botendo.util

View file

@ -15,4 +15,3 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
#