diff --git a/src/main/kotlin/net/moonleay/lilJudd/features/AvailabilityManager.kt b/src/main/kotlin/net/moonleay/lilJudd/features/AvailabilityManager.kt
new file mode 100644
index 0000000..8961ef1
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/features/AvailabilityManager.kt
@@ -0,0 +1,146 @@
+/*
+ * 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.features
+
+import dev.inmo.krontab.buildSchedule
+import dev.inmo.krontab.doInfinity
+import dev.kord.common.entity.Snowflake
+import dev.kord.core.behavior.requestMembers
+import dev.kord.core.entity.channel.MessageChannel
+import dev.kord.gateway.PrivilegedIntent
+import net.moonleay.lilJudd.Bot
+import net.moonleay.lilJudd.data.entry.PlanningNotifierRolesData
+import net.moonleay.lilJudd.data.entry.TimePlanningMessagesData
+import net.moonleay.lilJudd.data.tables.PlanningNotifierRoles
+import net.moonleay.lilJudd.data.tables.TimePlanningMessages
+import net.moonleay.lilJudd.util.EmbedUtil
+import net.moonleay.lilJudd.util.Logger
+import net.moonleay.lilJudd.util.TimeUtil
+import org.jetbrains.exposed.sql.select
+import org.jetbrains.exposed.sql.selectAll
+import org.jetbrains.exposed.sql.transactions.transaction
+import java.time.ZonedDateTime
+
+object AvailabilityManager {
+
+ // This runs during the cronjob.
+ @OptIn(PrivilegedIntent::class)
+ suspend fun runThread() {
+ // ChannelID, Data
+ val messageMap = mutableMapOf()
+ // ChannelID, Data
+ val roleMap = mutableMapOf()
+
+ transaction {
+ for (pnr in TimePlanningMessages.select {
+ TimePlanningMessages.weekstamp eq (TimeUtil.getWeekStamp().toEpochSecond() * 1000).toString()
+ }) {
+ messageMap[Snowflake(pnr[TimePlanningMessages.channelid])] =
+ TimePlanningMessagesData(
+ pnr[TimePlanningMessages.serverid],
+ pnr[TimePlanningMessages.channelid],
+ pnr[TimePlanningMessages.weekstamp],
+ pnr[TimePlanningMessages.messageids]
+ )
+ }
+ for (pnr in PlanningNotifierRoles.selectAll()) {
+ roleMap[pnr[PlanningNotifierRoles.channelid]] =
+ PlanningNotifierRolesData(
+ pnr[PlanningNotifierRoles.serverid],
+ pnr[PlanningNotifierRoles.channelid],
+ pnr[PlanningNotifierRoles.hastimeroleid],
+ pnr[PlanningNotifierRoles.wantstobenotifiedid]
+ )
+ }
+ }
+
+ val weekday = ZonedDateTime.now().dayOfWeek // The current week day
+ val weekStamp = TimeUtil.getWeekStamp().toEpochSecond() * 1000 // The current week time stamp
+ Logger.out("It is week ${weekStamp} and day ${weekday}/${TimeUtil.getDayOfMonthInt(weekday)} of the week.")
+ for (snf in messageMap.keys) { // snf = Snowflake
+ val data = messageMap[snf]!! // this is the data of the table
+ if (Bot.bot.kordRef.getChannel(Snowflake(data.channelid)) == null)
+ continue // This channel does not exist anymore.
+ val c =
+ Bot.bot.kordRef.getChannelOf(Snowflake(data.channelid))!! // Get the channel as MessageChannel
+ val roleData = roleMap[data.channelid]!! // Get the role data
+ val g = Bot.bot.kordRef.getGuildOrThrow(Snowflake(data.serverid))
+ // Get all members with the role
+ val mce = g.requestMembers {
+ this.requestAllMembers()
+ }
+ mce.collect { it1 ->
+ it1.members.forEach {
+ Logger.out("Checking member ${it.id.value}")
+ if (it.roleIds.contains(Snowflake(roleData.hastimeroleid)))
+ it.removeRole(Snowflake(roleData.hastimeroleid))
+ }
+ }
+
+ Logger.out("Got through all members")
+ // This stores the ids of the messages.
+ // The format is weekdaNR:ID
+ // The last entry (nr 8) is empty, so we can ignore it
+ val messageIdSplit = data.messageids.split(";").subList(0, 7)
+ for (mid in messageIdSplit) {
+ Logger.out("Checking id $mid")
+ if (!mid.startsWith((TimeUtil.getDayOfMonthInt(weekday) - 1).toString(), true))
+ continue // This is not the right message, check the next one
+ val idFiltered = mid.split(":")[1] // This is the target message id
+ val message = c.getMessageOrNull(Snowflake(idFiltered)) // Get the message from the channel
+ if (message == null) {
+ Logger.out("Could not find message.")
+ break // This message does not exist anymore. Nothing we can do about that.
+ }
+ if (message.data.embeds.isEmpty()) {
+ Logger.out("There are no embeds.")
+ break // There are no embeds or there are not enough embeds
+ }
+ val targets = EmbedUtil.getAllUsersInTheFirstXTables(2, message.embeds[0])
+ for (tid in targets) {
+ Logger.out("Checking id $tid")
+ if (Bot.bot.kordRef.getGuildOrNull(Snowflake(data.serverid))!!
+ .getMemberOrNull(Snowflake(tid)) == null
+ )
+ continue // This member does not exist anymore.
+ val member = Bot.bot.kordRef.getGuildOrThrow(Snowflake(data.serverid))
+ .getMember(Snowflake(tid)) // Get the member
+ if (member.roleIds.contains(Snowflake(roleData.hastimeroleid)))
+ continue // This member already has the role
+ member.addRole(Snowflake(roleData.hastimeroleid)) // Add the role
+ Logger.out("Added role to ${member.username}")
+ }
+ Logger.out("Done with message. Moving on...")
+ // We found the right message. We don't need to check the others.
+ break
+ }
+ }
+ Logger.out("Done! Until tomorrow! <3 ")
+ }
+
+ suspend fun registerThread() {
+ Logger.out("Adding availability scheduler...")
+ val scheduler = buildSchedule("0 0 5 * * * 0o *w") // 0 0 4 * * * 0o 1w // 0o is UTC
+ scheduler.doInfinity {
+
+ this.runThread()
+ }
+ Logger.out("Starting to update roles...")
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/component/FeatureEnum.kt b/src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureEnum.kt
similarity index 90%
rename from src/main/kotlin/net/moonleay/lilJudd/extensions/component/FeatureEnum.kt
rename to src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureEnum.kt
index 3c590fc..8b3a0a8 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/component/FeatureEnum.kt
+++ b/src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureEnum.kt
@@ -16,11 +16,11 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.extensions.component
+package net.moonleay.lilJudd.features.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
enum class FeatureEnum(override val readableName: String) : ChoiceEnum {
TIMEPLANNINGFEATURE("Time Planning Feature"),
- //PLANNINGNOTIFIER("Planning Notifier")
+ PLANNINGROLES("Planning Roles")
}