diff --git a/src/main/kotlin/de/limited_dev/lilJudd/Bot.kt b/src/main/kotlin/de/limited_dev/lilJudd/Bot.kt
index 48db3fe..0f8a0ef 100644
--- a/src/main/kotlin/de/limited_dev/lilJudd/Bot.kt
+++ b/src/main/kotlin/de/limited_dev/lilJudd/Bot.kt
@@ -22,6 +22,7 @@ import com.kotlindiscord.kord.extensions.ExtensibleBot
import de.limited_dev.botendo.build.BuildConstants
import de.limited_dev.lilJudd.data.CredentialManager
import de.limited_dev.lilJudd.data.DB
+import de.limited_dev.lilJudd.extensions.FeatureManageExtension
import de.limited_dev.lilJudd.extensions.VersionExtension
import de.limited_dev.lilJudd.util.Logger
import dev.kord.common.entity.PresenceStatus
@@ -64,11 +65,12 @@ object Bot {
extensions {
add(::VersionExtension)
+ add(::FeatureManageExtension)
}
this.presence {
this.status = PresenceStatus.DoNotDisturb
- this.streaming("v" + BuildConstants.version, "https://www.twitch.tv/deutschesplbundesliga")
+ this.playing("v." + BuildConstants.version)
}
}
diff --git a/src/main/kotlin/de/limited_dev/lilJudd/data/DB.kt b/src/main/kotlin/de/limited_dev/lilJudd/data/DB.kt
index 93e28df..e5d253e 100644
--- a/src/main/kotlin/de/limited_dev/lilJudd/data/DB.kt
+++ b/src/main/kotlin/de/limited_dev/lilJudd/data/DB.kt
@@ -18,23 +18,17 @@
package de.limited_dev.lilJudd.data
-import de.limited_dev.lilJudd.util.Logger
-import java.sql.Connection
-import java.sql.DriverManager
-import kotlin.system.exitProcess
+
+import org.jetbrains.exposed.sql.Database
object DB {
- private lateinit var connection: Connection
+ //Connect to the provided DB; trows errors, if the DB is not avalible.
fun connect(dbDomain: String, dbName: String, dbUser: String, dbPasswd: String) {
- val jdbcUrl = "jdbc:postgresql://$dbDomain/$dbName"
- connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPasswd)
-
- if (connection.isValid(0)) {
- Logger.out("DB Connection Success!")
- } else {
- Logger.out("Could not connect to the Database!")
- Logger.out("Check credentials.nils file.")
- exitProcess(4)
- }
+ Database.connect(
+ "jdbc:postgresql://$dbDomain/$dbName",
+ driver = "org.postgresql.Driver",
+ user = dbUser,
+ password = dbPasswd
+ )
}
}
diff --git a/src/main/kotlin/de/limited_dev/lilJudd/data/tables/TimePlanningChannels.kt b/src/main/kotlin/de/limited_dev/lilJudd/data/tables/TimePlanningChannels.kt
new file mode 100644
index 0000000..fd7f3d6
--- /dev/null
+++ b/src/main/kotlin/de/limited_dev/lilJudd/data/tables/TimePlanningChannels.kt
@@ -0,0 +1,27 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 limited_dev
+ *
+ * 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 .
+ */
+
+package de.limited_dev.lilJudd.data.tables
+
+import org.jetbrains.exposed.dao.id.IntIdTable
+
+object TimePlanningChannels : IntIdTable() {
+ //val aid = integer("id").autoIncrement()
+ var serverid = varchar("serverid", 50)
+ val channelid = varchar("channelid", 50)
+}
diff --git a/src/main/kotlin/de/limited_dev/lilJudd/extensions/FeatureManageExtension.kt b/src/main/kotlin/de/limited_dev/lilJudd/extensions/FeatureManageExtension.kt
new file mode 100644
index 0000000..a04e8e1
--- /dev/null
+++ b/src/main/kotlin/de/limited_dev/lilJudd/extensions/FeatureManageExtension.kt
@@ -0,0 +1,188 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 limited_dev
+ *
+ * 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 .
+ */
+
+package de.limited_dev.lilJudd.extensions
+
+import com.kotlindiscord.kord.extensions.commands.Arguments
+import com.kotlindiscord.kord.extensions.commands.application.slash.converters.impl.enumChoice
+import com.kotlindiscord.kord.extensions.commands.converters.impl.channel
+import com.kotlindiscord.kord.extensions.extensions.Extension
+import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
+import com.kotlindiscord.kord.extensions.types.respond
+import com.kotlindiscord.kord.extensions.utils.hasPermission
+import de.limited_dev.lilJudd.data.tables.TimePlanningChannels
+import de.limited_dev.lilJudd.data.tables.TimePlanningChannels.channelid
+import de.limited_dev.lilJudd.data.tables.TimePlanningChannels.serverid
+import de.limited_dev.lilJudd.extensions.component.EnableOrDisable
+import de.limited_dev.lilJudd.extensions.component.Feature
+import de.limited_dev.lilJudd.util.MessageUtil
+import dev.kord.common.Color
+import dev.kord.common.entity.Permission
+import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
+import org.jetbrains.exposed.sql.and
+import org.jetbrains.exposed.sql.deleteWhere
+import org.jetbrains.exposed.sql.insert
+import org.jetbrains.exposed.sql.select
+import org.jetbrains.exposed.sql.transactions.transaction
+
+class FeatureManageExtension : Extension() {
+
+ override val name = "feature"
+
+ override suspend fun setup() {
+ publicSlashCommand(::FeatureManagerArgs) {
+ name = "feature"
+ description = "Manage features"
+
+ this.action {
+ val u = this.user
+ if (!u.asMember(this.guild!!.id).hasPermission(Permission.Administrator)) {
+ this.respond {
+ embeds.add(
+ MessageUtil.getEmbed(
+ Color(0xE0311A),
+ "403: Forbidden",
+ "You cannot edit features, as you don't have the Administratior permission.",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ )
+ }
+ return@action
+ }
+
+ if (this.arguments.setStatus == EnableOrDisable.ENABLE) {
+ when (this.arguments.feature) {
+ Feature.TIMEPLANNINGFEATURE -> {
+ val gID = this.guild!!.id.toString()
+ val cID = this.arguments.channel.id.toString()
+ val args = this.arguments
+ var alreadyExists: Boolean = false
+ transaction {
+ val entryExists = TimePlanningChannels.select {
+ (serverid eq gID) and
+ (channelid eq cID)
+ }.count() > 0
+
+ alreadyExists = entryExists
+ }
+ if (!alreadyExists) {
+ transaction {
+ TimePlanningChannels.insert {
+ it[serverid] = gID
+ it[channelid] = cID
+ } get TimePlanningChannels.id
+ }
+ this.respond {
+ embeds.add(
+ MessageUtil.getEmbed(
+ Color(0x52E01A),
+ "200: Success",
+ "The feature was enabled in channel ${args.channel.data.name}",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ )
+ }
+ return@action
+ }
+ this.respond {
+ embeds.add(
+ MessageUtil.getEmbed(
+ Color(0xE0311A),
+ "403: Forbidden",
+ "The feature is already enabled in this channel.",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ )
+ }
+ }
+ }
+ return@action
+ }
+ //Disable
+ when (this.arguments.feature) {
+ Feature.TIMEPLANNINGFEATURE -> {
+ val gID = this.guild!!.id.toString()
+ val cID = this.arguments.channel.id.toString()
+ var alreadyExists = false
+ transaction {
+ val entryExists = TimePlanningChannels.select {
+ (serverid eq gID) and
+ (channelid eq cID)
+ }.count() > 0
+
+ alreadyExists = entryExists
+ }
+ if (alreadyExists) {
+ transaction {
+ val matchingEntries = TimePlanningChannels.select {
+ (serverid eq gID) and
+ (channelid eq cID)
+ }.toList()
+
+ matchingEntries.forEach { entry ->
+ TimePlanningChannels.deleteWhere { id eq entry[id] }
+ }
+ }
+ this.respond {
+ embeds.add(
+ MessageUtil.getEmbed(
+ Color(0x52E019),
+ "200: Success",
+ "The feature was disabled.",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ )
+ }
+ return@action
+ }
+ this.respond {
+ embeds.add(
+ MessageUtil.getEmbed(
+ Color(0xE0311A),
+ "403: Forbidden",
+ "The feature is already disabled in this channel.",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+
+ inner class FeatureManagerArgs : Arguments() {
+
+ val feature by enumChoice {
+ this.name = "feature"
+ this.description = "The targeted feature"
+ this.typeName = "en_US"
+ }
+
+ val setStatus by enumChoice {
+ this.name = "set"
+ this.description = "Set enabled or disabled"
+ this.typeName = "en_US"
+ }
+
+ val channel by channel {
+ this.name = "channel"
+ this.description = "Target Channel"
+ }
+ }
+}
diff --git a/src/main/kotlin/de/limited_dev/lilJudd/extensions/VersionExtension.kt b/src/main/kotlin/de/limited_dev/lilJudd/extensions/VersionExtension.kt
index 94eb96e..66616d8 100644
--- a/src/main/kotlin/de/limited_dev/lilJudd/extensions/VersionExtension.kt
+++ b/src/main/kotlin/de/limited_dev/lilJudd/extensions/VersionExtension.kt
@@ -22,6 +22,7 @@ import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import de.limited_dev.botendo.build.BuildConstants
import de.limited_dev.lilJudd.util.MessageUtil
+import dev.kord.common.Color
class VersionExtension : Extension() {
override val name = "version"
@@ -31,7 +32,9 @@ class VersionExtension : Extension() {
description = "Show infos about the bot"
this.action {
MessageUtil.sendEmbedForPublicSlashCommand(
- this, "Lil' Judd",
+ this,
+ Color(0x52E01A),
+ "Lil' Judd",
"Lil' Judd ***v." + BuildConstants.version + "***\n" +
"Kord-Extensions ***v." + BuildConstants.kordVersion + "***\n" +
"Coroutines ***v." + BuildConstants.coroutinesVersion + "***"
diff --git a/src/main/kotlin/de/limited_dev/lilJudd/extensions/component/EnableOrDisable.kt b/src/main/kotlin/de/limited_dev/lilJudd/extensions/component/EnableOrDisable.kt
new file mode 100644
index 0000000..4067eb8
--- /dev/null
+++ b/src/main/kotlin/de/limited_dev/lilJudd/extensions/component/EnableOrDisable.kt
@@ -0,0 +1,27 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 limited_dev
+ *
+ * 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 .
+ */
+
+package de.limited_dev.lilJudd.extensions.component
+
+import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
+
+enum class EnableOrDisable(override val readableName: String) : ChoiceEnum {
+ ENABLE("Enable"),
+ DISABLE("Disable");
+
+}
diff --git a/src/main/kotlin/de/limited_dev/lilJudd/extensions/component/Feature.kt b/src/main/kotlin/de/limited_dev/lilJudd/extensions/component/Feature.kt
new file mode 100644
index 0000000..515ae59
--- /dev/null
+++ b/src/main/kotlin/de/limited_dev/lilJudd/extensions/component/Feature.kt
@@ -0,0 +1,25 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 limited_dev
+ *
+ * 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 .
+ */
+
+package de.limited_dev.lilJudd.extensions.component
+
+import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
+
+enum class Feature(override val readableName: String) : ChoiceEnum {
+ TIMEPLANNINGFEATURE("Time Planning Feature");
+}
diff --git a/src/main/kotlin/de/limited_dev/lilJudd/util/MessageUtil.kt b/src/main/kotlin/de/limited_dev/lilJudd/util/MessageUtil.kt
index f04c757..3749b46 100644
--- a/src/main/kotlin/de/limited_dev/lilJudd/util/MessageUtil.kt
+++ b/src/main/kotlin/de/limited_dev/lilJudd/util/MessageUtil.kt
@@ -22,6 +22,7 @@ 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 com.kotlindiscord.kord.extensions.types.respond
+import dev.kord.common.Color
import dev.kord.rest.builder.message.EmbedBuilder
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
@@ -32,12 +33,14 @@ object MessageUtil {
///Send an embedded message as a reply
suspend fun sendEmbedForPublicSlashCommand(
ctx: PublicSlashCommandContext,
+ color: Color,
title: String,
description: String
) {
ctx.respond {
embeds.add(
getEmbed(
+ color,
title,
description,
ctx.user.asUser().username + "#" + ctx.user.asUser().discriminator
@@ -49,6 +52,7 @@ object MessageUtil {
///Send an embedded message with an image as a reply
suspend fun sendEmbedForPublicSlashCommandWithImage(
ctx: PublicSlashCommandContext,
+ color: Color,
title: String,
description: String,
thumbnailUrl: String
@@ -56,6 +60,7 @@ object MessageUtil {
ctx.respond {
embeds.add(
getEmbedWithImage(
+ color,
title,
description,
ctx.user.asUser().username + "#" + ctx.user.asUser().discriminator,
@@ -66,24 +71,31 @@ object MessageUtil {
}
///Get an embedded msg with title, description and a src
- fun getEmbed(title: String, description: String, source: String): EmbedBuilder {
+ fun getEmbed(
+ color: Color,
+ title: String,
+ description: String,
+ source: String
+ ): EmbedBuilder {
val now: LocalDateTime = LocalDateTime.now()
val ebb = EmbedBuilder()
ebb.title = title
ebb.description = description
ebb.footer = EmbedBuilder.Footer()
ebb.footer!!.text = ">" + dtf.format(now) + " - $source"
+ ebb.color = color
return ebb
}
///Get an embedded msg with image, title, description and a src
fun getEmbedWithImage(
+ color: Color,
title: String,
description: String,
source: String,
thumbnailUrl: String
): EmbedBuilder {
- val ebb = getEmbed(title, description, source)
+ val ebb = getEmbed(color, title, description, source)
ebb.thumbnail = EmbedBuilder.Thumbnail()
ebb.thumbnail!!.url = thumbnailUrl
return ebb