diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/tables/PlanningNotifyerRoles.kt b/src/main/kotlin/net/moonleay/lilJudd/data/tables/PlanningNotifyerRoles.kt
new file mode 100644
index 0000000..069bcc0
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/tables/PlanningNotifyerRoles.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * 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 .
+ */
+
+package net.moonleay.lilJudd.data.tables
+
+import org.jetbrains.exposed.dao.id.IntIdTable
+
+object PlanningNotifyerRoles : IntIdTable() {
+ var serverid = varchar("serverid", 50)
+ var channelid = varchar("channelid", 50)
+ var hastimeroleid = varchar("hastimeroleid", 50)
+ var hastovoteid = varchar("hastovoteid", 50)
+ var wantstobenotifid = varchar("wantstobenotifid", 50)
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/FeatureManageExtension.kt b/src/main/kotlin/net/moonleay/lilJudd/extensions/FeatureManageExtension.kt
index 2bdd9e4..43cfbd4 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/FeatureManageExtension.kt
+++ b/src/main/kotlin/net/moonleay/lilJudd/extensions/FeatureManageExtension.kt
@@ -27,23 +27,26 @@ import com.kotlindiscord.kord.extensions.types.respond
import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.Color
import dev.kord.common.entity.Permission
+import dev.kord.common.entity.Snowflake
+import dev.kord.core.behavior.createRole
+import net.moonleay.lilJudd.data.tables.PlanningNotifyerRoles
import net.moonleay.lilJudd.data.tables.TimePlanningChannels
-import net.moonleay.lilJudd.data.tables.TimePlanningChannels.channelid
-import net.moonleay.lilJudd.data.tables.TimePlanningChannels.serverid
import net.moonleay.lilJudd.extensions.component.EnableOrDisable
-import net.moonleay.lilJudd.extensions.component.Feature
+import net.moonleay.lilJudd.extensions.component.FeatureEnum
+import net.moonleay.lilJudd.util.Logger
import net.moonleay.lilJudd.util.MessageUtil
+import org.jetbrains.exposed.sql.*
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"
+ /*
+ * Note: This has to be rewritten at some point to better support more features
+ * and remove this mess of a class.
+ * */
override suspend fun setup() {
publicSlashCommand(::FeatureManagerArgs) {
name = "feature"
@@ -64,27 +67,26 @@ class FeatureManageExtension : Extension() {
}
return@action
}
-
+ val gID = this.guild!!.id.toString()
+ val cID = this.arguments.channel.id.toString()
+ val channel = this.arguments.channel
+ val args = this.arguments
+ Logger.out("${args.feature.readableName} ${args.setStatus.readableName} ${channel.data.name.value}")
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
+ FeatureEnum.TIMEPLANNINGFEATURE -> {
+ var alreadyExists = false
transaction {
- val entryExists = TimePlanningChannels.select {
- (serverid eq gID) and
- (channelid eq cID)
+ alreadyExists = TimePlanningChannels.select {
+ (TimePlanningChannels.channelid eq gID) and
+ (TimePlanningChannels.channelid eq cID)
}.count() > 0
-
- alreadyExists = entryExists
}
if (!alreadyExists) {
transaction {
TimePlanningChannels.insert {
- it[serverid] = gID
- it[channelid] = cID
+ it[TimePlanningChannels.serverid] = gID
+ it[TimePlanningChannels.channelid] = cID
} get TimePlanningChannels.id
}
this.respond {
@@ -110,28 +112,84 @@ class FeatureManageExtension : Extension() {
)
}
}
+
+ FeatureEnum.PLANNINGNOTIFIER -> {
+ var alreadyExists = false
+ transaction {
+ alreadyExists = PlanningNotifyerRoles.select {
+ (PlanningNotifyerRoles.serverid eq gID) and (PlanningNotifyerRoles.channelid eq cID)
+ }.count() > 0
+ }
+ if (!alreadyExists) {
+ val hasToVoteRole = this.guild!!.createRole {
+ this.name = "Hasn't voted [${channel.data.name.value}]"
+ this.mentionable = true
+ }
+ val htvr = hasToVoteRole.id.toString()
+
+ val hasTimeRole = this.guild!!.createRole {
+ this.name = "Has time [${channel.data.name.value}]"
+ this.mentionable = true
+ }
+ val htr = hasTimeRole.id.toString()
+
+ val wantsNotifsRole = this.guild!!.createRole {
+ this.name = "Wants to be notified [${channel.data.name.value}]"
+ this.mentionable = true
+ }
+ val wnr = wantsNotifsRole.id.toString()
+
+ transaction {
+ PlanningNotifyerRoles.insert {
+ it[PlanningNotifyerRoles.serverid] = gID
+ it[PlanningNotifyerRoles.channelid] = cID
+ it[PlanningNotifyerRoles.hastovoteid] = htvr
+ it[PlanningNotifyerRoles.hastimeroleid] = htr
+ it[PlanningNotifyerRoles.wantstobenotifid] = wnr
+ } get PlanningNotifyerRoles.id
+ }
+
+ this.respond {
+ embeds.add(
+ MessageUtil.getEmbed(
+ Color(0x52E01A),
+ "200: Success",
+ "The feature was enabled in channel ${args.channel.data.name.value} with roles ${hasToVoteRole.mention}, ${hasTimeRole.mention} & ${wantsNotifsRole.mention}.",
+ 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()
+ FeatureEnum.TIMEPLANNINGFEATURE -> {
var alreadyExists = false
transaction {
- val entryExists = TimePlanningChannels.select {
- (serverid eq gID) and
- (channelid eq cID)
+ alreadyExists = TimePlanningChannels.select {
+ (TimePlanningChannels.serverid eq gID) and
+ (TimePlanningChannels.channelid eq cID)
}.count() > 0
-
- alreadyExists = entryExists
}
if (alreadyExists) {
transaction {
val matchingEntries = TimePlanningChannels.select {
- (serverid eq gID) and
- (channelid eq cID)
+ (TimePlanningChannels.serverid eq gID) and
+ (TimePlanningChannels.channelid eq cID)
}.toList()
matchingEntries.forEach { entry ->
@@ -161,6 +219,57 @@ class FeatureManageExtension : Extension() {
)
}
}
+
+ FeatureEnum.PLANNINGNOTIFIER -> {
+ var alreadyExists = false
+ transaction {
+ alreadyExists = PlanningNotifyerRoles.select {
+ (PlanningNotifyerRoles.serverid eq gID) and (PlanningNotifyerRoles.channelid eq cID)
+ }.count() > 0
+ }
+ if (alreadyExists) {
+ var matchingEntries: List = mutableListOf()
+ transaction {
+ matchingEntries = PlanningNotifyerRoles.select {
+ (PlanningNotifyerRoles.serverid eq gID) and
+ (PlanningNotifyerRoles.channelid eq cID)
+ }.toList()
+ }
+ for (e in matchingEntries) {
+ this.guild!!.getRoleOrNull(Snowflake(e[PlanningNotifyerRoles.hastovoteid]))?.delete()
+ this.guild!!.getRoleOrNull(Snowflake(e[PlanningNotifyerRoles.hastimeroleid]))?.delete()
+ this.guild!!.getRoleOrNull(Snowflake(e[PlanningNotifyerRoles.wantstobenotifid]))
+ ?.delete()
+ }
+
+ transaction {
+ matchingEntries.forEach { entry ->
+ PlanningNotifyerRoles.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
+ )
+ )
+ }
+ }
}
}
}
@@ -168,7 +277,7 @@ class FeatureManageExtension : Extension() {
inner class FeatureManagerArgs : Arguments() {
- val feature by enumChoice {
+ val feature by enumChoice {
this.name = "feature"
this.description = "The targeted feature"
this.typeName = "en_US"
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/component/Feature.kt b/src/main/kotlin/net/moonleay/lilJudd/extensions/component/FeatureEnum.kt
similarity index 83%
rename from src/main/kotlin/net/moonleay/lilJudd/extensions/component/Feature.kt
rename to src/main/kotlin/net/moonleay/lilJudd/extensions/component/FeatureEnum.kt
index a55c812..7766f39 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/component/Feature.kt
+++ b/src/main/kotlin/net/moonleay/lilJudd/extensions/component/FeatureEnum.kt
@@ -20,6 +20,7 @@ package net.moonleay.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");
+enum class FeatureEnum(override val readableName: String) : ChoiceEnum {
+ TIMEPLANNINGFEATURE("Time Planning Feature"),
+ PLANNINGNOTIFIER("Planning Notifier")
}