diff --git a/.dockerignore b/.dockerignore
index 0b6a882..1c7ce56 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,3 +1,4 @@
**.nils
/run
/run/
+docker-compose.yml
diff --git a/.forgejo/workflows/action.yml b/.forgejo/workflows/action.yml
new file mode 100644
index 0000000..4eff152
--- /dev/null
+++ b/.forgejo/workflows/action.yml
@@ -0,0 +1,23 @@
+name: Build Gradle project
+
+on:
+ push:
+
+jobs:
+ build-gradle-project:
+ runs-on: docker
+ steps:
+ - name: apt update
+ run: apt update
+ - name: install prerequisits
+ run: apt install openjdk-17-jdk ca-certificates-java ssl-cert openssl ca-certificates -y
+ - name: Checkout project sources
+ uses: actions/checkout@v3
+ - name: Setup Gradle
+ uses: gradle/gradle-build-action@v2
+ - name: Run build with Gradle Wrapper
+ run: ./gradlew shadowJar
+ - uses: actions/upload-artifact@v3
+ with:
+ name: lilJudd.jar
+ path: build/libs/
diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml
deleted file mode 100644
index d7453ff..0000000
--- a/.forgejo/workflows/build.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-on: [ push ]
-jobs:
- build_and_publish:
- runs-on: gradle
- steps:
- - name: Setup Gradle
- uses: gradle/gradle-build-action@v2
- - name: Clean Caches
- run: |
- rm -f .gradle/caches/modules-2/modules-2.lock
- rm -fr .gradle/caches/*/plugin-resolution/
- - name: Run shadowJar
- run: ./gradlew shadowJar
- - name: Run publish
- run: ./gradlew publish
diff --git a/.gitignore b/.gitignore
index ce11a8e..f970cd0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
run/
+/data/
.gradle
build/
diff --git a/README.md b/README.md
index 14b1834..e1768f6 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,7 @@
"Oh boy, here we go again" ~ me
-A Discord Bot for Splatoon Teams
-
-[](https://gitlab.com/moonleay/liljudd/-/releases)
-[](https://gitlab.com/moonleay/liljudd/-/commits/master)
-[](https://gitlab.com/moonleay/liljudd/-/blob/master/LICENSE)
+A Discord Bot for Splatoon Teams.
## Contributors
@@ -14,55 +10,60 @@ A Discord Bot for Splatoon Teams
## Known issues
-##### If you encounter any bugs, message me on Discord (@moonleay) or send me a mail (issues@moonleay.net).
+##### If you encounter any bugs, message me on Discord (@moonleay) or email me (issues@moonleay.net). You can also open a ticket [on the support server](https://discord.gg/HTZRktfH4A).
## Commands & Features
- Commands
- version -- Show the versions of the bot and the most important dependencies
- feature -- Manage bot features
+ - match -- Create a new match
+ - updateroles -- Update the roles of all users
+ - sendplanner -- Send the planner message
+ - rotation -- See the current rotation
- Features
- Time Planner -- Make the bot send messages and reactions into a selected channel in order to make planning easier
- Availability Manager -- Make the bot assign users roles every day, so it is possible to notify available people
+ - Match Planner -- Make a match, for which players can sign up and the bot will assign teams and roles to them
-## (Maybe) upcoming features
+## The todo list
-- Match Planner (Send Notifications some time before a match starts)
-- Game Tracker (Save the results of the last matches)
-- Replay Saver (Maybe; will save the replay code to a database)
-- Rndm map command
-- Maybe a DSB / DSL API
-
-## TODO
-
-- Rewrite the Database connection system (from transactions all over the place to a single package with transactions)
+##### See the [todo list](https://todo.moonleay.net/share/OmisuzgPDdsrCAXKjGrTfYzWwqNDNclOMGJWeMsi/auth?view=kanban) for more information.
## How to self-host (using the Docker container)
-1. Pull the container
-2. Map /data/ to a folder on disk
-3. Run the Bot once
-4. Follow step 4 - 7 of "How to self-host (using the JAR)"
+1. Copy the docker-compose.yml file from the repository.
+2. Install docker and docker-compose.
+3. Create a directory called "data" in the same directory as the docker-compose.yml file.
+4. Create a directory called "config" in the same directory as the docker-compose.yml file.
+5. Start the bot once.
+6. After 10 seconds, stop the bot.
+7. Open the config file "credentials.nils" in the config directory.
+8. Put in your credentials.
+ 1. token: your Discord bot token
+ 2. dbDomain: the domain and port of your postgresql database (e.g.: "postgresql", when using the docker-compose.yml
+ file)
+ 3. dbName: the name of the database
+ 4. dbUser: the username of the database
+ 5. dbPassword: the password to the db user
+9. Start the bot again.
+10. The bot should now be up and running.
## How to self-host (using the JAR)
-1. Download the latest release from the Package Registry ("Packages and registries" > "Package Registry")
- 1. It should be called something like this: "lilJudd-X.X.X-xxxxxxxx-prod.jar" (replace "X.X.X" with the latest
- version and xxxxxxxx" with the commit its based on.)
- 2. If you want to run an early version, which may be (very) unsable, you can run a development version. Just use an
- entry ending in "-dev.jar"
+1. Download the latest release from the Releases page.
2. Place it anywhere you want.
3. Run the following command:
- > java -jar lilJudd-X.X.X-xxxxxxxx-prod.jar
+ > java -jar lilJudd.jar
4. The bot should start and create a config file named "credentials.nils" in a folder called "data"
5. Open it and put in your credentials.
1. token: your Discord bot token
2. dbDomain: the domain and port of your postgresql database (e.g.: 192.168.178.1:5432)
- 3. dbName: the name of your database
+ 3. dbName: the name of the database
4. dbUser: the username of the database
- 5. dbPassword: the password to your user
+ 5. dbPassword: the password to the db user
6. Rerun the command
- > java -jar lilJudd-X.X.X-xxxxxxxx-prod.jar
+ > java -jar lilJudd.jar
7. The bot should now be up and running.
## How to set up workspace
diff --git a/build.gradle.kts b/build.gradle.kts
index f62ca80..0ad11dc 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -21,25 +21,27 @@ import org.jetbrains.gradle.ext.TaskTriggersConfig
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
- kotlin("jvm") version "1.8.20"
- id("com.github.johnrengelman.shadow") version "7.1.2"
- id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.6"
+ kotlin("jvm") version "1.9.22"
+ kotlin("plugin.serialization") version "1.9.22"
+ id("com.github.johnrengelman.shadow") version "8.1.1"
+ id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7"
`maven-publish`
}
//lilJudd version 2
-val ownerID = 372703841151614976L
+val creatorID = 372703841151614976L
group = "net.moonleay.liljudd"
version = System.getenv("CI_COMMIT_TAG")?.let { "$it-${System.getenv("CI_COMMIT_SHORT_SHA")}-prod" }
?: System.getenv("CI_COMMIT_SHORT_SHA")?.let { "$it-dev" }
- ?: "2.4.2"
+ ?: "2.7.2"
-val kordver = "1.5.6"
-val coroutinesver = "1.1.0"
-val ktor_version = "2.3.0"
-val exposedver = "0.40.1"
-val postgresver = "42.3.8"
-val krontabver = "2.1.2"
+val kordver = "1.7.1-SNAPSHOT"
+val coroutinesver = "1.7.3"
+val ktorver = "2.3.7"
+val exposedver = "0.46.0"
+val postgresver = "42.7.1"
+val krontabver = "2.2.6"
+val kotlinxserializationver = "1.6.0"
val mavenArtifact = "lilJudd"
project.base.archivesName.set(mavenArtifact)
@@ -72,6 +74,14 @@ repositories {
}
}
}
+ maven {
+ name = "sonatype"
+ url = uri("https://s01.oss.sonatype.org/content/repositories/snapshots")
+ }
+ maven {
+ name = "sonatype 2"
+ url = uri("https://oss.sonatype.org/content/repositories/snapshots")
+ }
}
val shadow by configurations.getting
@@ -81,8 +91,13 @@ implementation.extendsFrom(shadow)
dependencies {
//Discord
shadow("com.kotlindiscord.kord.extensions:kord-extensions:$kordver")
+
+ //Coroutines
shadow("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesver")
+ //JSON Stuff
+ shadow("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinxserializationver")
+
//Logging
shadow("org.slf4j:slf4j-api:2.0.3")
shadow("org.slf4j:slf4j-simple:2.0.3")
@@ -93,25 +108,26 @@ dependencies {
shadow("org.jetbrains.exposed:exposed-jdbc:$exposedver")
shadow("org.postgresql:postgresql:$postgresver")
- //Korntab
+ //Krontab
shadow("dev.inmo:krontab:$krontabver")
- "shadow"("io.ktor:ktor-client-core-jvm:2.3.1")
- "shadow"("io.ktor:ktor-client-cio-jvm:2.3.1")
+ shadow("io.ktor:ktor-client-core-jvm:$ktorver")
+ shadow("io.ktor:ktor-client-cio-jvm:$ktorver")
}
val targetJavaVersion = 17
val templateSrc = project.rootDir.resolve("src/main/templates")
-val templateDest = project.buildDir.resolve("generated/templates")
+val templateDest = project.projectDir.resolve("build/generated/templates")
val templateProps = mapOf(
"version" to project.version as String,
- "ownerID" to ownerID,
+ "creatorID" to creatorID,
"kordversion" to kordver,
"coroutinesversion" to coroutinesver,
- "ktorversion" to ktor_version,
+ "ktorversion" to ktorver,
"exposedversion" to exposedver,
"postgresversion" to postgresver,
- "krontabversion" to krontabver
+ "krontabversion" to krontabver,
+ "kotlinxserializationversion" to kotlinxserializationver
)
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..af8faef
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,32 @@
+version: "3"
+services:
+ lilJudd:
+ container_name: liljudd
+ image: limiteddev/liljudd:x.x.x
+ deploy:
+ resources:
+ limits:
+ cpus: "1"
+ memory: 1G
+ networks:
+ - traefik
+ restart: unless-stopped
+ volumes:
+ - ./config/liljudd/:/data/
+ postgresql:
+ container_name: postgresql
+ image: postgres:13.3-alpine
+ deploy:
+ resources:
+ limits:
+ cpus: "1"
+ memory: 1G
+ environment:
+ - POSTGRES_USER=liljudd
+ - POSTGRES_PASSWORD=changeme
+ - POSTGRES_DB=liljudd
+ networks:
+ - traefik
+ restart: unless-stopped
+ volumes:
+ - ./data/postgresql/:/var/lib/postgresql/data/
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 249e583..d64cd49 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 21995b6..3ba58b0 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#
# lilJudd
-# Copyright (C) 2023 moonleay
+# Copyright (C) 2024 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
@@ -18,6 +18,8 @@
distributionBase=GRADLE_USER_HOME
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
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 99d219e..bf6021c 100755
--- a/gradlew
+++ b/gradlew
@@ -2,7 +2,7 @@
#
# lilJudd
-# Copyright (C) 2023 moonleay
+# Copyright (C) 2024 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
@@ -57,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (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.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -82,13 +82,11 @@ do
esac
done
-APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
-
-APP_NAME="Gradle"
+# This is normally unused
+# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -135,22 +133,29 @@ location of your Java installation."
fi
else
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
location of your Java installation."
+ fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
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 ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | 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" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -195,11 +200,15 @@ if "$cygwin" || "$msys" ; then
done
fi
-# Collect all arguments for the java command;
-# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
-# shell script including quotes and variable substitutions, so put them in
-# double quotes to make sure that they get re-expanded; and
-# * put everything else in single quotes, so that it's not re-expanded.
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# 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 -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
@@ -207,6 +216,12 @@ set -- \
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.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
diff --git a/gradlew.bat b/gradlew.bat
index 107acd3..93e3f59 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
+if %ERRORLEVEL% equ 0 goto execute
echo.
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
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/src/main/kotlin/net/moonleay/lilJudd/buttons/matchplanner/CancelEditButton.kt b/src/main/kotlin/net/moonleay/lilJudd/buttons/matchplanner/CancelEditButton.kt
deleted file mode 100644
index 3925cd3..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/buttons/matchplanner/CancelEditButton.kt
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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.buttons.matchplanner
-
-import dev.kord.common.entity.Snowflake
-import dev.kord.core.behavior.edit
-import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
-import dev.kord.core.entity.Guild
-import dev.kord.core.entity.User
-import dev.kord.core.entity.channel.MessageChannel
-import dev.kord.core.entity.interaction.ButtonInteraction
-import dev.kord.rest.builder.message.modify.embed
-import net.moonleay.lilJudd.Bot
-import net.moonleay.lilJudd.buttons.component.IEditButton
-import net.moonleay.lilJudd.data.entry.MatchPlanningDataData
-import net.moonleay.lilJudd.data.tables.MatchPlanningData
-import net.moonleay.lilJudd.util.EmbedUtil
-import org.jetbrains.exposed.sql.and
-import org.jetbrains.exposed.sql.select
-import org.jetbrains.exposed.sql.transactions.transaction
-
-class CancelEditButton : IEditButton {
- override val id: String = "public.edit.btn.matchmanagement.cancel"
-
- override suspend fun onInteraction(
- interaction: ButtonInteraction,
- response: PublicMessageInteractionResponseBehavior,
- guild: Guild,
- user: User
- ) {
- val m = interaction.message
- if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
- lateinit var mpdd: MatchPlanningDataData
- var found = false
- transaction {
- for (pnr in MatchPlanningData.select {
- MatchPlanningData.messageid eq (interaction.message.id.value.toString()) and (
- MatchPlanningData.serverid eq (guild.id.value.toString())) and (
- MatchPlanningData.channelid eq (interaction.channelId.value.toString()))
- }) {
- mpdd = MatchPlanningDataData(
- pnr[MatchPlanningData.id].value,
- pnr[MatchPlanningData.serverid],
- pnr[MatchPlanningData.channelid],
- pnr[MatchPlanningData.matchtype],
- pnr[MatchPlanningData.registererid],
- pnr[MatchPlanningData.roleid],
- pnr[MatchPlanningData.opponentName],
- pnr[MatchPlanningData.messageid],
- pnr[MatchPlanningData.timestamp],
- pnr[MatchPlanningData.jobstr]
- )
- found = true
- }
- }
- if (!found || mpdd == null) {
- return
- }
- val role = guild.getRoleOrNull(Snowflake(mpdd.roleid)) ?: return
- val member = interaction.user.asMember(guild.id)
- if (member.roleIds.contains(Snowflake(mpdd.roleid))) {
- member.removeRole(role.id)
- }
- Bot.bot.kordRef.getChannelOf(interaction.channelId)!!.getMessage(m.id).edit {
- this.embed {
- val temp = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 1)
- this.color = temp.color
- this.title = temp.title
- this.description = temp.description
- this.fields = temp.fields
- this.footer = temp.footer
- }
- }
- }
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/buttons/matchplanner/SignMeUpEditButton.kt b/src/main/kotlin/net/moonleay/lilJudd/buttons/matchplanner/SignMeUpEditButton.kt
deleted file mode 100644
index fa47749..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/buttons/matchplanner/SignMeUpEditButton.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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.buttons.matchplanner
-
-import dev.kord.common.entity.Snowflake
-import dev.kord.core.behavior.edit
-import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
-import dev.kord.core.entity.Guild
-import dev.kord.core.entity.User
-import dev.kord.core.entity.channel.MessageChannel
-import dev.kord.core.entity.interaction.ButtonInteraction
-import dev.kord.rest.builder.message.modify.embed
-import net.moonleay.lilJudd.Bot
-import net.moonleay.lilJudd.buttons.component.IEditButton
-import net.moonleay.lilJudd.data.entry.MatchPlanningDataData
-import net.moonleay.lilJudd.data.tables.MatchPlanningData
-import net.moonleay.lilJudd.util.EmbedUtil
-import org.jetbrains.exposed.sql.and
-import org.jetbrains.exposed.sql.select
-import org.jetbrains.exposed.sql.transactions.transaction
-
-class SignMeUpEditButton() : IEditButton {
- override val id: String = "public.edit.btn.matchmanagement.accept"
-
- override suspend fun onInteraction(
- interaction: ButtonInteraction,
- response: PublicMessageInteractionResponseBehavior,
- guild: Guild,
- user: User
- ) {
- val m = interaction.message
- if (!m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
- lateinit var mpdd: MatchPlanningDataData
- var found = false
- transaction {
- for (pnr in MatchPlanningData.select {
- MatchPlanningData.messageid eq (interaction.message.id.value.toString()) and (
- MatchPlanningData.serverid eq (guild.id.value.toString())) and (
- MatchPlanningData.channelid eq (interaction.channelId.value.toString()))
- }) {
- mpdd = MatchPlanningDataData(
- pnr[MatchPlanningData.id].value,
- pnr[MatchPlanningData.serverid],
- pnr[MatchPlanningData.channelid],
- pnr[MatchPlanningData.matchtype],
- pnr[MatchPlanningData.registererid],
- pnr[MatchPlanningData.roleid],
- pnr[MatchPlanningData.opponentName],
- pnr[MatchPlanningData.messageid],
- pnr[MatchPlanningData.timestamp],
- pnr[MatchPlanningData.jobstr]
- )
- found = true
- }
- }
- if (!found || mpdd == null) {
- return
- }
- val role = guild.getRoleOrNull(Snowflake(mpdd.roleid)) ?: return
- val member = interaction.user.asMember(guild.id)
- if (!member.roleIds.contains(Snowflake(mpdd.roleid))) {
- member.addRole(role.id)
- }
-
- //Add the user to the list in the embed
- Bot.bot.kordRef.getChannelOf(interaction.channelId)!!.getMessage(m.id).edit {
- this.embed {
- val temp = EmbedUtil.addXToValuesAtTable(user.id.value.toString(), m.embeds[0], 1)
- this.color = temp.color
- this.title = temp.title
- this.description = temp.description
- this.fields = temp.fields
- this.footer = temp.footer
- }
- }
- }
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/MatchExtension.kt b/src/main/kotlin/net/moonleay/lilJudd/extensions/MatchExtension.kt
deleted file mode 100644
index be28081..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/MatchExtension.kt
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * 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.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.optionalString
-import com.kotlindiscord.kord.extensions.commands.converters.impl.string
-import com.kotlindiscord.kord.extensions.extensions.Extension
-import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
-import com.kotlindiscord.kord.extensions.types.respond
-import dev.kord.common.Color
-import dev.kord.core.behavior.channel.createMessage
-import dev.kord.core.behavior.createRole
-import dev.kord.rest.builder.message.create.actionRow
-import net.moonleay.lilJudd.data.tables.MatchPlanningData
-import net.moonleay.lilJudd.extensions.component.MatchTypes
-import net.moonleay.lilJudd.jobs.MatchJob
-import net.moonleay.lilJudd.jobs.component.JobManager
-import net.moonleay.lilJudd.util.EmbedUtil
-import net.moonleay.lilJudd.util.MessageUtil
-import net.moonleay.lilJudd.util.TimeUtil
-import org.jetbrains.exposed.dao.id.EntityID
-import org.jetbrains.exposed.sql.insert
-import org.jetbrains.exposed.sql.transactions.transaction
-
-class MatchExtension : Extension() {
-
- override val name = "match"
- override val allowApplicationCommandInDMs: Boolean
- get() = false
-
-
- override suspend fun setup() {
- publicSlashCommand(::MatchArguments) {
- name = "match"
- description = "Create a match"
- this.action {
- val args = this.arguments
- val m = this.member!!
- val gID = this.guild!!.id.value.toString()
- val cID = this.channel.id.value.toString()
- val opponent = args.opponent ?: "?"
- val msg = this.respond {
- this.embeds.add(
- MessageUtil.getEmbedWithTable(
- Color(0X4C4645),
- args.matchType.readableName,
- "***Vs. $opponent***\n" +
- "At ${args.timeStamp}\n" +
- "Registered by ${m.mention}",
- mapOf(
- "Signed up" to listOf(),
- )
- )
- )
-
- this.actionRow {
- this.components.addAll(EmbedUtil.getMatchButtons().components)
- }
- } // filter time to date:
- val zdt = TimeUtil.getDateFromString(args.timeStamp)
- // get the string for the cronjob
- val jobString = TimeUtil.getCronjobStringFromDate(zdt)
- // create the role
- val role = this.guild!!.createRole {
- this.name =
- "${args.matchType.readableName} Vs ${opponent} At ${zdt.dayOfMonth}/${zdt.month}/${zdt.year} ${zdt.hour}:${zdt.minute}"
- this.mentionable = true
- }
- // Check if the role was created successfully
- if (role == null) {
- this.channel.createMessage {
- this.embeds.add(
- MessageUtil.getEmbed(
- Color(0xE0311A),
- "500: Internal Error",
- "Could not find created role.\n" +
- "It seems, that said role could not be created.",
- "system message"
- )
- )
- }
- return@action
- }
- lateinit var tableID: EntityID
- transaction {
- tableID = MatchPlanningData.insert {
- it[MatchPlanningData.serverid] = gID
- it[MatchPlanningData.channelid] = cID
- it[MatchPlanningData.messageid] = msg.id.value.toString()
- it[MatchPlanningData.matchtype] = args.matchType.readableName
- it[MatchPlanningData.roleid] = role.id.value.toString()
- it[MatchPlanningData.registererid] = m.id.value.toString()
- it[MatchPlanningData.opponentName] = opponent
- it[MatchPlanningData.timestamp] = (zdt.toEpochSecond() * 1000).toString()
- it[MatchPlanningData.jobstr] = jobString
- } get MatchPlanningData.id
- }
- if (tableID == null) {
- return@action // Not saved to db
- }
- JobManager.addJob(
- MatchJob(
- jobString,
- tableID.value,
- "${args.matchType.readableName}_Vs_${opponent}_[${tableID.value}]-${gID}_${cID}"
- )
- )
- }
- }
- }
-
- inner class MatchArguments : Arguments() {
-
- val matchType by enumChoice {
- this.name = "match"
- this.description = "The type of match"
- this.typeName = "en_US"
- }
-
-
- val timeStamp by string {
- this.name = "timestamp"
- this.description = "The timestamp of the match. Format \"dd.MM.yyyy HH:mm\"."
- }
-
- val opponent by optionalString {
- this.name = "opponent"
- this.description = "The opponent"
- }
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/SendPlannerExtension.kt b/src/main/kotlin/net/moonleay/lilJudd/extensions/SendPlannerExtension.kt
deleted file mode 100644
index 2a56745..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/SendPlannerExtension.kt
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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.extensions
-
-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 dev.kord.common.Color
-import dev.kord.common.entity.Permission
-import dev.kord.core.behavior.channel.createMessage
-import dev.kord.rest.builder.message.create.actionRow
-import kotlinx.coroutines.delay
-import net.moonleay.lilJudd.data.tables.TimePlanningMessages
-import net.moonleay.lilJudd.util.EmbedUtil
-import net.moonleay.lilJudd.util.Logger
-import net.moonleay.lilJudd.util.MessageUtil
-import net.moonleay.lilJudd.util.TimeUtil
-import org.jetbrains.exposed.sql.insert
-import org.jetbrains.exposed.sql.transactions.transaction
-import java.time.ZoneId
-import java.time.ZonedDateTime
-
-/* This extension has no proper use.
- It is used in testing to test stuff, without having to wait for certain events to trigger. */
-class SendPlannerExtension : Extension() {
- override val name = "sendplanner"
- override val allowApplicationCommandInDMs: Boolean
- get() = false
-
- override suspend fun setup() {
- publicSlashCommand() {
- name = "sendplanner"
- description = "Send the planner for the current and x next weeks"
- this.action {
- if (!this.member!!.asMember(this.guild!!.id)
- .hasPermission(Permission.Administrator)
- ) {
- val res = this.respond {
- this.content = "no."
- }
- res.delete()
- return@action
- }
- val res = this.respond {
- this.content = "OK."
- }
- res.delete() // Delete the response
- val c = this.getChannel().asChannel()
- var msgStr = ""
- var then =
- ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withDayOfMonth(TimeUtil.getMondayDayOfMonth())
- .withHour(4)
- .withMinute(0).withSecond(0)
- c.createMessage {
- this.embeds.add(
- MessageUtil.getEmbed(
- Color(0X4C4645),
- "Time Planning Feature",
- "Do you have time on the following Days?",
- "Automated Message"
- )
- )
- }
- delay(1000)
- repeat(7) {
- val msg = c.createMessage {
- this.embeds.add(
- MessageUtil.getEmbedWithTable(
- Color(0X4C4645),
- "",
- "${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
- mapOf(
- "Is available" to listOf(),
- "May be available" to listOf(),
- "Is not available" to listOf()
- )
- )
- )
-
- this.actionRow {
- this.components.addAll(EmbedUtil.getTimePlannerButtons().components)
- }
- }
- msgStr += "${it}:${msg.id.value};"
- then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0)
- Logger.out("Finished sending day $it/ This was manually triggered")
- delay(1000)
- }
-
- // Save the message ids
- transaction {
- TimePlanningMessages.insert {
- it[serverid] = c.data.guildId.value.toString()
- it[channelid] = c.id.value.toString()
- it[weekstamp] = (TimeUtil.getWeekStamp().toEpochSecond() * 1000).toString()
- it[messageids] = msgStr
- } get TimePlanningMessages.id
- }
- Logger.out("Finished with ${c.data.guildId.value}")
- }
- }
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/TestExtension.kt b/src/main/kotlin/net/moonleay/lilJudd/extensions/TestExtension.kt
deleted file mode 100644
index 90cda76..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/TestExtension.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.extensions
-
-import com.kotlindiscord.kord.extensions.extensions.Extension
-import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
-import com.kotlindiscord.kord.extensions.types.respond
-import dev.kord.common.Color
-import dev.kord.rest.builder.message.create.actionRow
-import net.moonleay.lilJudd.util.EmbedUtil
-import net.moonleay.lilJudd.util.MessageUtil
-
-/* This extension has no proper use.
- It is used in testing to test stuff, without having to wait for certain events to trigger. */
-class TestExtension : Extension() {
- override val name = "test"
- override val allowApplicationCommandInDMs: Boolean
- get() = false
-
- override suspend fun setup() {
- publicSlashCommand {
- name = "test"
- description = "Test game"
- this.action {
- this.respond {
- this.embeds.add(
- MessageUtil.getEmbedWithTable(
- Color(0X4C4645),
- "",
- "MONDAY, 22.05.2023",
- mapOf(
- "Is available" to listOf(),
- "May be available" to listOf(),
- "Is not available" to listOf()
- )
- )
- )
-
- this.actionRow {
- this.components.addAll(EmbedUtil.getTimePlannerButtons().components)
- }
- }
- }
- }
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/features/AvailabilityManager.kt b/src/main/kotlin/net/moonleay/lilJudd/features/AvailabilityManager.kt
deleted file mode 100644
index 1359f50..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/features/AvailabilityManager.kt
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * 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.Color
-import dev.kord.common.entity.Snowflake
-import dev.kord.core.behavior.UserBehavior
-import dev.kord.core.behavior.createRole
-import dev.kord.core.behavior.requestMembers
-import dev.kord.core.entity.channel.Channel
-import dev.kord.core.entity.channel.MessageChannel
-import dev.kord.gateway.PrivilegedIntent
-import dev.kord.rest.builder.message.EmbedBuilder
-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.extensions.FeatureManageExtension
-import net.moonleay.lilJudd.features.component.FeatureEnum
-import net.moonleay.lilJudd.features.component.IFeature
-import net.moonleay.lilJudd.util.EmbedUtil
-import net.moonleay.lilJudd.util.Logger
-import net.moonleay.lilJudd.util.MessageUtil
-import net.moonleay.lilJudd.util.TimeUtil
-import org.jetbrains.exposed.sql.*
-import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
-import org.jetbrains.exposed.sql.transactions.transaction
-import java.time.ZonedDateTime
-
-object AvailabilityManager : IFeature {
-
- // This runs during the cronjob.
- @OptIn(PrivilegedIntent::class)
- suspend fun runThread() {
- Logger.out("Starting to update roles...")
-
- // 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
- if (roleMap.isEmpty()) {
- Logger.out("No saved roles. Canceling.")
- return
- }
- val roleData = roleMap[data.channelid] // Get the role data
- if (roleData == null) {
- Logger.out("Role for this channel does not exist")
- return
- }
- val g = Bot.bot.kordRef.getGuildOrThrow(Snowflake(data.serverid))
- // Get all members with the role
- val mce = g.requestMembers {
- this.requestAllMembers()
- }
- mce.collect { memberchunkevent ->
- memberchunkevent.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 ")
- }
-
- override val feat: FeatureEnum
- get() = FeatureEnum.PLANNINGROLES
-
- // Register the cronjob to run at 1AM UTC every day
- override suspend fun registerThread() {
- Logger.out("Adding availability scheduler...")
- val scheduler = buildSchedule("0 0 2 * * *") // 0 0 4 * * * 0o 1w // 0o is UTC
- scheduler.doInfinity {
- this.runThread()
- }
- }
-
- override suspend fun enable(
- u: UserBehavior,
- gID: String,
- cID: String,
- ch: Channel,
- args: FeatureManageExtension.FeatureManagerArgs
- ): EmbedBuilder {
- var alreadyExists = false
- // Check if the channel and guild already exist in the db
- transaction {
- alreadyExists = PlanningNotifierRoles.select {
- (PlanningNotifierRoles.serverid eq gID) and (PlanningNotifierRoles.channelid eq cID)
- }.count() > 0
- }
- if (!alreadyExists) {
- // Create the roles in Discord
- val hasTimeRole = Bot.bot.kordRef.getGuildOrThrow(Snowflake(gID)).createRole {
- this.name = "available [${ch.data.name.value}]"
- this.mentionable = true
- }
- val htr = hasTimeRole.id.toString()
-
- val wantsNotifsRole = Bot.bot.kordRef.getGuildOrThrow(Snowflake(gID)).createRole {
- this.name = "notifications [${ch.data.name.value}]"
- this.mentionable = true
- }
- val wnr = wantsNotifsRole.id.toString()
-
- // Save the role ids to db
- transaction {
- PlanningNotifierRoles.insert {
- it[PlanningNotifierRoles.serverid] = gID
- it[PlanningNotifierRoles.channelid] = cID
- it[PlanningNotifierRoles.hastimeroleid] = htr
- it[PlanningNotifierRoles.wantstobenotifiedid] = wnr
- } get PlanningNotifierRoles.id
- }
-
- return MessageUtil.getEmbed(
- Color(0x52E01A),
- "200: Success",
- "The feature was enabled in channel ${args.channel.data.name.value} with roles ${hasTimeRole.mention} & ${wantsNotifsRole.mention}.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- }
-
- // They exist, do not add them
- return MessageUtil.getEmbed(
- Color(0xE0311A),
- "403: Forbidden",
- "The feature is already enabled in this channel.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- }
-
- override suspend fun disable(
- u: UserBehavior,
- gID: String,
- cID: String,
- ch: Channel,
- args: FeatureManageExtension.FeatureManagerArgs
- ): EmbedBuilder {
- // Check if entry exists in db
- var alreadyExists = false
- transaction {
- alreadyExists = PlanningNotifierRoles.select {
- (PlanningNotifierRoles.serverid eq gID) and (PlanningNotifierRoles.channelid eq cID)
- }.count() > 0
- }
- if (alreadyExists) {
- var matchingEntries: List = mutableListOf()
- transaction {
- matchingEntries = PlanningNotifierRoles.select {
- (PlanningNotifierRoles.serverid eq gID) and
- (PlanningNotifierRoles.channelid eq cID)
- }.toList()
- }
- // delete all entries for this guild and channel combo
- for (e in matchingEntries) {
- Bot.bot.kordRef.getGuildOrThrow(Snowflake(gID))
- .getRoleOrNull(Snowflake(e[PlanningNotifierRoles.hastimeroleid]))?.delete()
- Bot.bot.kordRef.getGuildOrThrow(Snowflake(gID))
- .getRoleOrNull(Snowflake(e[PlanningNotifierRoles.wantstobenotifiedid]))
- ?.delete()
- }
-
- // delete all found entries
- transaction {
- matchingEntries.forEach { entry ->
- PlanningNotifierRoles.deleteWhere { id eq entry[id] }
- }
- }
- return MessageUtil.getEmbed(
- Color(0x52E019),
- "200: Success",
- "The feature was disabled.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- }
- // not in db, do nothing
- return MessageUtil.getEmbed(
- Color(0xE0311A),
- "403: Forbidden",
- "The feature is already disabled in this channel.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/features/MatchManager.kt b/src/main/kotlin/net/moonleay/lilJudd/features/MatchManager.kt
deleted file mode 100644
index a92ad6a..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/features/MatchManager.kt
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.kord.common.entity.Snowflake
-import net.moonleay.lilJudd.Bot
-import net.moonleay.lilJudd.data.entry.MatchPlanningDataData
-import net.moonleay.lilJudd.data.tables.MatchPlanningData
-import net.moonleay.lilJudd.jobs.MatchJob
-import net.moonleay.lilJudd.jobs.component.JobManager
-import net.moonleay.lilJudd.util.Logger
-import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
-import org.jetbrains.exposed.sql.deleteWhere
-import org.jetbrains.exposed.sql.selectAll
-import org.jetbrains.exposed.sql.transactions.transaction
-
-object MatchManager {
- suspend fun update() {
- Logger.out("Updating match roles...")
- val dataList = mutableListOf()
- transaction {
- MatchPlanningData.selectAll().forEach {
- dataList.add(
- MatchPlanningDataData(
- it[MatchPlanningData.id].value,
- it[MatchPlanningData.serverid],
- it[MatchPlanningData.channelid],
- it[MatchPlanningData.matchtype],
- it[MatchPlanningData.registererid],
- it[MatchPlanningData.roleid],
- it[MatchPlanningData.opponentName],
- it[MatchPlanningData.messageid],
- it[MatchPlanningData.timestamp],
- it[MatchPlanningData.jobstr]
- )
- )
- }
- }
-
- for (data in dataList) {
- Logger.out("Checking match role ${data.id}...")
- if (data.timestamp.toLong() < System.currentTimeMillis()) {
- Logger.out("Match role ${data.id} is expired, removing...")
- this.removeRoleFromGuild(data.serverid, data.roleid)
- transaction {
- MatchPlanningData.deleteWhere { MatchPlanningData.messageid eq data.messageid }
- }
- continue
- }
- this.registerJob(data)
- }
- Logger.out("Done. Until next time! <3 ")
- }
-
- private fun registerJob(data: MatchPlanningDataData) {
- JobManager.addJob(
- MatchJob(
- data.jobstr,
- data.id,
- "fromdb-${data.matchtype}_Vs_${data.opponentname}_[${data.id}]-${data.serverid}_${data.channelid}"
- )
- )
- Logger.out("Registered job for match ${data.id}...")
- }
-
- private suspend fun removeRoleFromGuild(gid: String, rid: String): Boolean {
- val guild = Bot.bot.kordRef.getGuildOrNull(Snowflake(gid.toLong())) ?: return false
- val role = guild.getRoleOrNull(Snowflake(rid.toLong())) ?: return false
- role.delete()
- return true
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/features/TimeManager.kt b/src/main/kotlin/net/moonleay/lilJudd/features/TimeManager.kt
deleted file mode 100644
index 0ac7b1b..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/features/TimeManager.kt
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * 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.Color
-import dev.kord.common.entity.Snowflake
-import dev.kord.core.behavior.UserBehavior
-import dev.kord.core.behavior.channel.createMessage
-import dev.kord.core.entity.channel.Channel
-import dev.kord.core.entity.channel.MessageChannel
-import dev.kord.rest.builder.message.EmbedBuilder
-import dev.kord.rest.builder.message.create.actionRow
-import kotlinx.coroutines.delay
-import net.moonleay.lilJudd.Bot
-import net.moonleay.lilJudd.data.entry.PlanningNotifierRolesData
-import net.moonleay.lilJudd.data.tables.PlanningNotifierRoles
-import net.moonleay.lilJudd.data.tables.TimePlanningChannels
-import net.moonleay.lilJudd.data.tables.TimePlanningMessages
-import net.moonleay.lilJudd.extensions.FeatureManageExtension
-import net.moonleay.lilJudd.features.component.FeatureEnum
-import net.moonleay.lilJudd.features.component.IFeature
-import net.moonleay.lilJudd.util.EmbedUtil
-import net.moonleay.lilJudd.util.Logger
-import net.moonleay.lilJudd.util.MessageUtil
-import net.moonleay.lilJudd.util.TimeUtil
-import org.jetbrains.exposed.sql.*
-import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
-import org.jetbrains.exposed.sql.transactions.transaction
-import java.time.ZoneId
-import java.time.ZonedDateTime
-
-
-object TimeManager : IFeature {
- override val feat: FeatureEnum
- get() = FeatureEnum.TIMEPLANNINGFEATURE
-
- // Register the cronjob to run at 0:01 AM UTC every Monday
- override suspend fun registerThread() {
- Logger.out("Adding message scheduler...")
- val scheduler = buildSchedule("0 0 1 * * * 0o 1w") // 0 0 4 * * * 0o 1w // 0o is UTC
- scheduler.doInfinity {
- this.runThread()
- }
- }
-
- private suspend fun runThread() {
- Logger.out("Starting to notify...")
-
-
- // ChannelID, ServerID
- val channelList = mutableMapOf()
- // ChannelID, Data
- val roleMap = mutableMapOf()
-
- var msgStr = ""
-
- transaction {
- for (tp in TimePlanningChannels.selectAll()) {
- channelList[Snowflake(tp[TimePlanningChannels.channelid])] =
- Snowflake(tp[TimePlanningChannels.serverid])
- Logger.out("Have to notify channel with ID ${tp[TimePlanningChannels.channelid]}.")
- }
-
- for (pnr in PlanningNotifierRoles.selectAll()) {
- roleMap[Snowflake(pnr[PlanningNotifierRoles.channelid])] = PlanningNotifierRolesData(
- pnr[PlanningNotifierRoles.serverid],
- pnr[PlanningNotifierRoles.channelid],
- pnr[PlanningNotifierRoles.hastimeroleid],
- pnr[PlanningNotifierRoles.wantstobenotifiedid]
- )
- Logger.out("Have to ping roles: ${pnr[PlanningNotifierRoles.wantstobenotifiedid]}}")
- }
- }
- Logger.out("${channelList.count()} Channels to notify with ${roleMap.count()} Roles to ping!")
- for (ch in channelList.keys) {
- if (Bot.bot.kordRef.getChannel(ch) == null)
- continue // TODO: Check if the channel is valid in another shard
- val c = Bot.bot.kordRef.getChannelOf(ch)!!
- if (roleMap != null && roleMap.keys.contains(ch) && roleMap[ch] != null) {
- c.createMessage {
- this.content =
- "The weekly planning starts now <@&${Snowflake(roleMap[ch]?.wantstobenotifid!!)}>"
- this.embeds.add(
- MessageUtil.getEmbed(
- Color(0X4C4645),
- "Time Planning Feature",
- "Do you have time on the following Days?",
- "Automated Message"
- )
- )
- }
- } else {
- c.createMessage {
- this.embeds.add(
- MessageUtil.getEmbed(
- Color(0X4C4645),
- "Time Planning Feature",
- "Do you have time on the following Days?",
- "Automated Message"
- )
- )
- }
- }
- delay(2000)
- var then = ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withHour(4).withMinute(0).withSecond(0)
- repeat(7) {
- val msg = c.createMessage {
- this.embeds.add(
- MessageUtil.getEmbedWithTable(
- Color(0X4C4645),
- "",
- "${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
- mapOf(
- "Is available" to listOf(),
- "May be available" to listOf(),
- "Is not available" to listOf()
- )
- )
- )
-
- this.actionRow {
- this.components.addAll(EmbedUtil.getTimePlannerButtons().components)
- }
- }
- msgStr += "${it}:${msg.id.value};"
- then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0)
- Logger.out("Finished sending day $it")
-
- delay(1000)
- }
-
- // Save the message ids
- transaction {
- TimePlanningMessages.insert {
- it[TimePlanningMessages.serverid] = c.data.guildId.value.toString()
- it[TimePlanningMessages.channelid] = c.id.value.toString()
- it[TimePlanningMessages.weekstamp] = TimeUtil.getWeekStamp().toOffsetDateTime().toString()
- it[TimePlanningMessages.messageids] = msgStr
- } get TimePlanningMessages.id
- }
- Logger.out("Finished with ${c.data.guildId.value}")
- }
- Logger.out("Done! Until next Monday! <3 ")
- }
-
- override suspend fun enable(
- u: UserBehavior,
- gID: String,
- cID: String,
- ch: Channel,
- args: FeatureManageExtension.FeatureManagerArgs
- ): EmbedBuilder {
- var alreadyExists = false
- transaction {
- alreadyExists = TimePlanningChannels.select {
- (TimePlanningChannels.serverid eq gID) and
- (TimePlanningChannels.channelid eq cID)
- }.count() > 0
- }
- if (!alreadyExists) {
- transaction {
- TimePlanningChannels.insert {
- it[TimePlanningChannels.serverid] = gID
- it[TimePlanningChannels.channelid] = cID
- } get TimePlanningChannels.id
- }
- return MessageUtil.getEmbed(
- Color(0x52E01A),
- "200: Success",
- "The feature was enabled in channel ${args.channel.data.name.value}",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- }
- return MessageUtil.getEmbed(
- Color(0xE0311A),
- "403: Forbidden",
- "The feature is already enabled in this channel.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- }
-
- override suspend fun disable(
- u: UserBehavior,
- gID: String,
- cID: String,
- ch: Channel,
- args: FeatureManageExtension.FeatureManagerArgs
- ): EmbedBuilder {
- // Check if entry exists in db
- var alreadyExists = false
- transaction {
- alreadyExists = TimePlanningChannels.select {
- (TimePlanningChannels.serverid eq gID) and
- (TimePlanningChannels.channelid eq cID)
- }.count() > 0
- }
- if (alreadyExists) {
- // delete all entrys for this channel
- transaction {
- val matchingEntries = TimePlanningChannels.select {
- (TimePlanningChannels.serverid eq gID) and
- (TimePlanningChannels.channelid eq cID)
- }.toList()
-
- matchingEntries.forEach { entry ->
- TimePlanningChannels.deleteWhere { id eq entry[id] }
- }
- }
- return MessageUtil.getEmbed(
- Color(0x52E019),
- "200: Success",
- "The feature was disabled.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- }
- // Do nothing; not in db
- return MessageUtil.getEmbed(
- Color(0xE0311A),
- "403: Forbidden",
- "The feature is already disabled in this channel.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/util/MessageUtil.kt b/src/main/kotlin/net/moonleay/lilJudd/util/MessageUtil.kt
deleted file mode 100644
index dc0a34a..0000000
--- a/src/main/kotlin/net/moonleay/lilJudd/util/MessageUtil.kt
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.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 com.kotlindiscord.kord.extensions.types.respond
-import dev.kord.common.Color
-import dev.kord.core.entity.Embed
-import dev.kord.rest.builder.message.EmbedBuilder
-import java.time.LocalDateTime
-import java.time.format.DateTimeFormatter
-
-object MessageUtil {
- private val dtf: DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy @ HH:mm:ss")
-
- ///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
- )
- )
- }
- }
-
- ///Send an embedded message with an image as a reply
- suspend fun sendEmbedForPublicSlashCommandWithImage(
- ctx: PublicSlashCommandContext,
- color: Color,
- title: String,
- description: String,
- thumbnailUrl: String
- ) {
- ctx.respond {
- embeds.add(
- getEmbedWithImage(
- color,
- title,
- description,
- ctx.user.asUser().username + "#" + ctx.user.asUser().discriminator,
- thumbnailUrl
- )
- )
- }
- }
-
- ///Get a cloned embedded message, missing only the fields
- fun getAClonedEmbedd(e: Embed): EmbedBuilder {
- val ebb = EmbedBuilder()
- ebb.color = e.color
- ebb.title = e.title
- ebb.description = e.description
- return ebb
- }
-
- fun getEmbedWithTableWithFooter(
- color: Color,
- title: String,
- description: String,
- values: Map>?,
- footer: String
- ): EmbedBuilder {
- val ebb = getEmbedWithTable(color, title, description, values)
- ebb.footer = EmbedBuilder.Footer()
- ebb.footer!!.text = ">m.id/$footer"
- return ebb
- }
-
- ///Get an embedded msg with image, title and description
- fun getEmbedWithTable(
- color: Color,
- title: String,
- description: String,
- values: Map>?
- ): EmbedBuilder {
- val ebb = getEmbedSmall(color, title, description)
- if (values != null)
- for (key in values.keys) {
- val fb = EmbedBuilder.Field()
- fb.name = key
- var s = ""
- for (value in values[key]!!)
- s += "$value\n"
- fb.value = s
- fb.inline = true
- ebb.fields.add(fb)
- }
- return ebb
- }
-
-
- ///Get an embedded msg with title and description
- fun getEmbedSmall(
- color: Color,
- title: String,
- description: String
- ): EmbedBuilder {
- val ebb = EmbedBuilder()
- ebb.title = title
- ebb.description = description
- ebb.color = color
- return ebb
- }
-
- ///Get an embedded msg with title, description and a src
- fun getEmbed(
- color: Color,
- title: String,
- description: String,
- source: String
- ): EmbedBuilder {
- val ebb = getEmbedSmall(color, title, description)
- val now: LocalDateTime = LocalDateTime.now()
- ebb.footer = EmbedBuilder.Footer()
- ebb.footer!!.text = ">" + dtf.format(now) + " - $source"
- 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(color, title, description, source)
- ebb.thumbnail = EmbedBuilder.Thumbnail()
- ebb.thumbnail!!.url = thumbnailUrl
- return ebb
- }
-}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/Bot.kt b/src/main/kotlin/net/moonleay/liljudd/Bot.kt
similarity index 55%
rename from src/main/kotlin/net/moonleay/lilJudd/Bot.kt
rename to src/main/kotlin/net/moonleay/liljudd/Bot.kt
index be764de..2e5e5aa 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/Bot.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/Bot.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,10 +16,10 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd
+package net.moonleay.liljudd
import com.kotlindiscord.kord.extensions.ExtensibleBot
-import dev.kord.common.Color
+import com.kotlindiscord.kord.extensions.utils.dm
import dev.kord.common.entity.PresenceStatus
import dev.kord.core.behavior.interaction.response.respond
import dev.kord.core.event.gateway.ReadyEvent
@@ -27,25 +27,28 @@ import dev.kord.core.event.interaction.ButtonInteractionCreateEvent
import dev.kord.core.on
import dev.kord.gateway.Intent
import dev.kord.gateway.PrivilegedIntent
+import dev.kord.gateway.builder.Shards
+import dev.kord.rest.builder.message.embed
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
-import net.moonleay.botendo.build.BuildConstants
-import net.moonleay.lilJudd.buttons.component.EditButtonManager
-import net.moonleay.lilJudd.data.CredentialManager
-import net.moonleay.lilJudd.data.DB
-import net.moonleay.lilJudd.extensions.FeatureManageExtension
-import net.moonleay.lilJudd.extensions.MatchExtension
-import net.moonleay.lilJudd.extensions.SendPlannerExtension
-import net.moonleay.lilJudd.extensions.VersionExtension
-import net.moonleay.lilJudd.features.AvailabilityManager
-import net.moonleay.lilJudd.features.MatchManager
-import net.moonleay.lilJudd.features.TimeManager
-import net.moonleay.lilJudd.util.Logger
-import net.moonleay.lilJudd.util.MessageUtil
+import net.moonleay.liljudd.build.BuildConstants
+import net.moonleay.liljudd.buttons.component.EditButtonManager
+import net.moonleay.liljudd.data.CredentialManager
+import net.moonleay.liljudd.data.NewsManager
+import net.moonleay.liljudd.data.StacktraceSaver
+import net.moonleay.liljudd.data.database.DB
+import net.moonleay.liljudd.extensions.*
+import net.moonleay.liljudd.features.AvailabilityManager
+import net.moonleay.liljudd.features.MatchManager
+import net.moonleay.liljudd.features.TimeManager
+import net.moonleay.liljudd.util.EmbedColor
+import net.moonleay.liljudd.util.Logger
+import net.moonleay.liljudd.util.MessageUtil
import kotlin.system.exitProcess
+
object Bot {
//The kord object gets set at app launch
lateinit var bot: ExtensibleBot
@@ -71,6 +74,12 @@ object Bot {
exitProcess(3)
}
+ // Check if there are api credentials
+ if (CredentialManager.apiDomain == "empty" || CredentialManager.apiToken == "empty") {
+ Logger.out("The config does not contain the whole API credentials.")
+ exitProcess(3)
+ }
+
// Connect to the database
DB.connect(
CredentialManager.dbDomain,
@@ -79,6 +88,9 @@ object Bot {
CredentialManager.dbPassword
)
+ // Make sure the database is up-to-date
+ DB.register()
+
// Register all the jobs
jobs.addAll(
listOf(
@@ -99,12 +111,12 @@ object Bot {
}
extensions {
- add(::VersionExtension)
+ add(::InfoExtension)
add(::FeatureManageExtension)
add(::SendPlannerExtension)
add(::MatchExtension)
- //add(::UpdateRolesExtension) // This command is only for debugging purposes
- //add(::TestExtension) // See comment in TestExtension.kt
+ add(::UpdateRolesExtension)
+ add(::RotationExtension)
}
this.presence {
@@ -116,12 +128,26 @@ object Bot {
+Intent.GuildMembers
}
- // Will add Sharding someday, I promise
- /*
- sharding { recommended ->
+ errorResponse { _, type ->
+ val stamp = System.currentTimeMillis()
+ this.embed {
+ this.title = "Oops. Something went wrong."
+ this.description = "The bot encountered an error during execution.\n" +
+ "Please report this to <@${BuildConstants.creatorID}>.\n" +
+ "The errorid is \"$stamp.stk\""
+ this.field {
+ this.name = "Error message:"
+ this.value = type.error.message.toString()
+ this.inline = false
+ }
+ }
+
+ StacktraceSaver.saveStacktrace(type.error, stamp)
+ }
+
+ this.sharding { recommended ->
Shards(recommended)
- } */
- // Same goes for a Database table rewrite
+ }
}
// Register button presses
@@ -142,13 +168,13 @@ object Bot {
}
if (inter.componentId.startsWith("public.message.")) {
val response = inter.deferPublicResponse()
- val g = this.interaction.getOriginalInteractionResponse().getGuild()
response.respond {
this.embeds = mutableListOf(
MessageUtil.getEmbed(
- Color(0xE0311A),
- "Error",
- "Could not find button with id \"${inter.componentId}\".\nPlease report this.",
+ EmbedColor.ERROR,
+ "404: Not Found",
+ "Could not find button with id \"${inter.componentId}\"." +
+ "\nPlease report this.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
@@ -159,8 +185,46 @@ object Bot {
bot.kordRef.on {
AvailabilityManager.runThread() // Update Availabilities
MatchManager.update() // Update Matches
+ // Load news
+ NewsManager.load()
+ if(NewsManager.shouldPost == "yes"){
+ val contactedOwners = mutableListOf()
+ bot.kordRef.guilds.collect {
+ val owner = it.owner.asUser()
+ if (!contactedOwners.contains(owner.id.value)) {
+ Logger.out("Sent News to ${owner.username} from ${it.name}")
+ owner.dm {
+ this.embed {
+ this.title = NewsManager.title
+ this.description = NewsManager.news
+ this.footer {
+ this.icon = bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter()
+ }
+ }
+ }
+ contactedOwners.add(owner.id.value)
+ }
+ }
+ NewsManager.shouldPost = "no"
+ NewsManager.update()
+ }
+
+
+ // Make the bot update the status every 6 seconds
+// JobManager.addJob(StatusUpdater)
}
+ // Update the Splatoon 3 api data and make sure it stays up-to-date
+// Splatoon3Api.updateSchedule()
+// JobManager.addJob(Splatoon3ApiScheduleUpdateScheduler)
+ /*
+ Other caches will be added when implemented
+ its not used yet in order to reduce load on the api,
+ which i am using.
+ */
+ // Had to disable bc of an error.
+ // Will fix when I have time
//Start the bot
bot.start()
diff --git a/src/main/kotlin/net/moonleay/lilJudd/Main.kt b/src/main/kotlin/net/moonleay/liljudd/Main.kt
similarity index 69%
rename from src/main/kotlin/net/moonleay/lilJudd/Main.kt
rename to src/main/kotlin/net/moonleay/liljudd/Main.kt
index 9d00d29..a1196f8 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/Main.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/Main.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -15,9 +15,11 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd
+package net.moonleay.liljudd
+
+import net.moonleay.liljudd.build.BuildConstants
+import net.moonleay.liljudd.util.Logger
-import net.moonleay.botendo.build.BuildConstants
suspend fun main() {
println(
@@ -26,9 +28,11 @@ suspend fun main() {
"| |_| |__| |_ _ _| |_| |\n" +
"| | | | | | | | . | . |\n" +
"|_|_|_|_____|___|___|___|\n" +
- " "
+ "v.${BuildConstants.version}\n"
)
- println("v.${BuildConstants.version}")
+
+ Logger.out("li'l Judd made by moonleay (https://moonleay.net). Web UI made by aronmal (https://mal-noh.de).")
+ Logger.out("For more information check out https://liljudd.ink and https://git.moonleay.net/DiscordBots/lilJudd")
Bot.start()
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/buttons/component/EditButtonManager.kt b/src/main/kotlin/net/moonleay/liljudd/buttons/component/EditButtonManager.kt
similarity index 60%
rename from src/main/kotlin/net/moonleay/lilJudd/buttons/component/EditButtonManager.kt
rename to src/main/kotlin/net/moonleay/liljudd/buttons/component/EditButtonManager.kt
index 070f25a..384a09d 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/buttons/component/EditButtonManager.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/buttons/component/EditButtonManager.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,20 +16,22 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.buttons.component
+package net.moonleay.liljudd.buttons.component
-import net.moonleay.lilJudd.buttons.matchplanner.CancelEditButton
-import net.moonleay.lilJudd.buttons.matchplanner.SignMeUpEditButton
-import net.moonleay.lilJudd.buttons.timeplanner.IsAvailableEditButton
-import net.moonleay.lilJudd.buttons.timeplanner.MaybeAvailableEditButton
-import net.moonleay.lilJudd.buttons.timeplanner.NotAvailableEditButton
+import net.moonleay.liljudd.buttons.matchplanner.AcceptEditButton
+import net.moonleay.liljudd.buttons.matchplanner.CancelEditButton
+import net.moonleay.liljudd.buttons.matchplanner.DeclineEditButton
+import net.moonleay.liljudd.buttons.timeplanner.IsAvailableEditButton
+import net.moonleay.liljudd.buttons.timeplanner.MaybeAvailableEditButton
+import net.moonleay.liljudd.buttons.timeplanner.NotAvailableEditButton
object EditButtonManager {
val buttons = listOf(
IsAvailableEditButton(),
MaybeAvailableEditButton(),
NotAvailableEditButton(),
- SignMeUpEditButton(),
- CancelEditButton()
+ AcceptEditButton(),
+ CancelEditButton(),
+ DeclineEditButton(),
)
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/buttons/component/IEditButton.kt b/src/main/kotlin/net/moonleay/liljudd/buttons/component/IEditButton.kt
similarity index 90%
rename from src/main/kotlin/net/moonleay/lilJudd/buttons/component/IEditButton.kt
rename to src/main/kotlin/net/moonleay/liljudd/buttons/component/IEditButton.kt
index 84e8a5b..d973ceb 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/buttons/component/IEditButton.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/buttons/component/IEditButton.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.buttons.component
+package net.moonleay.liljudd.buttons.component
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
import dev.kord.core.entity.Guild
@@ -26,7 +26,7 @@ import dev.kord.core.entity.interaction.ButtonInteraction
interface IEditButton {
val id: String
- open suspend fun onInteraction(
+ suspend fun onInteraction(
interaction: ButtonInteraction,
response: PublicMessageInteractionResponseBehavior,
guild: Guild,
diff --git a/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/AcceptEditButton.kt b/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/AcceptEditButton.kt
new file mode 100644
index 0000000..7e7e382
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/AcceptEditButton.kt
@@ -0,0 +1,103 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.buttons.matchplanner
+
+import dev.kord.common.entity.Snowflake
+import dev.kord.core.behavior.edit
+import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
+import dev.kord.core.entity.Guild
+import dev.kord.core.entity.User
+import dev.kord.core.entity.channel.MessageChannel
+import dev.kord.core.entity.interaction.ButtonInteraction
+import dev.kord.rest.builder.message.EmbedBuilder
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.buttons.component.IEditButton
+import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
+import net.moonleay.liljudd.util.EmbedUtil
+import net.moonleay.liljudd.util.Logger
+import net.moonleay.liljudd.util.MessageUtil
+
+class AcceptEditButton : IEditButton {
+ override val id: String = "public.edit.btn.matchmanagement.accept"
+
+ override suspend fun onInteraction(
+ interaction: ButtonInteraction,
+ response: PublicMessageInteractionResponseBehavior,
+ guild: Guild,
+ user: User
+ ) {
+ val m = interaction.message
+ val eb = MessageUtil.getAClonedEmbed(m.embeds[0])
+ var shouldEditButton = false
+ val mpdd = MatchPlanningDataRepository.getFromMessageInChannelInServer(
+ m.id.value.toLong(),
+ interaction.channelId.value.toLong(),
+ guild.id.value.toLong()
+ )
+ if (mpdd == null) {
+ Logger.out("mpdd is null")
+ return
+ }
+ val role = guild.getRoleOrNull(Snowflake(mpdd.roleID))
+ if (role == null) {
+ Logger.out("role is null")
+ return
+ }
+ val member = interaction.user.asMember(guild.id)
+ // do the checks and update
+ if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
+ if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
+ Logger.out("Removing role from ${member.username}")
+ member.removeRole(role.id)
+ }
+ // remove the user from the 1st list in the embed
+ Logger.out("Removing ${user.username} from the 1st list in the embed")
+ eb.fields = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", eb, 1).fields
+ shouldEditButton = true
+ }
+ if (m.embeds[0].fields[1].value.contains(user.id.value.toString())) {
+ Logger.out("Removing ${user.username} from the 2nd list in the embed")
+ eb.fields = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", eb, 2).fields
+ shouldEditButton = true
+ }
+ if (!m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
+ if (!member.roleIds.contains(Snowflake(mpdd.roleID))) {
+ Logger.out("Adding role to ${member.username}")
+ member.addRole(role.id)
+ }
+ //Add the user to the list in the embed
+ Logger.out("Adding ${user.username} to the 1st list in the embed")
+ eb.fields = EmbedUtil.addXToValuesAtTable(user.id.value.toString(), eb, 1).fields
+ shouldEditButton = true
+ }
+ if (shouldEditButton) {
+ // update the message
+ Bot.bot.kordRef.getChannelOf(interaction.channelId)!!.getMessage(m.id).edit {
+ this.embed(fun EmbedBuilder.() {
+ color = eb.color
+ title = eb.title
+ description = eb.description
+ fields = eb.fields
+ footer = eb.footer
+ })
+ }
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/CancelEditButton.kt b/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/CancelEditButton.kt
new file mode 100644
index 0000000..07e1016
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/CancelEditButton.kt
@@ -0,0 +1,77 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.buttons.matchplanner
+
+import dev.kord.common.entity.Snowflake
+import dev.kord.core.behavior.edit
+import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
+import dev.kord.core.entity.Guild
+import dev.kord.core.entity.User
+import dev.kord.core.entity.channel.MessageChannel
+import dev.kord.core.entity.interaction.ButtonInteraction
+import dev.kord.rest.builder.message.EmbedBuilder
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.buttons.component.IEditButton
+import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
+import net.moonleay.liljudd.util.EmbedUtil
+import net.moonleay.liljudd.util.Logger
+
+class CancelEditButton : IEditButton {
+ override val id: String = "public.edit.btn.matchmanagement.cancel"
+
+ override suspend fun onInteraction(
+ interaction: ButtonInteraction,
+ response: PublicMessageInteractionResponseBehavior,
+ guild: Guild,
+ user: User
+ ) {
+ val m = interaction.message
+ if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
+ val mpdd = MatchPlanningDataRepository.getFromMessageInChannelInServer(
+ m.id.value.toLong(),
+ interaction.channelId.value.toLong(),
+ guild.id.value.toLong()
+ )
+ if (mpdd == null) {
+ Logger.out("mpdd is null")
+ return
+ }
+ val role = guild.getRoleOrNull(Snowflake(mpdd.roleID))
+ if (role == null) {
+ Logger.out("role is null")
+ return
+ }
+ val member = interaction.user.asMember(guild.id)
+ if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
+ member.removeRole(role.id)
+ }
+ Bot.bot.kordRef.getChannelOf(interaction.channelId)!!.getMessage(m.id).edit {
+ this.embed(fun EmbedBuilder.() {
+ val temp = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 1)
+ color = temp.color
+ title = temp.title
+ description = temp.description
+ fields = temp.fields
+ footer = temp.footer
+ })
+ }
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/DeclineEditButton.kt b/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/DeclineEditButton.kt
new file mode 100644
index 0000000..06f7e44
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/buttons/matchplanner/DeclineEditButton.kt
@@ -0,0 +1,103 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.buttons.matchplanner
+
+import dev.kord.common.entity.Snowflake
+import dev.kord.core.behavior.edit
+import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
+import dev.kord.core.entity.Guild
+import dev.kord.core.entity.User
+import dev.kord.core.entity.channel.MessageChannel
+import dev.kord.core.entity.interaction.ButtonInteraction
+import dev.kord.rest.builder.message.EmbedBuilder
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.buttons.component.IEditButton
+import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
+import net.moonleay.liljudd.util.EmbedUtil
+import net.moonleay.liljudd.util.Logger
+import net.moonleay.liljudd.util.MessageUtil
+
+class DeclineEditButton : IEditButton {
+ override val id: String = "public.edit.btn.matchmanagement.decline"
+
+ override suspend fun onInteraction(
+ interaction: ButtonInteraction,
+ response: PublicMessageInteractionResponseBehavior,
+ guild: Guild,
+ user: User
+ ) {
+ val m = interaction.message
+ val eb = MessageUtil.getAClonedEmbed(m.embeds[0])
+ var shouldEditButton = false
+ val mpdd = MatchPlanningDataRepository.getFromMessageInChannelInServer(
+ m.id.value.toLong(),
+ interaction.channelId.value.toLong(),
+ guild.id.value.toLong()
+ )
+ if (mpdd == null) {
+ Logger.out("mpdd is null")
+ return
+ }
+ val role = guild.getRoleOrNull(Snowflake(mpdd.roleID))
+ if (role == null) {
+ Logger.out("role is null")
+ return
+ }
+ val member = interaction.user.asMember(guild.id)
+ if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
+ if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
+ Logger.out("Removing role from ${member.username}")
+ member.removeRole(role.id)
+ }
+ // remove the user from the 1st list in the embed
+ Logger.out("Removing ${user.username} from the 1st list in the embed")
+ eb.fields = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", eb, 1).fields
+ shouldEditButton = true
+ }
+ if (!m.embeds[0].fields[1].value.contains(user.id.value.toString())) {
+ if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
+ Logger.out("Removing role from ${member.username}")
+ member.removeRole(role.id)
+ }
+ // Add the user to the list in the embed
+ Logger.out("Adding ${user.username} to the 2nd list in the embed")
+ eb.fields = EmbedUtil.addXToValuesAtTable(user.id.value.toString(), eb, 2).fields
+ shouldEditButton = true
+ }
+ if (m.embeds[0].fields[1].value.contains(user.id.value.toString())) {
+ // Remove the user from all tables
+ Logger.out("Removing ${user.username} from the 2nd list in the embed")
+ eb.fields = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", eb, 2).fields
+ shouldEditButton = true
+ }
+ if (shouldEditButton) {
+ // update the message
+ Bot.bot.kordRef.getChannelOf(interaction.channelId)!!.getMessage(m.id).edit {
+ this.embed(fun EmbedBuilder.() {
+ color = eb.color
+ title = eb.title
+ description = eb.description
+ fields = eb.fields
+ footer = eb.footer
+ })
+ }
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/IsAvailableEditButton.kt b/src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/IsAvailableEditButton.kt
similarity index 86%
rename from src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/IsAvailableEditButton.kt
rename to src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/IsAvailableEditButton.kt
index 2acfe55..b4cdfef 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/IsAvailableEditButton.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/IsAvailableEditButton.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.buttons.timeplanner
+package net.moonleay.liljudd.buttons.timeplanner
import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
@@ -24,10 +24,11 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
-import dev.kord.rest.builder.message.modify.embed
-import net.moonleay.lilJudd.Bot
-import net.moonleay.lilJudd.buttons.component.IEditButton
-import net.moonleay.lilJudd.util.EmbedUtil
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.buttons.component.IEditButton
+import net.moonleay.liljudd.features.AvailabilityManager
+import net.moonleay.liljudd.util.EmbedUtil
class IsAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.available"
@@ -62,5 +63,6 @@ class IsAvailableEditButton : IEditButton {
}
}
}
+ AvailabilityManager.updateInChannel(interaction.channelId)
}
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/MaybeAvailableEditButton.kt b/src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/MaybeAvailableEditButton.kt
similarity index 86%
rename from src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/MaybeAvailableEditButton.kt
rename to src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/MaybeAvailableEditButton.kt
index 3696a54..23b9c61 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/MaybeAvailableEditButton.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/MaybeAvailableEditButton.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.buttons.timeplanner
+package net.moonleay.liljudd.buttons.timeplanner
import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
@@ -24,10 +24,11 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
-import dev.kord.rest.builder.message.modify.embed
-import net.moonleay.lilJudd.Bot
-import net.moonleay.lilJudd.buttons.component.IEditButton
-import net.moonleay.lilJudd.util.EmbedUtil
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.buttons.component.IEditButton
+import net.moonleay.liljudd.features.AvailabilityManager
+import net.moonleay.liljudd.util.EmbedUtil
class MaybeAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.maybeavailable"
@@ -62,5 +63,6 @@ class MaybeAvailableEditButton : IEditButton {
}
}
}
+ AvailabilityManager.updateInChannel(interaction.channelId)
}
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/NotAvailableEditButton.kt b/src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/NotAvailableEditButton.kt
similarity index 86%
rename from src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/NotAvailableEditButton.kt
rename to src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/NotAvailableEditButton.kt
index 698993f..0fd5390 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/buttons/timeplanner/NotAvailableEditButton.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/buttons/timeplanner/NotAvailableEditButton.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.buttons.timeplanner
+package net.moonleay.liljudd.buttons.timeplanner
import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
@@ -24,10 +24,11 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
-import dev.kord.rest.builder.message.modify.embed
-import net.moonleay.lilJudd.Bot
-import net.moonleay.lilJudd.buttons.component.IEditButton
-import net.moonleay.lilJudd.util.EmbedUtil
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.buttons.component.IEditButton
+import net.moonleay.liljudd.features.AvailabilityManager
+import net.moonleay.liljudd.util.EmbedUtil
class NotAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.notavailable"
@@ -62,5 +63,6 @@ class NotAvailableEditButton : IEditButton {
}
}
}
+ AvailabilityManager.updateInChannel(interaction.channelId)
}
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/CredentialManager.kt b/src/main/kotlin/net/moonleay/liljudd/data/CredentialManager.kt
similarity index 90%
rename from src/main/kotlin/net/moonleay/lilJudd/data/CredentialManager.kt
rename to src/main/kotlin/net/moonleay/liljudd/data/CredentialManager.kt
index 0320d82..7a92197 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/CredentialManager.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/data/CredentialManager.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data
+package net.moonleay.liljudd.data
import java.io.*
import java.util.*
@@ -29,6 +29,8 @@ object CredentialManager {
lateinit var dbName: String
lateinit var dbUser: String
lateinit var dbPassword: String
+ lateinit var apiDomain: String
+ lateinit var apiToken: String
///Load the needed credentials, generate a config if there is none
fun load() {
@@ -51,6 +53,8 @@ object CredentialManager {
dbName = prop.getProperty("dbName")
dbUser = prop.getProperty("dbUser")
dbPassword = prop.getProperty("dbPassword")
+ apiDomain = prop.getProperty("apiDomain")
+ apiToken = prop.getProperty("apiToken")
input.close()
} catch (e: IOException) {
e.printStackTrace()
@@ -83,6 +87,8 @@ object CredentialManager {
prop.setProperty("dbName", "empty")
prop.setProperty("dbUser", "empty")
prop.setProperty("dbPassword", "empty")
+ prop.setProperty("apiDomain", "empty")
+ prop.setProperty("apiToken", "empty")
prop.store(output, null)
output.close()
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/NewsManager.kt b/src/main/kotlin/net/moonleay/liljudd/data/NewsManager.kt
new file mode 100644
index 0000000..30dc1e4
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/NewsManager.kt
@@ -0,0 +1,120 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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
+
+import java.io.*
+import java.util.*
+
+object NewsManager {
+ private const val foldername = "data"
+ private const val filename = "news.nick"
+ lateinit var shouldPost: String
+ lateinit var title: String
+ lateinit var news: String
+
+ ///Load the needed credentials, generate a config if there is none
+ fun load() {
+ val folder = File(foldername)
+ if (!folder.exists()) {
+ save()
+ return
+ }
+ val configFile = File(folder, filename)
+ if (!configFile.exists()) {
+ save()
+ return
+ }
+ try {
+ val input: InputStream = FileInputStream(foldername + File.separator + filename)
+ val prop = Properties()
+ prop.load(input)
+ shouldPost = prop.getProperty("shouldPost")
+ title = prop.getProperty("title")
+ news = prop.getProperty("news")
+ input.close()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+
+ fun update(){
+ val folder = File(foldername)
+ if (!folder.exists()) {
+ try {
+ folder.mkdirs()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+ val configFile = File(foldername + File.separator + filename)
+ if (!configFile.exists()) {
+ try {
+ configFile.createNewFile()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+ try {
+ val output: OutputStream = FileOutputStream(foldername + File.separator + filename)
+ val prop = Properties()
+ prop.setProperty("shouldPost", shouldPost)
+ prop.setProperty("title", title)
+ prop.setProperty("news", news)
+ prop.store(output, null)
+ output.close()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+
+ ///generate a new sample config
+ private fun save() {
+ val folder = File(foldername)
+ if (!folder.exists()) {
+ try {
+ folder.mkdirs()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+ val configFile = File(foldername + File.separator + filename)
+ if (!configFile.exists()) {
+ try {
+ configFile.createNewFile()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+ try {
+ val output: OutputStream = FileOutputStream(foldername + File.separator + filename)
+ val prop = Properties()
+ prop.setProperty("shouldPost", "no")
+ prop.setProperty("title", "empty")
+ prop.setProperty("news", "empty")
+ prop.store(output, null)
+ output.close()
+
+ shouldPost = "no"
+ title = "empty"
+ news = "empty"
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/StacktraceSaver.kt b/src/main/kotlin/net/moonleay/liljudd/data/StacktraceSaver.kt
new file mode 100644
index 0000000..84828c2
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/StacktraceSaver.kt
@@ -0,0 +1,37 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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
+
+import java.io.File
+
+object StacktraceSaver {
+ fun saveStacktrace(stacktrace: Throwable, timestamp: Long) {
+ createFolder()
+ val dir = File("data", "stacktraces")
+ File(dir, "$timestamp.stk").bufferedWriter().use { out ->
+ out.write(stacktrace.stackTraceToString())
+ }
+ }
+
+ private fun createFolder() {
+ val dir = File("data", "stacktraces")
+ if (!dir.exists())
+ dir.mkdir()
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/Splatoon3Api.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/Splatoon3Api.kt
new file mode 100644
index 0000000..2b7fa40
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/Splatoon3Api.kt
@@ -0,0 +1,38 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink
+
+import kotlinx.serialization.json.Json
+import net.moonleay.liljudd.build.BuildConstants
+import net.moonleay.liljudd.data.api.splatoon3ink.schedules.Schedules
+import net.moonleay.liljudd.util.NetUtil
+
+object Splatoon3Api {
+
+ var schedules: Schedules? = null
+
+ fun updateSchedule() {
+ val response = NetUtil.GETJsonData("https://splatoon3.ink/data/schedules.json", "lilJudd/${BuildConstants.version}")
+ if (response.startsWith("error")){
+ println("Error: $response")
+ return
+ }
+ schedules = Json.decodeFromString(response)
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/Splatoon3ApiDataGrabber.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/Splatoon3ApiDataGrabber.kt
new file mode 100644
index 0000000..5357116
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/Splatoon3ApiDataGrabber.kt
@@ -0,0 +1,140 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink
+
+import net.moonleay.liljudd.data.api.splatoon3ink.schedules.BankaraNode
+import net.moonleay.liljudd.data.api.splatoon3ink.schedules.RegularNode
+import net.moonleay.liljudd.data.api.splatoon3ink.schedules.SalmonRunNode
+import net.moonleay.liljudd.data.api.splatoon3ink.schedules.XNode
+import net.moonleay.liljudd.util.TimeUtil
+
+object Splatoon3ApiDataGrabber {
+ fun getRegularMode(timestamp: Long): RegularNode {
+ Splatoon3Api.schedules!!.data.regularSchedules.nodes.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ return modeData
+ }
+ }
+ throw Exception("No current mode found")
+ }
+
+ fun getOpenMode(timestamp: Long): BankaraNode {
+ Splatoon3Api.schedules!!.data.bankaraSchedules.nodes.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ modeData.bankaraMatchSettings!!.map { matchSetting ->
+ if (matchSetting.bankaraMode == "OPEN")
+ return modeData
+ }
+ }
+ }
+ throw Exception("No current mode found")
+ }
+
+ fun getXMode(timestamp: Long): XNode {
+ Splatoon3Api.schedules!!.data.xSchedules.nodes.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ return modeData
+ }
+ }
+ throw Exception("No current mode found")
+ }
+
+ fun getSeriesMode(timestamp: Long): BankaraNode {
+ Splatoon3Api.schedules!!.data.bankaraSchedules.nodes.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ modeData.bankaraMatchSettings!!.map { matchSetting ->
+ if (matchSetting.bankaraMode == "CHALLENGE")
+ return modeData
+ }
+ }
+ }
+ throw Exception("No current mode found")
+ }
+
+ fun getSalmonRun(timestamp: Long): SalmonRunNode {
+ Splatoon3Api.schedules!!.data.coopGroupingSchedule.regularSchedules.nodes.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ return modeData
+ }
+ }
+ throw Exception("No current mode found")
+ }
+ fun getRotationTime(timestamp: Long): String {
+ val modeData = getRegularMode(timestamp)
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ val diffStamp = TimeUtil.getTimeDifferenceFormatted(System.currentTimeMillis(), endTime)
+ return "$diffStamp left in rotation"
+ }
+
+ fun getRegularMapsFormatted(timestamp: Long): String {
+ val modeData = getRegularMode(timestamp)
+ val map1 = modeData.regularMatchSetting.vsStages[0].name.split(" ")[0]
+ val map2 = modeData.regularMatchSetting.vsStages[1].name.split(" ")[0]
+ return "R: $map1, $map2"
+ }
+
+ fun getOpenMapFormatted(timestamp: Long): String {
+ val modeData = getOpenMode(timestamp)
+ // FIXME: This may cause issues if there is a Splatfest going on
+ // TODO: Check if this works during splatfest
+ // The Open Mode should always be the second mode in the list
+ // FIXME: Add check if 2nd itm in list is open mode
+ val map1 = modeData.bankaraMatchSettings!![1].vsStages[0].name.split(" ")[0]
+ val map2 = modeData.bankaraMatchSettings[1].vsStages[1].name.split(" ")[0]
+ return "O: ${modeData.bankaraMatchSettings[1].vsRule.name}: $map1, $map2"
+ .replace("Rainmaker", "RMK")
+ .replace("Tower Control", "TC")
+ .replace("Splat Zones", "SZ")
+ .replace("Clam Blitz", "CB")
+ }
+
+ fun getSeriesMapsFormatted(timestamp: Long): String {
+ val modeData = getSeriesMode(timestamp)
+ // FIXME: This may cause issues if there is a Splatfest going on
+ // TODO: Check all the same things as in getOpenMapFormatted
+ val map1 = modeData.bankaraMatchSettings!![0].vsStages[0].name.split(" ")[0]
+ val map2 = modeData.bankaraMatchSettings[0].vsStages[1].name.split(" ")[0]
+ return "S: ${modeData.bankaraMatchSettings[0].vsRule.name}: $map1, $map2"
+ .replace("Rainmaker", "RMK")
+ .replace("Tower Control", "TC")
+ .replace("Splat Zones", "SZ")
+ .replace("Clam Blitz", "CB")
+ }
+
+ fun getXMapFormatted(timestamp: Long): String {
+ val modeData = getXMode(timestamp)
+ val map1 = modeData.xMatchSetting.vsStages[0].name.split(" ")[0]
+ val map2 = modeData.xMatchSetting.vsStages[1].name.split(" ")[0]
+ return "X: ${modeData.xMatchSetting.vsRule.name}: $map1, $map2"
+ .replace("Rainmaker", "RMK")
+ .replace("Tower Control", "TC")
+ .replace("Splat Zones", "SZ")
+ .replace("Clam Blitz", "CB")
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraMatchSetting.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraMatchSetting.kt
new file mode 100644
index 0000000..d4188cd
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraMatchSetting.kt
@@ -0,0 +1,37 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class BankaraMatchSetting(
+ @SerialName("bankaraMode")
+ val bankaraMode: String,
+ @SerialName("__isVsSetting")
+ val isVsSetting: String,
+ @SerialName("__typename")
+ val typename: String,
+ @SerialName("vsRule")
+ val vsRule: VsRule,
+ @SerialName("vsStages")
+ val vsStages: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraNode.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraNode.kt
new file mode 100644
index 0000000..20f0c9a
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraNode.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class BankaraNode(
+ @SerialName("bankaraMatchSettings")
+ val bankaraMatchSettings: List?,
+ @SerialName("endTime")
+ val endTime: String,
+ @SerialName("festMatchSettings")
+ val festMatchSettings: List?,
+ @SerialName("startTime")
+ val startTime: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraSchedules.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraSchedules.kt
new file mode 100644
index 0000000..7f6cd90
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BankaraSchedules.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class BankaraSchedules(
+ @SerialName("nodes")
+ val nodes: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BannerImage.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BannerImage.kt
new file mode 100644
index 0000000..245536a
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BannerImage.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class BannerImage(
+ @SerialName("url")
+ val url: String,
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BigRunSchedules.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BigRunSchedules.kt
new file mode 100644
index 0000000..476dc59
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/BigRunSchedules.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class BigRunSchedules(
+ @SerialName("nodes")
+ val nodes: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Boss.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Boss.kt
new file mode 100644
index 0000000..abf1858
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Boss.kt
@@ -0,0 +1,31 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Boss(
+ @SerialName("id")
+ val id: String,
+ @SerialName("name")
+ val name: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Color.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Color.kt
new file mode 100644
index 0000000..b359a33
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Color.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Color(
+ @SerialName("a")
+ val a: Int,
+ @SerialName("b")
+ val b: Double,
+ @SerialName("g")
+ val g: Double,
+ @SerialName("r")
+ val r: Double
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopGroupingSchedule.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopGroupingSchedule.kt
new file mode 100644
index 0000000..1a5d5be
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopGroupingSchedule.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class CoopGroupingSchedule(
+ @SerialName("bannerImage")
+ val bannerImage: BannerImage?, // is null
+ @SerialName("bigRunSchedules")
+ val bigRunSchedules: BigRunSchedules,
+ @SerialName("regularSchedules")
+ val regularSchedules: RegularSchedules,
+ @SerialName("teamContestSchedules")
+ val teamContestSchedules: TeamContestSchedules?
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopSetting.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopSetting.kt
new file mode 100644
index 0000000..7f20c4c
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopSetting.kt
@@ -0,0 +1,39 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class CoopSetting(
+ @SerialName("boss")
+ val boss: String?, // Not really String, but idk
+ @SerialName("coopStage")
+ val coopStage: CoopStage,
+ @SerialName("__isCoopSetting")
+ val isCoopSetting: String,
+ @SerialName("rule")
+ val rule: String,
+ @SerialName("__typename")
+ val typename: String,
+ @SerialName("weapons")
+ val weapons: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopStage.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopStage.kt
new file mode 100644
index 0000000..6441baa
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CoopStage.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class CoopStage(
+ @SerialName("id")
+ val id: String,
+ @SerialName("image")
+ val image: Image,
+ @SerialName("name")
+ val name: String,
+ @SerialName("thumbnailImage")
+ val thumbnailImage: ThumbnailImage
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CurrentFest.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CurrentFest.kt
new file mode 100644
index 0000000..e2fe9ed
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CurrentFest.kt
@@ -0,0 +1,43 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class CurrentFest(
+ @SerialName("endTime")
+ val endTime: String,
+ @SerialName("id")
+ val id: String,
+ @SerialName("midtermTime")
+ val midtermTime: String,
+ @SerialName("startTime")
+ val startTime: String,
+ @SerialName("state")
+ val state: String,
+ @SerialName("teams")
+ val teams: List,
+ @SerialName("title")
+ val title: String,
+ @SerialName("tricolorStage")
+ val tricolorStage: TricolorStage
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CurrentPlayer.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CurrentPlayer.kt
new file mode 100644
index 0000000..50c8f74
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/CurrentPlayer.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class CurrentPlayer(
+ @SerialName("userIcon")
+ val userIcon: UserIcon
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/EventNode.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/EventNode.kt
new file mode 100644
index 0000000..2e66a3c
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/EventNode.kt
@@ -0,0 +1,31 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class EventNode(
+ @SerialName("leagueMatchSetting")
+ val leagueMatchSetting: LeagueMatchSetting,
+ @SerialName("timePeriods")
+ val timePeriods: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/EventSchedules.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/EventSchedules.kt
new file mode 100644
index 0000000..fb6ed6f
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/EventSchedules.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class EventSchedules(
+ @SerialName("nodes")
+ val nodes: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestMatchSettingX.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestMatchSettingX.kt
new file mode 100644
index 0000000..db4e294
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestMatchSettingX.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class FestMatchSettingX(
+ @SerialName("__isVsSetting")
+ val isVsSetting: String,
+ @SerialName("__typename")
+ val typename: String,
+ @SerialName("vsRule")
+ val vsRule: VsRule,
+ @SerialName("vsStages")
+ val vsStages: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestMatchSettingXX.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestMatchSettingXX.kt
new file mode 100644
index 0000000..d2fbfc5
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestMatchSettingXX.kt
@@ -0,0 +1,28 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class FestMatchSettingXX(
+ @SerialName("__typename")
+ val typename: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestNode.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestNode.kt
new file mode 100644
index 0000000..8e869a9
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestNode.kt
@@ -0,0 +1,33 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class FestNode(
+ @SerialName("endTime")
+ val endTime: String,
+ @SerialName("festMatchSettings")
+ val festMatchSettings: FestMatchSettingX?,
+ @SerialName("startTime")
+ val startTime: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestSchedules.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestSchedules.kt
new file mode 100644
index 0000000..9a1acc7
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/FestSchedules.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class FestSchedules(
+ @SerialName("nodes")
+ val nodes: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Image.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Image.kt
new file mode 100644
index 0000000..9543b8a
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Image.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Image(
+ @SerialName("url")
+ val url: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/LeagueMatchEvent.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/LeagueMatchEvent.kt
new file mode 100644
index 0000000..494703b
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/LeagueMatchEvent.kt
@@ -0,0 +1,39 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class LeagueMatchEvent(
+ @SerialName("desc")
+ val desc: String,
+ @SerialName("id")
+ val id: String,
+ @SerialName("leagueMatchEventId")
+ val leagueMatchEventId: String,
+ @SerialName("name")
+ val name: String,
+ @SerialName("regulation")
+ val regulation: String,
+ @SerialName("regulationUrl")
+ val regulationUrl: String? // is null
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/LeagueMatchSetting.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/LeagueMatchSetting.kt
new file mode 100644
index 0000000..41cf553
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/LeagueMatchSetting.kt
@@ -0,0 +1,37 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class LeagueMatchSetting(
+ @SerialName("__isVsSetting")
+ val isVsSetting: String,
+ @SerialName("leagueMatchEvent")
+ val leagueMatchEvent: LeagueMatchEvent,
+ @SerialName("__typename")
+ val typename: String,
+ @SerialName("vsRule")
+ val vsRule: VsRule,
+ @SerialName("vsStages")
+ val vsStages: List
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/DB.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/MapNode.kt
similarity index 58%
rename from src/main/kotlin/net/moonleay/lilJudd/data/DB.kt
rename to src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/MapNode.kt
index b1ff4b7..f17d17c 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/DB.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/MapNode.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,19 +16,22 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data
+package net.moonleay.liljudd.data.api.splatoon3ink.schedules
-import org.jetbrains.exposed.sql.Database
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
-object DB {
- //Connect to the provided DB; trows errors, if the DB is not avalible.
- fun connect(dbDomain: String, dbName: String, dbUser: String, dbPasswd: String) {
- Database.connect(
- "jdbc:postgresql://$dbDomain/$dbName",
- driver = "org.postgresql.Driver",
- user = dbUser,
- password = dbPasswd
- )
- }
-}
+@Serializable
+data class MapNode(
+ @SerialName("id")
+ val id: String,
+ @SerialName("name")
+ val name: String,
+ @SerialName("originalImage")
+ val originalImage: OriginalImage,
+ @SerialName("stats")
+ val stats: String?, // is null
+ @SerialName("vsStageId")
+ val vsStageId: Int
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/OriginalImage.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/OriginalImage.kt
new file mode 100644
index 0000000..0393f71
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/OriginalImage.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class OriginalImage(
+ @SerialName("url")
+ val url: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularMatchSetting.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularMatchSetting.kt
new file mode 100644
index 0000000..ea899be
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularMatchSetting.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class RegularMatchSetting(
+ @SerialName("__isVsSetting")
+ val isVsSetting: String,
+ @SerialName("__typename")
+ val typename: String,
+ @SerialName("vsRule")
+ val vsRule: VsRule,
+ @SerialName("vsStages")
+ val vsStages: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularNode.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularNode.kt
new file mode 100644
index 0000000..9a6935f
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularNode.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class RegularNode(
+ @SerialName("endTime")
+ val endTime: String,
+ @SerialName("festMatchSettings")
+ val festMatchSettings: FestMatchSettingXX?,
+ @SerialName("regularMatchSetting")
+ val regularMatchSetting: RegularMatchSetting,
+ @SerialName("startTime")
+ val startTime: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularSchedules.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularSchedules.kt
new file mode 100644
index 0000000..b6c55db
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularSchedules.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class RegularSchedules(
+ @SerialName("nodes")
+ val nodes: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularSchedulesX.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularSchedulesX.kt
new file mode 100644
index 0000000..04418e0
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/RegularSchedulesX.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class RegularSchedulesX(
+ @SerialName("nodes")
+ val nodes: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/SalmonRunNode.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/SalmonRunNode.kt
new file mode 100644
index 0000000..ad53d45
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/SalmonRunNode.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class SalmonRunNode(
+ @SerialName("endTime")
+ val endTime: String,
+ @SerialName("setting")
+ val setting: Setting,
+ @SerialName("__splatoon3ink_king_salmonid_guess")
+ val splatoon3inkKingSalmonidGuess: String,
+ @SerialName("startTime")
+ val startTime: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Schedules.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Schedules.kt
new file mode 100644
index 0000000..f3d08c7
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Schedules.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Schedules(
+ @SerialName("data")
+ val data: SchedulesData
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/SchedulesData.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/SchedulesData.kt
new file mode 100644
index 0000000..0bf967a
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/SchedulesData.kt
@@ -0,0 +1,45 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class SchedulesData(
+ @SerialName("bankaraSchedules")
+ val bankaraSchedules: BankaraSchedules,
+ @SerialName("coopGroupingSchedule")
+ val coopGroupingSchedule: CoopGroupingSchedule,
+ @SerialName("currentFest")
+ val currentFest: CurrentFest?,
+ @SerialName("currentPlayer")
+ val currentPlayer: CurrentPlayer,
+ @SerialName("eventSchedules")
+ val eventSchedules: EventSchedules,
+ @SerialName("festSchedules")
+ val festSchedules: FestSchedules,
+ @SerialName("regularSchedules")
+ val regularSchedules: RegularSchedulesX,
+ @SerialName("vsStages")
+ val vsStages: VsStages,
+ @SerialName("xSchedules")
+ val xSchedules: XSchedules
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Setting.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Setting.kt
new file mode 100644
index 0000000..3ebd2f2
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Setting.kt
@@ -0,0 +1,37 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Setting(
+ @SerialName("boss")
+ val boss: Boss,
+ @SerialName("coopStage")
+ val coopStage: CoopStage,
+ @SerialName("__isCoopSetting")
+ val isCoopSetting: String,
+ @SerialName("__typename")
+ val typename: String,
+ @SerialName("weapons")
+ val weapons: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Team.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Team.kt
new file mode 100644
index 0000000..8043c5d
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Team.kt
@@ -0,0 +1,33 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Team(
+ @SerialName("color")
+ val color: Color,
+ @SerialName("id")
+ val id: String,
+// @SerialName("myVoteState")
+// val myVoteState: Any?
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/tables/PlanningNotifierRoles.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TeamContestNode.kt
similarity index 63%
rename from src/main/kotlin/net/moonleay/lilJudd/data/tables/PlanningNotifierRoles.kt
rename to src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TeamContestNode.kt
index d8d3b9d..22b36d8 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/tables/PlanningNotifierRoles.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TeamContestNode.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,13 +16,18 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data.tables
+package net.moonleay.liljudd.data.api.splatoon3ink.schedules
-import org.jetbrains.exposed.dao.id.IntIdTable
-object PlanningNotifierRoles : IntIdTable() {
- var serverid = varchar("serverid", 50)
- var channelid = varchar("channelid", 50)
- var hastimeroleid = varchar("hastimeroleid", 50)
- var wantstobenotifiedid = varchar("wantstobenotifiedid", 50)
-}
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class TeamContestNode(
+ @SerialName("endTime")
+ val endTime: String,
+ @SerialName("setting")
+ val setting: CoopSetting,
+ @SerialName("startTime")
+ val startTime: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TeamContestSchedules.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TeamContestSchedules.kt
new file mode 100644
index 0000000..1265efc
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TeamContestSchedules.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class TeamContestSchedules(
+ @SerialName("nodes")
+ val nodes: List // This is a placeholder.
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/ThumbnailImage.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/ThumbnailImage.kt
new file mode 100644
index 0000000..9fb03cd
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/ThumbnailImage.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class ThumbnailImage(
+ @SerialName("url")
+ val url: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TimePeriod.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TimePeriod.kt
new file mode 100644
index 0000000..d86de17
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TimePeriod.kt
@@ -0,0 +1,31 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class TimePeriod(
+ @SerialName("endTime")
+ val endTime: String,
+ @SerialName("startTime")
+ val startTime: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TricolorStage.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TricolorStage.kt
new file mode 100644
index 0000000..b5685cc
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/TricolorStage.kt
@@ -0,0 +1,33 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class TricolorStage(
+ @SerialName("id")
+ val id: String,
+ @SerialName("image")
+ val image: Image,
+ @SerialName("name")
+ val name: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/UserIcon.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/UserIcon.kt
new file mode 100644
index 0000000..673f73a
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/UserIcon.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class UserIcon(
+ @SerialName("url")
+ val url: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsRule.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsRule.kt
new file mode 100644
index 0000000..bddb5a5
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsRule.kt
@@ -0,0 +1,33 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class VsRule(
+ @SerialName("id")
+ val id: String,
+ @SerialName("name")
+ val name: String,
+ @SerialName("rule")
+ val rule: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsStage.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsStage.kt
new file mode 100644
index 0000000..0b9cebf
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsStage.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class VsStage(
+ @SerialName("id")
+ val id: String,
+ @SerialName("image")
+ val image: Image,
+ @SerialName("name")
+ val name: String,
+ @SerialName("vsStageId")
+ val vsStageId: Int
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsStages.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsStages.kt
new file mode 100644
index 0000000..142508d
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/VsStages.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class VsStages(
+ @SerialName("nodes")
+ val nodes: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Weapon.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Weapon.kt
new file mode 100644
index 0000000..a65820d
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/Weapon.kt
@@ -0,0 +1,33 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Weapon(
+ @SerialName("image")
+ val image: Image,
+ @SerialName("name")
+ val name: String,
+ @SerialName("__splatoon3ink_id")
+ val splatoon3inkId: String
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XMatchSetting.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XMatchSetting.kt
new file mode 100644
index 0000000..edca851
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XMatchSetting.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class XMatchSetting(
+ @SerialName("__isVsSetting")
+ val isVsSetting: String,
+ @SerialName("__typename")
+ val typename: String,
+ @SerialName("vsRule")
+ val vsRule: VsRule,
+ @SerialName("vsStages")
+ val vsStages: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XNode.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XNode.kt
new file mode 100644
index 0000000..0242771
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XNode.kt
@@ -0,0 +1,35 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class XNode(
+ @SerialName("endTime")
+ val endTime: String,
+ @SerialName("festMatchSettings")
+ val festMatchSettings: FestMatchSettingXX?,
+ @SerialName("startTime")
+ val startTime: String,
+ @SerialName("xMatchSetting")
+ val xMatchSetting: XMatchSetting
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XSchedules.kt b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XSchedules.kt
new file mode 100644
index 0000000..9de2887
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/api/splatoon3ink/schedules/XSchedules.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.api.splatoon3ink.schedules
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class XSchedules(
+ @SerialName("nodes")
+ val nodes: List
+)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/database/DB.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/DB.kt
new file mode 100644
index 0000000..2475f28
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/DB.kt
@@ -0,0 +1,55 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.database
+
+
+import net.moonleay.liljudd.data.database.tables.MatchPlanningData
+import net.moonleay.liljudd.data.database.tables.PlanningNotifierRoles
+import net.moonleay.liljudd.data.database.tables.TimePlanningChannels
+import net.moonleay.liljudd.data.database.tables.TimePlanningMessages
+import org.jetbrains.exposed.sql.Database
+import org.jetbrains.exposed.sql.SchemaUtils
+import org.jetbrains.exposed.sql.transactions.transaction
+
+object DB {
+ private var connected = false
+
+ //Connect to the provided DB; trows errors, if the DB is not available.
+ fun connect(dbDomain: String, dbName: String, dbUser: String, dbPasswd: String) {
+ Database.connect(
+ "jdbc:postgresql://$dbDomain/$dbName",
+ driver = "org.postgresql.Driver",
+ user = dbUser,
+ password = dbPasswd
+ )
+ connected = true
+ }
+
+ fun register() {
+ if (!connected)
+ return
+ // Register tables here
+ transaction {
+ SchemaUtils.create(TimePlanningChannels)
+ SchemaUtils.create(TimePlanningMessages)
+ SchemaUtils.create(MatchPlanningData)
+ SchemaUtils.create(PlanningNotifierRoles)
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/entry/MatchPlanningDataData.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/entry/MatchPlanningDataData.kt
similarity index 69%
rename from src/main/kotlin/net/moonleay/lilJudd/data/entry/MatchPlanningDataData.kt
rename to src/main/kotlin/net/moonleay/liljudd/data/database/entry/MatchPlanningDataData.kt
index ca0bd32..77bfcc8 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/entry/MatchPlanningDataData.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/entry/MatchPlanningDataData.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,17 +16,17 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data.entry
+package net.moonleay.liljudd.data.database.entry
data class MatchPlanningDataData(
val id: Int,
- val serverid: String,
- val channelid: String,
- val matchtype: String,
- val registererid: String,
- val roleid: String,
- val opponentname: String,
- val messageid: String,
- val timestamp: String,
- val jobstr: String
+ val serverID: Long,
+ val channelID: Long,
+ val matchType: String,
+ val registererID: Long,
+ val roleID: Long,
+ val opponentName: String,
+ val messageID: Long,
+ val timestamp: Long,
+ val jobString: String
)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/entry/PlanningNotifierRolesData.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/entry/PlanningNotifierRolesData.kt
similarity index 65%
rename from src/main/kotlin/net/moonleay/lilJudd/data/entry/PlanningNotifierRolesData.kt
rename to src/main/kotlin/net/moonleay/liljudd/data/database/entry/PlanningNotifierRolesData.kt
index 8cba107..b6d0abf 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/entry/PlanningNotifierRolesData.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/entry/PlanningNotifierRolesData.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,11 +16,12 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data.entry
+package net.moonleay.liljudd.data.database.entry
data class PlanningNotifierRolesData(
- val serverID: String, // The id of the server
- val channelId: String, // The id of the channel
- val hastimeroleid: String, // The id of the role that has time today
- val wantstobenotifid: String // The id of the role that wants to be notified
+ val id: Int, // The id of the entry
+ val serverID: Long, // The id of the server
+ val channelID: Long, // The id of the channel
+ val hasTimeRoleID: Long, // The id of the role that has time today
+ val wantsToBeNotifiedID: Long // The id of the role that wants to be notified
)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/database/entry/TimePlanningChannelsData.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/entry/TimePlanningChannelsData.kt
new file mode 100644
index 0000000..0f93b9e
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/entry/TimePlanningChannelsData.kt
@@ -0,0 +1,25 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.database.entry
+
+data class TimePlanningChannelsData(
+ val id: Int,
+ val serverID: Long,
+ val channelID: Long,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/entry/TimePlanningMessagesData.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/entry/TimePlanningMessagesData.kt
similarity index 67%
rename from src/main/kotlin/net/moonleay/lilJudd/data/entry/TimePlanningMessagesData.kt
rename to src/main/kotlin/net/moonleay/liljudd/data/database/entry/TimePlanningMessagesData.kt
index 3da4ba8..c1192fc 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/entry/TimePlanningMessagesData.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/entry/TimePlanningMessagesData.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,11 +16,12 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data.entry
+package net.moonleay.liljudd.data.database.entry
data class TimePlanningMessagesData(
- val serverid: String, // The discord server id
- val channelid: String, // The discord channel id
- val weekstamp: String, // The timestamp of the monday of the week at 4am UTC
- val messageids: String // IDs are in the following format: "{weekdayNr}:{id};{weekdayNr}:{id};[etc.]"
+ val id: Int, // The id of the entry
+ val serverID: Long, // The discord server id
+ val channelID: Long, // The discord channel id
+ val weekstamp: Long, // The timestamp of the monday of the week at 4am UTC
+ val messageIDs: String // IDs are in the following format: "{weekdayNr}:{id};{weekdayNr}:{id};[etc.]"
)
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/database/repository/MatchPlanningDataRepository.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/repository/MatchPlanningDataRepository.kt
new file mode 100644
index 0000000..5c93b43
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/repository/MatchPlanningDataRepository.kt
@@ -0,0 +1,115 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.database.repository
+
+import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData
+import net.moonleay.liljudd.data.database.tables.MatchPlanningData
+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.selectAll
+import org.jetbrains.exposed.sql.transactions.transaction
+
+object MatchPlanningDataRepository {
+
+ fun getAll(): List {
+ val dataList = mutableListOf()
+ transaction {
+ MatchPlanningData.selectAll().forEach {
+ dataList.add(
+ MatchPlanningDataData(
+ it[MatchPlanningData.id],
+ it[MatchPlanningData.serverid],
+ it[MatchPlanningData.channelid],
+ it[MatchPlanningData.matchtype],
+ it[MatchPlanningData.registererid],
+ it[MatchPlanningData.roleid],
+ it[MatchPlanningData.opponentName],
+ it[MatchPlanningData.messageid],
+ it[MatchPlanningData.timestamp],
+ it[MatchPlanningData.jobstr]
+ )
+ )
+ }
+ }
+ return dataList
+ }
+
+ fun get(id: Int): MatchPlanningDataData? =
+ transaction {
+ MatchPlanningData.selectAll().where { MatchPlanningData.id eq id }.firstOrNull()?.let {
+ MatchPlanningDataData(
+ it[MatchPlanningData.id],
+ it[MatchPlanningData.serverid],
+ it[MatchPlanningData.channelid],
+ it[MatchPlanningData.matchtype],
+ it[MatchPlanningData.registererid],
+ it[MatchPlanningData.roleid],
+ it[MatchPlanningData.opponentName],
+ it[MatchPlanningData.messageid],
+ it[MatchPlanningData.timestamp],
+ it[MatchPlanningData.jobstr]
+ )
+ }
+ }
+
+ fun getFromMessageInChannelInServer(messageID: Long, channelID: Long, serverID: Long): MatchPlanningDataData? =
+ transaction {
+ MatchPlanningData.selectAll().where {
+ MatchPlanningData.messageid eq (messageID) and (
+ MatchPlanningData.serverid eq (serverID)) and (
+ MatchPlanningData.channelid eq (channelID))
+ }.firstOrNull()?.let {
+ MatchPlanningDataData(
+ it[MatchPlanningData.id],
+ it[MatchPlanningData.serverid],
+ it[MatchPlanningData.channelid],
+ it[MatchPlanningData.matchtype],
+ it[MatchPlanningData.registererid],
+ it[MatchPlanningData.roleid],
+ it[MatchPlanningData.opponentName],
+ it[MatchPlanningData.messageid],
+ it[MatchPlanningData.timestamp],
+ it[MatchPlanningData.jobstr]
+ )
+ }
+ }
+
+ fun delete(id: Int) {
+ transaction {
+ MatchPlanningData.deleteWhere { MatchPlanningData.id eq id }
+ }
+ }
+
+ fun write(data: MatchPlanningDataData): Int =
+ transaction {
+ MatchPlanningData.insert {
+ it[serverid] = data.serverID
+ it[channelid] = data.channelID
+ it[matchtype] = data.matchType
+ it[registererid] = data.registererID
+ it[roleid] = data.roleID
+ it[opponentName] = data.opponentName
+ it[messageid] = data.messageID
+ it[timestamp] = data.timestamp
+ it[jobstr] = data.jobString
+ } get MatchPlanningData.id
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/database/repository/PlanningNotifierRolesRepository.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/repository/PlanningNotifierRolesRepository.kt
new file mode 100644
index 0000000..3333471
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/repository/PlanningNotifierRolesRepository.kt
@@ -0,0 +1,106 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.database.repository
+
+import net.moonleay.liljudd.data.database.entry.PlanningNotifierRolesData
+import net.moonleay.liljudd.data.database.tables.PlanningNotifierRoles
+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.selectAll
+import org.jetbrains.exposed.sql.transactions.transaction
+
+object PlanningNotifierRolesRepository {
+
+ fun getAll(): List {
+ val dataList = mutableListOf()
+ transaction {
+ for (pnr in PlanningNotifierRoles.selectAll()) {
+ dataList.add(
+ PlanningNotifierRolesData(
+ pnr[PlanningNotifierRoles.id],
+ pnr[PlanningNotifierRoles.serverid],
+ pnr[PlanningNotifierRoles.channelid],
+ pnr[PlanningNotifierRoles.hastimeroleid],
+ pnr[PlanningNotifierRoles.wantstobenotifiedid]
+ )
+ )
+ }
+ }
+ return dataList
+ }
+
+ fun getForChannel(channelID: Long): PlanningNotifierRolesData? =
+ transaction {
+ PlanningNotifierRoles.selectAll().where { PlanningNotifierRoles.channelid eq channelID }.firstOrNull()?.let {
+ PlanningNotifierRolesData(
+ it[PlanningNotifierRoles.id],
+ it[PlanningNotifierRoles.serverid],
+ it[PlanningNotifierRoles.channelid],
+ it[PlanningNotifierRoles.hastimeroleid],
+ it[PlanningNotifierRoles.wantstobenotifiedid]
+ )
+ }
+ }
+
+ fun getForChannelInServer(channelID: Long, serverID: Long): PlanningNotifierRolesData? =
+ transaction {
+ PlanningNotifierRoles.selectAll()
+ .where { PlanningNotifierRoles.channelid eq channelID and (PlanningNotifierRoles.serverid eq serverID) }
+ .firstOrNull()?.let {
+ PlanningNotifierRolesData(
+ it[PlanningNotifierRoles.id],
+ it[PlanningNotifierRoles.serverid],
+ it[PlanningNotifierRoles.channelid],
+ it[PlanningNotifierRoles.hastimeroleid],
+ it[PlanningNotifierRoles.wantstobenotifiedid]
+ )
+ }
+ }
+
+ fun existsInChannel(channelID: Long): Boolean =
+ transaction {
+ PlanningNotifierRoles.selectAll().where { PlanningNotifierRoles.channelid eq channelID }.count() > 0
+ }
+
+ fun existsInChannelFromSever(channelID: Long, serverID: Long): Boolean =
+ transaction {
+ PlanningNotifierRoles.selectAll()
+ .where { PlanningNotifierRoles.channelid eq channelID and (PlanningNotifierRoles.serverid eq serverID) }
+ .count() > 0
+ }
+
+ fun write(data: PlanningNotifierRolesData) {
+ transaction {
+ PlanningNotifierRoles.insert {
+ it[serverid] = data.serverID
+ it[channelid] = data.channelID
+ it[hastimeroleid] = data.hasTimeRoleID
+ it[wantstobenotifiedid] = data.wantsToBeNotifiedID
+ } get PlanningNotifierRoles.id
+ }
+ }
+
+ fun delete(id: Int) {
+ transaction {
+ PlanningNotifierRoles.deleteWhere { PlanningNotifierRoles.id eq id }
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/database/repository/TimePlanningChannelsRepository.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/repository/TimePlanningChannelsRepository.kt
new file mode 100644
index 0000000..f809420
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/repository/TimePlanningChannelsRepository.kt
@@ -0,0 +1,73 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.database.repository
+
+import net.moonleay.liljudd.data.database.entry.TimePlanningChannelsData
+import net.moonleay.liljudd.data.database.tables.TimePlanningChannels
+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.selectAll
+import org.jetbrains.exposed.sql.transactions.transaction
+
+object TimePlanningChannelsRepository {
+
+ fun getAll(): List {
+ val dataList = mutableListOf()
+ transaction {
+ for (tp in TimePlanningChannels.selectAll())
+ dataList.add(
+ TimePlanningChannelsData(
+ id = tp[TimePlanningChannels.id],
+ serverID = tp[TimePlanningChannels.serverid],
+ channelID = tp[TimePlanningChannels.channelid],
+ )
+ )
+ }
+ return dataList
+ }
+
+ fun exists(channelID: Long, serverID: Long): Boolean =
+ transaction {
+ TimePlanningChannels.selectAll()
+ .where { TimePlanningChannels.channelid eq channelID and (TimePlanningChannels.serverid eq serverID) }
+ .firstOrNull() != null
+ }
+
+ fun delete(id: Int) {
+ transaction {
+ TimePlanningChannels.deleteWhere { TimePlanningChannels.id eq id }
+ }
+ }
+
+ fun deleteFromChannelInServer(channelID: Long, serverID: Long) {
+ transaction {
+ TimePlanningChannels.deleteWhere { channelid eq channelID and (serverid eq serverID) }
+ }
+ }
+
+ fun write(data: TimePlanningChannelsData): Int =
+ transaction {
+ TimePlanningChannels.insert {
+ it[serverid] = data.serverID
+ it[channelid] = data.channelID
+ } get TimePlanningChannels.id
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/database/repository/TimePlanningMessagesRepository.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/repository/TimePlanningMessagesRepository.kt
new file mode 100644
index 0000000..4c92a08
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/repository/TimePlanningMessagesRepository.kt
@@ -0,0 +1,73 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.database.repository
+
+import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData
+import net.moonleay.liljudd.data.database.tables.TimePlanningMessages
+import org.jetbrains.exposed.sql.and
+import org.jetbrains.exposed.sql.insert
+import org.jetbrains.exposed.sql.selectAll
+import org.jetbrains.exposed.sql.transactions.transaction
+
+object TimePlanningMessagesRepository {
+
+ fun write(data: TimePlanningMessagesData): Int =
+ transaction {
+ TimePlanningMessages.insert {
+ it[serverid] = data.serverID
+ it[channelid] = data.channelID
+ it[weekstamp] = data.weekstamp
+ it[messageids] = data.messageIDs
+ } get TimePlanningMessages.id
+ }
+
+ fun getWeek(stamp: Long): List {
+ val dataList = mutableListOf()
+ transaction {
+ for (pnr in TimePlanningMessages.selectAll().where { TimePlanningMessages.weekstamp eq (stamp) }) {
+ dataList.add(
+ TimePlanningMessagesData(
+ pnr[TimePlanningMessages.id],
+ pnr[TimePlanningMessages.serverid],
+ pnr[TimePlanningMessages.channelid],
+ pnr[TimePlanningMessages.weekstamp],
+ pnr[TimePlanningMessages.messageids]
+ )
+ )
+ }
+ }
+ return dataList
+ }
+
+ fun getWeekInChannel(stamp: Long, channelID: Long): TimePlanningMessagesData? =
+ transaction {
+ TimePlanningMessages.selectAll()
+ .where { TimePlanningMessages.weekstamp eq (stamp) and (TimePlanningMessages.channelid eq channelID) }.firstOrNull()?.let {
+ TimePlanningMessagesData(
+ it[TimePlanningMessages.id],
+ it[TimePlanningMessages.serverid],
+ it[TimePlanningMessages.channelid],
+ it[TimePlanningMessages.weekstamp],
+ it[TimePlanningMessages.messageids]
+ )
+ }
+ }
+
+
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/tables/MatchPlanningData.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/tables/MatchPlanningData.kt
similarity index 63%
rename from src/main/kotlin/net/moonleay/lilJudd/data/tables/MatchPlanningData.kt
rename to src/main/kotlin/net/moonleay/liljudd/data/database/tables/MatchPlanningData.kt
index 2de3ece..1ba4ae3 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/tables/MatchPlanningData.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/tables/MatchPlanningData.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,18 +16,19 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data.tables
+package net.moonleay.liljudd.data.database.tables
-import org.jetbrains.exposed.dao.id.IntIdTable
+import org.jetbrains.exposed.sql.Table
-object MatchPlanningData : IntIdTable() {
- var serverid = varchar("serverid", 50)
- var channelid = varchar("channelid", 50)
+object MatchPlanningData : Table(name = "new_matchplanning_data") {
+ var id = integer("id").autoIncrement()
+ var serverid = long("serverid")
+ var channelid = long("channelid")
var matchtype = varchar("matchtype", 50)
- var registererid = varchar("registererid", 50)
- var roleid = varchar("roleid", 50)
+ var registererid = long("registererid")
+ var roleid = long("roleid")
var opponentName = varchar("opponentname", 100)
- var messageid = varchar("messageid", 50)
- var timestamp = varchar("timestamp", 50)
+ var messageid = long("messageid")
+ var timestamp = long("timestamp")
var jobstr = varchar("jobstr", 50)
}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/database/tables/PlanningNotifierRoles.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/tables/PlanningNotifierRoles.kt
new file mode 100644
index 0000000..0e44813
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/tables/PlanningNotifierRoles.kt
@@ -0,0 +1,29 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.database.tables
+
+import org.jetbrains.exposed.sql.Table
+
+object PlanningNotifierRoles : Table(name = "new_planningnotifier_roles") {
+ var id = integer("id").autoIncrement()
+ var serverid = long("serverid")
+ var channelid = long("channelid")
+ var hastimeroleid = long("hastimeroleid")
+ var wantstobenotifiedid = long("wantstobenotifiedid")
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/data/database/tables/TimePlanningChannels.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/tables/TimePlanningChannels.kt
new file mode 100644
index 0000000..7b81b0b
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/tables/TimePlanningChannels.kt
@@ -0,0 +1,28 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.database.tables
+
+import org.jetbrains.exposed.sql.Table
+
+
+object TimePlanningChannels : Table(name = "new_timeplanning_channels") {
+ var id = integer("id").autoIncrement()
+ var serverid = long("serverid")
+ val channelid = long("channelid")
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/tables/TimePlanningMessages.kt b/src/main/kotlin/net/moonleay/liljudd/data/database/tables/TimePlanningMessages.kt
similarity index 67%
rename from src/main/kotlin/net/moonleay/lilJudd/data/tables/TimePlanningMessages.kt
rename to src/main/kotlin/net/moonleay/liljudd/data/database/tables/TimePlanningMessages.kt
index 7498edb..f7061ac 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/tables/TimePlanningMessages.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/data/database/tables/TimePlanningMessages.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,13 +16,14 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data.tables
+package net.moonleay.liljudd.data.database.tables
-import org.jetbrains.exposed.dao.id.IntIdTable
+import org.jetbrains.exposed.sql.Table
-object TimePlanningMessages : IntIdTable() {
- var serverid = varchar("serverid", 50)
- var channelid = varchar("channelid", 50)
- var weekstamp = varchar("weekstamp", 50)
+object TimePlanningMessages : Table(name = "new_timeplanning_messages") {
+ var id = integer("id").autoIncrement()
+ var serverid = long("serverid")
+ var channelid = long("channelid")
+ var weekstamp = long("weekstamp")
var messageids = varchar("messageids", 200)
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/FeatureManageExtension.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/FeatureManageExtension.kt
similarity index 53%
rename from src/main/kotlin/net/moonleay/lilJudd/extensions/FeatureManageExtension.kt
rename to src/main/kotlin/net/moonleay/liljudd/extensions/FeatureManageExtension.kt
index 48f68e9..309e433 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/FeatureManageExtension.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/FeatureManageExtension.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,22 +16,22 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.extensions
+package net.moonleay.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 dev.kord.common.Color
import dev.kord.common.entity.Permission
-import net.moonleay.lilJudd.extensions.component.EnableOrDisable
-import net.moonleay.lilJudd.features.component.FeatureEnum
-import net.moonleay.lilJudd.features.component.FeatureManager
-import net.moonleay.lilJudd.util.Logger
-import net.moonleay.lilJudd.util.MessageUtil
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.extensions.component.EnableOrDisable
+import net.moonleay.liljudd.features.component.FeatureEnum
+import net.moonleay.liljudd.features.component.FeatureManager
+import net.moonleay.liljudd.util.EmbedColor
+import net.moonleay.liljudd.util.Logger
+import net.moonleay.liljudd.util.MessageUtil
class FeatureManageExtension : Extension() {
@@ -49,45 +49,66 @@ class FeatureManageExtension : Extension() {
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 Administrator permission.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- )
+ this.embed {
+ this.color = EmbedColor.ERROR.color
+ this.title = "401: Not Authorized"
+ this.description =
+ "You cannot edit features, as you don't have the Administrator permission."
+ this.footer {
+ this.icon = u.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(u)
+ }
+ }
}
return@action
}
- val gID = this.guild!!.id.toString()
- val cID = this.arguments.channel.id.toString()
+ val gID = this.guild!!.id.value.toLong()
+ val cID = this.arguments.channel.id.value.toLong()
val channel = this.arguments.channel
val args = this.arguments
Logger.out("${args.feature.readableName} ${args.setStatus.readableName} ${channel.data.name.value}")
val f = FeatureManager.getFeature(args.feature)
if (f == null) {
this.respond {
- this.embeds.add(
- MessageUtil.getEmbed(
- Color(0xE0311A),
- "404: Not Found",
- "The feature you are trying to edit does not exist.",
- u.asUser().username + "#" + u.asUser().discriminator
- )
- )
+ this.embed {
+ this.color = EmbedColor.ERROR.color
+ this.title = "404: Not Found"
+ this.description = "The feature you are trying to edit does not exist."
+ this.footer {
+ this.icon = u.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(u)
+ }
+ }
}
return@action
}
if (this.arguments.setStatus == EnableOrDisable.ENABLE) {
+ val enabled = f.enable(u, gID, cID, channel, args)
this.respond {
- this.embeds.add(f.enable(u, gID, cID, channel, args))
+ this.embed {
+ this.color = enabled.color
+ this.title = enabled.title
+ this.description = enabled.description
+ this.footer {
+ this.icon = u.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(u)
+ }
+ }
}
return@action
}
+ val disabled = f.disable(u, gID, cID, channel, args)
this.respond {
- this.embeds.add(f.disable(u, gID, cID, channel, args))
+ this.embed {
+ this.color = disabled.color
+ this.title = disabled.title
+ this.description = disabled.description
+ this.footer {
+ this.icon = u.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(u)
+ }
+ }
}
}
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/VersionExtension.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/InfoExtension.kt
similarity index 50%
rename from src/main/kotlin/net/moonleay/lilJudd/extensions/VersionExtension.kt
rename to src/main/kotlin/net/moonleay/liljudd/extensions/InfoExtension.kt
index c116c02..b47af0b 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/VersionExtension.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/InfoExtension.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,30 +16,32 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.extensions
+package net.moonleay.liljudd.extensions
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
-import dev.kord.common.Color
-import net.moonleay.botendo.build.BuildConstants
-import net.moonleay.lilJudd.util.MessageUtil
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.build.BuildConstants
+import net.moonleay.liljudd.util.EmbedColor
-class VersionExtension : Extension() {
- override val name = "version"
+class InfoExtension : Extension() {
+ override val name = "info"
override suspend fun setup() {
publicSlashCommand {
- name = "version"
+ name = "info"
description = "Show infos about the bot"
this.action {
- MessageUtil.sendEmbedForPublicSlashCommand(
- this,
- Color(0x52E01A),
- "Lil' Judd",
- "Lil' Judd ***v." + BuildConstants.version + "***\n" +
- "Kord-Extensions ***v." + BuildConstants.kordVersion + "***\n" +
- "Coroutines ***v." + BuildConstants.coroutinesVersion + "***\n" +
- "Krontab ***v." + BuildConstants.krontabVersion + "***"
- )
+ this.respond {
+ this.embed {
+ this.color = EmbedColor.INFO.color
+ this.title = "Li'l Judd"
+ this.description = "Li'l Judd ***v." + BuildConstants.version + "***\n" +
+ "Kord-Extensions ***v." + BuildConstants.kordVersion + "***\n" +
+ "Coroutines ***v." + BuildConstants.coroutinesVersion + "***\n" +
+ "Krontab ***v." + BuildConstants.krontabVersion + "***\n\n" +
+ "Splatoon 3 api data provided by splatoon3.ink"
+ }
+ }
}
}
}
diff --git a/src/main/kotlin/net/moonleay/liljudd/extensions/MatchExtension.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/MatchExtension.kt
new file mode 100644
index 0000000..7d6a8c6
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/MatchExtension.kt
@@ -0,0 +1,172 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.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.string
+import com.kotlindiscord.kord.extensions.extensions.Extension
+import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
+import dev.kord.core.behavior.createRole
+import dev.kord.rest.builder.message.actionRow
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData
+import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
+import net.moonleay.liljudd.extensions.component.MatchTypes
+import net.moonleay.liljudd.jobs.MatchJob
+import net.moonleay.liljudd.jobs.component.JobManager
+import net.moonleay.liljudd.util.EmbedColor
+import net.moonleay.liljudd.util.EmbedUtil
+import net.moonleay.liljudd.util.MessageUtil
+import net.moonleay.liljudd.util.TimeUtil
+
+class MatchExtension : Extension() {
+
+ override val name = "match"
+ override val allowApplicationCommandInDMs: Boolean
+ get() = false
+
+
+ override suspend fun setup() {
+ publicSlashCommand(::MatchArguments) {
+ name = "match"
+ description = "Create a match"
+ this.action {
+ val args = this.arguments
+ val m = this.member!!
+ val gID = this.guild!!.id.value
+ val cID = this.channel.id.value
+ val opponent = args.opponent
+ if (!TimeUtil.validateDateString(args.timeStamp)) {
+ this.respond {
+ this.embed {
+ this.color = EmbedColor.ERROR.color
+ this.title = "400: Bad Request"
+ this.description = "The given timestamp is invalid.\n" +
+ "Please use the format \"dd.MM.yyyy HH:mm\"."
+ this.footer {
+ this.icon = m.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(m.asUser())
+ }
+ }
+ }
+ return@action
+ }
+ // filter time to date:
+ val zdt = TimeUtil.getDateFromString(args.timeStamp)
+ // get the string for the cronjob
+ val jobString = TimeUtil.getCronjobStringFromDate(zdt)
+ // create the role
+ val role = this.guild!!.createRole {
+ this.name =
+ "${args.matchType.readableName} Vs ${opponent} At ${zdt.dayOfMonth}/${zdt.month}/${zdt.year} ${zdt.hour}:${zdt.minute}"
+ this.mentionable = true
+ }
+ // Check if the role was created successfully
+ if (role == null) {
+ this.respond {
+ this.embed {
+ this.color = EmbedColor.ERROR.color
+ this.title = "500: Internal Error"
+ this.description = "Could not find created role.\n" +
+ "It seems, that said role could not be created."
+ this.footer {
+ this.icon = m.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(m.asUser())
+ }
+ }
+ }
+ return@action
+ }
+ val msg = this.respond {
+ val eb = MessageUtil.getEmbedWithTable(
+ EmbedColor.INFO,
+ args.matchType.readableName,
+ "***Vs. $opponent***\n" +
+ "At ${args.timeStamp}\n" +
+ "Registered by ${m.mention}",
+ mapOf(
+ "Signed up" to listOf(),
+ "Unavailable" to listOf(),
+ )
+ )
+ this.embed {
+ this.color = eb.color
+ this.title = eb.title
+ this.description = eb.description
+ this.fields = eb.fields
+ this.footer {
+ this.icon = m.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(m.asUser())
+ }
+ }
+
+ this.actionRow {
+ this.components.addAll(EmbedUtil.getMatchButtons().components)
+ }
+ }
+ val tID = MatchPlanningDataRepository.write(
+ MatchPlanningDataData(
+ 0,
+ gID.toLong(),
+ cID.toLong(),
+ args.matchType.readableName,
+ m.id.value.toLong(),
+ role.id.value.toLong(),
+ opponent,
+ msg.id.value.toLong(),
+ (zdt.toEpochSecond() * 1000),
+ jobString
+ )
+ )
+ if (tID == null || tID <= 0) {
+ return@action // Not saved to db
+ // TODO: Add error message
+ }
+ JobManager.addJob(
+ MatchJob(
+ jobString,
+ tID,
+ "${args.matchType.readableName}_Vs_${opponent}_[${tID}]-${gID}_${cID}",
+ )
+ )
+ }
+ }
+ }
+
+ inner class MatchArguments : Arguments() {
+
+ val matchType by enumChoice {
+ this.name = "match"
+ this.description = "The type of match"
+ this.typeName = "en_US"
+ }
+
+
+ val timeStamp by string {
+ this.name = "timestamp"
+ this.description = "The timestamp of the match. Format \"dd.MM.yyyy HH:mm\"."
+ }
+
+ val opponent by string {
+ this.name = "opponent"
+ this.description = "The opponent"
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/extensions/RotationExtension.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/RotationExtension.kt
new file mode 100644
index 0000000..d5b0d7e
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/RotationExtension.kt
@@ -0,0 +1,464 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.extensions
+
+import com.kotlindiscord.kord.extensions.commands.Arguments
+import com.kotlindiscord.kord.extensions.commands.application.slash.converters.impl.enumChoice
+import com.kotlindiscord.kord.extensions.extensions.Extension
+import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
+import dev.kord.common.Color
+import dev.kord.rest.builder.message.embed
+import kotlinx.datetime.Clock
+import net.moonleay.liljudd.data.api.splatoon3ink.Splatoon3ApiDataGrabber
+import net.moonleay.liljudd.extensions.component.SplatoonOnlineMode
+import net.moonleay.liljudd.util.TimeUtil
+
+class RotationExtension : Extension() {
+
+ override val name = "rotation"
+ override val allowApplicationCommandInDMs: Boolean
+ get() = false
+
+
+ override suspend fun setup() {
+ publicSlashCommand(::RotationArguments) {
+ name = "rotation"
+ description = "Check the current rotations"
+ this.action {
+ val mode = this.arguments.mode
+ when (mode) {
+ SplatoonOnlineMode.ALL -> {
+ val regSched = Splatoon3ApiDataGrabber.getRegularMode(System.currentTimeMillis())
+ val regMaps = regSched.regularMatchSetting.vsStages
+ val regMap1 = regMaps[0]
+ val regMap2 = regMaps[1]
+
+ val serSched = Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis())
+ val serMaps = serSched.bankaraMatchSettings!!.first().vsStages
+ val serMap1 = serMaps[0]
+ val serMap2 = serMaps[1]
+
+ val opnSched = Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis())
+ val opnMaps = opnSched.bankaraMatchSettings!!.last().vsStages
+ val opnMap1 = opnMaps[0]
+ val opnMap2 = opnMaps[1]
+
+ val xSched = Splatoon3ApiDataGrabber.getXMode(System.currentTimeMillis())
+ val xMaps = xSched.xMatchSetting.vsStages
+ val xMap1 = xMaps[0]
+ val xMap2 = xMaps[1]
+
+ val salSched = Splatoon3ApiDataGrabber.getSalmonRun(System.currentTimeMillis())
+ val salMap = salSched.setting.coopStage.name
+ val salBoss = salSched.setting.boss.name
+ val salWeapons = salSched.setting.weapons
+
+ this.respond {
+ this.embed {
+ this.author {
+ this.name = "Current rotation for"
+ }
+ this.title = "All Modes"
+ this.description = "[[Open on website](https://splatoon3.ink/)]"
+ this.color = Color(0x1437FF)
+
+ this.thumbnail {
+ this.url = "https://static.moonleay.net/img/lilJudd/deepcut.png"
+ }
+
+ this.field {
+ this.name = "Regular (${
+ TimeUtil.getTimeFromJSONTime(
+ regSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(regSched.endTime, "UTC")})"
+ this.value =
+ "${regSched.regularMatchSetting.vsRule.name} on ${regMap1.name} & ${regMap2.name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "Series (${
+ TimeUtil.getTimeFromJSONTime(
+ serSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(serSched.endTime, "UTC")})"
+ this.value =
+ "${serSched.bankaraMatchSettings.first().vsRule.name} on ${serMap1.name} & ${serMap2.name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "Open (${
+ TimeUtil.getTimeFromJSONTime(
+ opnSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(opnSched.endTime, "UTC")})"
+ this.value =
+ "${opnSched.bankaraMatchSettings.last().vsRule.name} on ${opnMap1.name} & ${opnMap2.name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "X (${
+ TimeUtil.getTimeFromJSONTime(
+ xSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(xSched.endTime, "UTC")})"
+ this.value = "${xSched.xMatchSetting.vsRule.name} on ${xMap1.name} & ${xMap2.name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "Salmon Run (${
+ TimeUtil.getTimeFromJSONTimeLong(
+ salSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTimeLong(salSched.endTime, "UTC")})"
+ this.value =
+ "${salBoss} on ${salMap} with ${salWeapons[0].name}, ${salWeapons[1].name}, ${salWeapons[2].name} & ${salWeapons[3].name}"
+ this.inline = false
+ }
+
+ this.timestamp = Clock.System.now()
+ this.footer {
+ this.text = "Data provided by splatoon3.ink"
+ this.icon = "https://fedi.splatoon3.ink/favicon.png"
+ }
+
+ }
+ }
+ }
+
+ SplatoonOnlineMode.REGULAR -> {
+ val regSched = Splatoon3ApiDataGrabber.getRegularMode(System.currentTimeMillis())
+ val regMaps = regSched.regularMatchSetting.vsStages
+ val regMap1 = regMaps[0]
+ val regMap2 = regMaps[1]
+
+ val regSched2 =
+ Splatoon3ApiDataGrabber.getRegularMode(System.currentTimeMillis() + 1000 * 60 * 60 * 2)
+ val regMaps2 = regSched2.regularMatchSetting.vsStages
+ val regMap12 = regMaps2[0]
+ val regMap22 = regMaps2[1]
+
+ this.respond {
+ this.embed {
+ this.author {
+ this.name = "Current rotation for"
+ }
+ this.title = "Regular Mode"
+ this.description = "[[Open on website](https://splatoon3.ink/)]"
+ this.color = Color(0x18c81b)
+
+ this.thumbnail {
+ this.url = "https://static.moonleay.net/img/lilJudd/regular.png"
+ }
+
+ this.field {
+ this.name = "Current (${
+ TimeUtil.getTimeFromJSONTime(
+ regSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(regSched.endTime, "UTC")})"
+ this.value =
+ "${regSched.regularMatchSetting.vsRule.name} on ${regMap1.name} & ${regMap2.name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "${
+ TimeUtil.getTimeFromJSONTime(
+ regSched2.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(regSched2.endTime, "UTC")}"
+ this.value =
+ "${regSched2.regularMatchSetting.vsRule.name} on ${regMap12.name} & ${regMap22.name}"
+ this.inline = false
+ }
+
+
+ this.timestamp = Clock.System.now()
+ this.footer {
+ this.text = "Data provided by splatoon3.ink"
+ this.icon = "https://fedi.splatoon3.ink/favicon.png"
+ }
+
+ }
+ }
+ }
+
+ SplatoonOnlineMode.SERIES -> {
+ val serSched = Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis())
+ val serMaps = serSched.bankaraMatchSettings!!.first().vsStages
+ val serMap1 = serMaps[0]
+ val serMap2 = serMaps[1]
+
+ val serSched2 =
+ Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis() + 1000 * 60 * 60 * 2)
+ val serMaps2 = serSched2.bankaraMatchSettings!!.first().vsStages
+ val serMap12 = serMaps2[0]
+ val serMap22 = serMaps2[1]
+
+ this.respond {
+ this.embed {
+ this.author {
+ this.name = "Current rotation for"
+ }
+ this.title = "Ranked Series Mode"
+ this.description = "[[Open on website](https://splatoon3.ink/)]"
+ this.color = Color(0xE14412)
+
+ this.thumbnail {
+ this.url = "https://static.moonleay.net/img/lilJudd/bankara.png"
+ }
+
+ this.field {
+ this.name = "Current (${
+ TimeUtil.getTimeFromJSONTime(
+ serSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(serSched.endTime, "UTC")})"
+ this.value =
+ "${serSched.bankaraMatchSettings.first().vsRule.name} on ${serMap1.name} & ${serMap2.name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "${
+ TimeUtil.getTimeFromJSONTime(
+ serSched2.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(serSched2.endTime, "UTC")}"
+ this.value =
+ "${serSched2.bankaraMatchSettings.first().vsRule.name} on ${serMap12.name} & ${serMap22.name}"
+ this.inline = false
+ }
+
+
+ this.timestamp = Clock.System.now()
+ this.footer {
+ this.text = "Data provided by splatoon3.ink"
+ this.icon = "https://fedi.splatoon3.ink/favicon.png"
+ }
+
+ }
+ }
+ }
+
+ SplatoonOnlineMode.OPEN -> {
+ val opnSched = Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis())
+ val opnMaps = opnSched.bankaraMatchSettings!!.last().vsStages
+ val opnMap1 = opnMaps[0]
+ val opnMap2 = opnMaps[1]
+
+ val opnSched2 =
+ Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis() + 1000 * 60 * 60 * 2)
+ val opnMaps2 = opnSched2.bankaraMatchSettings!!.last().vsStages
+ val opnMap12 = opnMaps2[0]
+ val opnMap22 = opnMaps2[1]
+
+ this.respond {
+ this.embed {
+ this.author {
+ this.name = "Current rotation for"
+ }
+ this.title = "Ranked Open Mode"
+ this.description = "[[Open on website](https://splatoon3.ink/)]"
+ this.color = Color(0xE14412)
+
+ this.thumbnail {
+ this.url = "https://static.moonleay.net/img/lilJudd/bankara.png"
+ }
+
+ this.field {
+ this.name = "Current (${
+ TimeUtil.getTimeFromJSONTime(
+ opnSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(opnSched.endTime, "UTC")})"
+ this.value =
+ "${opnSched.bankaraMatchSettings.last().vsRule.name} on ${opnMap1.name} & ${opnMap2.name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "${
+ TimeUtil.getTimeFromJSONTime(
+ opnSched2.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(opnSched2.endTime, "UTC")}"
+ this.value =
+ "${opnSched2.bankaraMatchSettings.last().vsRule.name} on ${opnMap12.name} & ${opnMap22.name}"
+ this.inline = false
+ }
+
+
+ this.timestamp = Clock.System.now()
+ this.footer {
+ this.text = "Data provided by splatoon3.ink"
+ this.icon = "https://fedi.splatoon3.ink/favicon.png"
+ }
+
+ }
+ }
+ }
+
+ SplatoonOnlineMode.X -> {
+ val xSched = Splatoon3ApiDataGrabber.getXMode(System.currentTimeMillis())
+ val xMaps = xSched.xMatchSetting.vsStages
+ val xMap1 = xMaps[0]
+ val xMap2 = xMaps[1]
+
+ val xSched2 = Splatoon3ApiDataGrabber.getXMode(System.currentTimeMillis() + 1000 * 60 * 60 * 2)
+ val xMaps2 = xSched2.xMatchSetting.vsStages
+ val xMap12 = xMaps2[0]
+ val xMap22 = xMaps2[1]
+
+ this.respond {
+ this.embed {
+ this.author {
+ this.name = "Current rotation for"
+ }
+ this.title = "X Mode"
+ this.description = "[[Open on website](https://splatoon3.ink/)]"
+ this.color = Color(0x0ECB93)
+
+ this.thumbnail {
+ this.url = "https://static.moonleay.net/img/lilJudd/x.png"
+ }
+
+ this.field {
+ this.name = "Current (${
+ TimeUtil.getTimeFromJSONTime(
+ xSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(xSched.endTime, "UTC")})"
+ this.value = "${xSched.xMatchSetting.vsRule.name} on ${xMap1.name} & ${xMap2.name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "${
+ TimeUtil.getTimeFromJSONTime(
+ xSched2.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTime(xSched2.endTime, "UTC")}"
+ this.value =
+ "${xSched2.xMatchSetting.vsRule.name} on ${xMap12.name} & ${xMap22.name}"
+ this.inline = false
+ }
+
+
+ this.timestamp = Clock.System.now()
+ this.footer {
+ this.text = "Data provided by splatoon3.ink"
+ this.icon = "https://fedi.splatoon3.ink/favicon.png"
+ }
+
+ }
+ }
+ }
+
+ SplatoonOnlineMode.SALMON_RUN -> {
+ val salSched = Splatoon3ApiDataGrabber.getSalmonRun(System.currentTimeMillis())
+ val salMap = salSched.setting.coopStage.name
+ val salBoss = salSched.setting.boss.name
+ val salWeapons = salSched.setting.weapons
+
+ val salSched2 =
+ Splatoon3ApiDataGrabber.getSalmonRun(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 2)
+ val salMap2 = salSched2.setting.coopStage.name
+ val salBoss2 = salSched2.setting.boss.name
+ val salWeapons2 = salSched2.setting.weapons
+
+ this.respond {
+ this.embed {
+ this.author {
+ this.name = "Current rotation for"
+ }
+ this.title = "Salmon Run"
+ this.description = "[[Open on website](https://splatoon3.ink/salmonrun)]"
+ this.color = Color(0xEA4F03)
+
+ this.thumbnail {
+ this.url = "https://static.moonleay.net/img/lilJudd/grizz.png"
+ }
+
+ this.field {
+ this.name = "Current (${
+ TimeUtil.getTimeFromJSONTimeLong(
+ salSched.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTimeLong(salSched.endTime, "UTC")})"
+ this.value =
+ "${salBoss} on ${salMap} with ${salWeapons[0].name}, ${salWeapons[1].name}, ${salWeapons[2].name} & ${salWeapons[3].name}"
+ this.inline = false
+ }
+
+ this.field {
+ this.name = "${
+ TimeUtil.getTimeFromJSONTimeLong(
+ salSched2.startTime,
+ "UTC"
+ )
+ } - ${TimeUtil.getTimeFromJSONTimeLong(salSched2.endTime, "UTC")}"
+ this.value =
+ "${salBoss2} on ${salMap2} with ${salWeapons2[0].name}, ${salWeapons2[1].name}, ${salWeapons2[2].name} & ${salWeapons2[3].name}"
+ this.inline = false
+ }
+
+
+ this.timestamp = Clock.System.now()
+ this.footer {
+ this.text = "Data provided by splatoon3.ink"
+ this.icon = "https://fedi.splatoon3.ink/favicon.png"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ inner class RotationArguments : Arguments() {
+
+ val mode by enumChoice {
+ this.name = "mode"
+ this.description = "The mode you want to check the rotation for"
+ this.typeName = "en_US"
+ }
+ }
+
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/extensions/SendPlannerExtension.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/SendPlannerExtension.kt
new file mode 100644
index 0000000..a2d98dc
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/SendPlannerExtension.kt
@@ -0,0 +1,145 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.extensions
+
+import com.kotlindiscord.kord.extensions.extensions.Extension
+import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
+import com.kotlindiscord.kord.extensions.utils.hasPermission
+import dev.kord.common.entity.Permission
+import dev.kord.core.behavior.channel.createMessage
+import dev.kord.rest.builder.message.actionRow
+import dev.kord.rest.builder.message.embed
+import kotlinx.coroutines.delay
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData
+import net.moonleay.liljudd.data.database.repository.TimePlanningMessagesRepository
+import net.moonleay.liljudd.util.*
+import java.time.ZoneId
+import java.time.ZonedDateTime
+
+/* This extension has no proper use.
+ It is used in testing to test stuff, without having to wait for certain events to trigger. */
+class SendPlannerExtension : Extension() {
+ override val name = "sendplanner"
+ override val allowApplicationCommandInDMs: Boolean
+ get() = false
+
+ override suspend fun setup() {
+ publicSlashCommand {
+ name = "sendplanner"
+ description = "Send the planner for the current week"
+ this.action {
+ if (!this.member!!.asMember(this.guild!!.id)
+ .hasPermission(Permission.Administrator)
+ ) {
+ val res = this.respond {
+ this.embed {
+ this.color = EmbedColor.ERROR.color
+ this.title = "401: Not Authorized"
+ this.description =
+ "You need the Administrator permission to use this command."
+ this.footer {
+ this.icon = user.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(user)
+ }
+ }
+ }
+ res.delete()
+ return@action
+ }
+ val res = this.respond {
+ this.embed {
+ this.color = EmbedColor.INFO.color
+ this.title = "200: Success"
+ this.description = "Sending the planner.\n" +
+ "This may take a while, please be patient."
+ this.footer {
+ this.icon = user.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(user)
+ }
+ }
+ }
+ res.delete() // Delete the response
+ val c = this.getChannel().asChannel()
+ var msgStr = ""
+ var then =
+ ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withDayOfMonth(TimeUtil.getMondayDayOfMonth())
+ .withHour(4)
+ .withMinute(0).withSecond(0)
+ c.createMessage {
+ this.embed {
+ this.color = EmbedColor.INFO.color
+ this.title = "Time Planning Feature"
+ this.description = "Do you have time on the following Days?"
+ this.footer {
+ this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter()
+ }
+ }
+ }
+ delay(1000)
+ repeat(7) {
+ val eb = MessageUtil.getEmbedWithTable(
+ EmbedColor.INFO,
+ "",
+ "${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
+ mapOf(
+ "Is available" to listOf(),
+ "May be available" to listOf(),
+ "Is not available" to listOf()
+ )
+ )
+
+ val msg = c.createMessage {
+ this.embed {
+ this.color = eb.color
+ this.title = eb.title
+ this.description = eb.description
+ this.fields = eb.fields
+ this.footer {
+ this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter()
+ }
+ }
+
+ this.actionRow {
+ this.components.addAll(EmbedUtil.getTimePlannerButtons().components)
+ }
+ }
+ msgStr += "${it}:${msg.id.value};"
+ then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0)
+ Logger.out("Finished sending day $it/ This was manually triggered")
+ delay(1000)
+ }
+
+ // Save the message ids
+ TimePlanningMessagesRepository.write(
+ TimePlanningMessagesData(
+ -1,
+ c.data.guildId.value?.value!!.toLong(),
+ c.id.value.toLong(),
+ (TimeUtil.getWeekStamp().toEpochSecond()),
+ msgStr
+ )
+ )
+ Logger.out("Finished with ${c.data.guildId.value}")
+ }
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/UpdateRolesExtension.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/UpdateRolesExtension.kt
similarity index 50%
rename from src/main/kotlin/net/moonleay/lilJudd/extensions/UpdateRolesExtension.kt
rename to src/main/kotlin/net/moonleay/liljudd/extensions/UpdateRolesExtension.kt
index 109e3c7..7ffe5e9 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/UpdateRolesExtension.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/UpdateRolesExtension.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,46 +16,60 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.extensions
+package net.moonleay.liljudd.extensions
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 dev.kord.common.entity.Permission
-import dev.kord.gateway.PrivilegedIntent
-import net.moonleay.lilJudd.features.AvailabilityManager
-import net.moonleay.lilJudd.util.Logger
+import dev.kord.rest.builder.message.embed
+import net.moonleay.liljudd.features.AvailabilityManager
+import net.moonleay.liljudd.util.EmbedColor
+import net.moonleay.liljudd.util.Logger
+import net.moonleay.liljudd.util.MessageUtil
class UpdateRolesExtension : Extension() {
override val name = "updateroles"
override val allowApplicationCommandInDMs: Boolean
get() = false
- @OptIn(PrivilegedIntent::class)
override suspend fun setup() {
- publicSlashCommand() {
+ publicSlashCommand {
name = "updateroles"
description = "Update the roles of the members in the current server"
this.action {
if (!this.member!!.asMember(this.guild!!.id)
.hasPermission(Permission.Administrator)
) {
- val res = this.respond {
- this.content = "no."
+ this.respond {
+ this.embed {
+ this.color = EmbedColor.ERROR.color
+ this.title = "401: Not Authorized"
+ this.description =
+ "You need the Administrator permission to use this command."
+ this.footer {
+ this.icon = user.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(user)
+ }
+ }
}
- res.delete()
return@action
}
- val res = this.respond {
- this.content = "OK."
+ this.respond {
+ this.embed {
+ this.color = EmbedColor.INFO.color
+ this.title = "200: Success"
+ this.description = "Updating roles.\n" +
+ "This may take a while, please be patient."
+ this.footer {
+ this.icon = user.asUser().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter(user)
+ }
+ }
}
-
-
- // -- below here is the code of the cronjob --
Logger.out("Starting to update roles...")
- AvailabilityManager.runThread()
+ AvailabilityManager.updateInChannel(this.channel.id)
}
}
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/component/EnableOrDisable.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/component/EnableOrDisable.kt
similarity index 91%
rename from src/main/kotlin/net/moonleay/lilJudd/extensions/component/EnableOrDisable.kt
rename to src/main/kotlin/net/moonleay/liljudd/extensions/component/EnableOrDisable.kt
index 6d5e614..4cd9a92 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/component/EnableOrDisable.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/component/EnableOrDisable.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.extensions.component
+package net.moonleay.liljudd.extensions.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
diff --git a/src/main/kotlin/net/moonleay/lilJudd/extensions/component/MatchTypes.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/component/MatchTypes.kt
similarity index 92%
rename from src/main/kotlin/net/moonleay/lilJudd/extensions/component/MatchTypes.kt
rename to src/main/kotlin/net/moonleay/liljudd/extensions/component/MatchTypes.kt
index 3cde91b..cc60220 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/extensions/component/MatchTypes.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/component/MatchTypes.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.extensions.component
+package net.moonleay.liljudd.extensions.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
diff --git a/src/main/kotlin/net/moonleay/liljudd/extensions/component/SplatoonOnlineMode.kt b/src/main/kotlin/net/moonleay/liljudd/extensions/component/SplatoonOnlineMode.kt
new file mode 100644
index 0000000..92e587e
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/extensions/component/SplatoonOnlineMode.kt
@@ -0,0 +1,30 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.extensions.component
+
+import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
+
+enum class SplatoonOnlineMode(override val readableName: String) : ChoiceEnum {
+ ALL("All Modes"),
+ REGULAR("Regular Battle"),
+ SERIES("Ranked Battle (Series)"),
+ OPEN("Ranked Battle (Open)"),
+ X("X Battle"),
+ SALMON_RUN("Salmon Run"),
+}
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..e4d0441
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/features/AvailabilityManager.kt
@@ -0,0 +1,256 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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 com.kotlindiscord.kord.extensions.utils.isNullOrBot
+import dev.inmo.krontab.buildSchedule
+import dev.inmo.krontab.doInfinity
+import dev.kord.common.entity.Snowflake
+import dev.kord.core.behavior.UserBehavior
+import dev.kord.core.behavior.createRole
+import dev.kord.core.behavior.requestMembers
+import dev.kord.core.entity.channel.Channel
+import dev.kord.core.entity.channel.MessageChannel
+import dev.kord.gateway.PrivilegedIntent
+import dev.kord.rest.builder.message.EmbedBuilder
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.data.database.entry.PlanningNotifierRolesData
+import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData
+import net.moonleay.liljudd.data.database.repository.PlanningNotifierRolesRepository
+import net.moonleay.liljudd.data.database.repository.TimePlanningMessagesRepository
+import net.moonleay.liljudd.extensions.FeatureManageExtension
+import net.moonleay.liljudd.features.component.FeatureEnum
+import net.moonleay.liljudd.features.component.IFeature
+import net.moonleay.liljudd.util.*
+import java.time.ZonedDateTime
+
+object AvailabilityManager : IFeature {
+
+ // This runs during the cronjob.
+ suspend fun runThread() {
+ Logger.out("Updating match roles")
+
+ // ChannelID, Data
+ val messages = TimePlanningMessagesRepository.getWeek(TimeUtil.getWeekStamp().toEpochSecond())
+ .associateBy { it.channelID }
+ val targetedRoles = PlanningNotifierRolesRepository.getAll().associateBy { it.channelID }
+ if (targetedRoles.isEmpty()) {
+ Logger.out("No saved roles. Canceling.")
+ return
+ }
+
+ for (id in messages.keys) {
+ val snf = Snowflake(id) // snf = Snowflake
+ val data = messages[id]!! // this is the data of the table
+ if (Bot.bot.kordRef.getChannel(Snowflake(data.channelID)) == null) {
+ // This channel does not exist anymore.
+ Logger.out("Warning: Channel ${data.channelID} does not exist anymore. Skipping.")
+ continue
+ }
+ val roleData = targetedRoles[data.channelID] // Get the role data
+ if (roleData == null) {
+ Logger.out("Role for channel ${data.channelID} does not exist")
+ continue // this took way to long to find out that this was the issue
+ }
+ this.updateInChannel(snf, data, roleData)
+ }
+ Logger.out("Finished updating roles")
+ }
+
+ suspend fun updateInChannel(snf: Snowflake) {
+ val stamp = TimeUtil.getWeekStamp().toEpochSecond()
+ Logger.out("Weekstamp: $stamp")
+ val messageData = TimePlanningMessagesRepository.getWeekInChannel(
+ stamp,
+ snf.value.toLong()
+ )
+ if (messageData == null) {
+ Logger.out("Could not find data for channel ${snf.value}")
+ return
+ }
+ val roleData = PlanningNotifierRolesRepository.getForChannel(snf.value.toLong())
+ if (roleData == null) {
+ Logger.out("Role for channel ${messageData.channelID} does not exist")
+ return // this took way to long to find out that this was the issue
+ }
+ updateInChannel(snf, messageData, roleData)
+ }
+
+ @OptIn(PrivilegedIntent::class)
+ suspend fun updateInChannel(snf: Snowflake, tpmd: TimePlanningMessagesData, pnrd: PlanningNotifierRolesData) {
+ if (Bot.bot.kordRef.getChannel(snf) == null)
+ return // This channel does not exist anymore.
+ val c = Bot.bot.kordRef.getChannelOf(snf)!! // Get the channel as MessageChannel
+ val weekday = ZonedDateTime.now().dayOfWeek // The current week day
+ val weekStamp = TimeUtil.getWeekStamp().toEpochSecond() // The current week time stamp
+ Logger.out("It is week ${weekStamp} and day ${weekday}/${TimeUtil.getDayOfMonthInt(weekday)} of the week.")
+ val g = Bot.bot.kordRef.getGuild(Snowflake(tpmd.serverID))
+ // Get all members with the role
+ val mce = g.requestMembers {
+ this.requestAllMembers()
+ }
+ mce.collect { memberchunkevent ->
+ memberchunkevent.members.forEach {
+ if (!it.isNullOrBot()) { // Check if the member is a bot
+ Logger.out("Checking member ${it.id.value} (${it.username})")
+ if (it.roleIds.contains(Snowflake(pnrd.hasTimeRoleID))) {
+ it.removeRole(Snowflake(pnrd.hasTimeRoleID))
+ Logger.out("Removed role from ${it.username}") // Removed the role
+ }
+ }
+ // I cant use continue here, because it does not work with .forEach
+ }
+ }
+
+ 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 = tpmd.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.")
+ return // This message does not exist anymore. Nothing we can do about that.
+ }
+ if (message.data.embeds.isEmpty()) {
+ Logger.out("There are no embeds.")
+ return // 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(tpmd.serverID))!!
+ .getMemberOrNull(Snowflake(tid)) == null
+ )
+ continue// This member does not exist anymore.
+ val member = Bot.bot.kordRef.getGuild(Snowflake(tpmd.serverID))
+ .getMember(Snowflake(tid)) // Get the member
+ if (member.roleIds.contains(Snowflake(pnrd.hasTimeRoleID)))
+ continue // This member already has the role
+ member.addRole(Snowflake(pnrd.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
+ }
+ }
+
+ override val feat: FeatureEnum
+ get() = FeatureEnum.PLANNINGROLES
+
+ // Register the cronjob to run at 1AM UTC every day
+ override suspend fun registerThread() {
+ Logger.out("Registering daily planning message role update coroutine")
+ val scheduler = buildSchedule("0 0 2 * * *") // 0 0 4 * * * 0o 1w // 0o is UTC
+ scheduler.doInfinity {
+ this.runThread()
+ }
+ }
+
+ override suspend fun enable(
+ u: UserBehavior,
+ gID: Long,
+ cID: Long,
+ ch: Channel,
+ args: FeatureManageExtension.FeatureManagerArgs
+ ): EmbedBuilder {
+ val alreadyExists = PlanningNotifierRolesRepository.existsInChannel(cID)
+ // Check if the channel and guild already exist in the db
+ if (!alreadyExists) {
+ // Create the roles in Discord
+ val hasTimeRole = Bot.bot.kordRef.getGuild(Snowflake(gID)).createRole {
+ this.name = "available [${ch.data.name.value}]"
+ this.mentionable = true
+ }
+ val htr = hasTimeRole.id.value.toLong()
+
+ val wantsNotifsRole = Bot.bot.kordRef.getGuild(Snowflake(gID)).createRole {
+ this.name = "notifications [${ch.data.name.value}]"
+ this.mentionable = true
+ }
+ val wnr = wantsNotifsRole.id.value.toLong()
+
+ // Save the role ids to db
+ PlanningNotifierRolesRepository.write(
+ PlanningNotifierRolesData(
+ id = -1,
+ serverID = gID,
+ channelID = cID,
+ hasTimeRoleID = htr,
+ wantsToBeNotifiedID = wnr
+ )
+ )
+
+ return MessageUtil.getEmbed(
+ EmbedColor.SUCCESS,
+ "200: Success",
+ "The feature was enabled in channel ${args.channel.data.name.value} with roles ${hasTimeRole.mention} & ${wantsNotifsRole.mention}.",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ }
+
+ // They exist, do not add them
+ return MessageUtil.getEmbed(
+ EmbedColor.ERROR,
+ "403: Forbidden",
+ "The feature is already enabled in this channel.",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ }
+
+ override suspend fun disable(
+ u: UserBehavior,
+ gID: Long,
+ cID: Long,
+ ch: Channel,
+ args: FeatureManageExtension.FeatureManagerArgs
+ ): EmbedBuilder {
+ // Check if entry exists in db
+ if (PlanningNotifierRolesRepository.existsInChannelFromSever(cID, gID)) {
+ val entry = PlanningNotifierRolesRepository.getForChannelInServer(cID, gID)!!
+ // delete all entries for this guild and channel combo
+ Bot.bot.kordRef.getGuild(Snowflake(gID))
+ .getRoleOrNull(Snowflake(entry.hasTimeRoleID))?.delete()
+ Bot.bot.kordRef.getGuild(Snowflake(gID))
+ .getRoleOrNull(Snowflake(entry.wantsToBeNotifiedID))?.delete()
+
+ // delete all found entries
+ PlanningNotifierRolesRepository.delete(entry.id)
+ return MessageUtil.getEmbed(
+ EmbedColor.SUCCESS,
+ "200: Success",
+ "The feature was disabled.",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ }
+ // not in db, do nothing
+ return MessageUtil.getEmbed(
+ EmbedColor.ERROR,
+ "403: Forbidden",
+ "The feature is already disabled in this channel.",
+ u.asUser().username + "#" + u.asUser().discriminator
+ )
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/features/MatchManager.kt b/src/main/kotlin/net/moonleay/liljudd/features/MatchManager.kt
new file mode 100644
index 0000000..1bdeafe
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/features/MatchManager.kt
@@ -0,0 +1,64 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.kord.common.entity.Snowflake
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData
+import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
+import net.moonleay.liljudd.jobs.MatchJob
+import net.moonleay.liljudd.jobs.component.JobManager
+import net.moonleay.liljudd.util.Logger
+
+object MatchManager {
+ suspend fun update() {
+ Logger.out("Updating matches")
+ val dataList = MatchPlanningDataRepository.getAll()
+
+ for (data in dataList) {
+ Logger.out("Checking match role ${data.id}...")
+ if (data.timestamp < System.currentTimeMillis()) {
+ Logger.out("Match role ${data.id} is expired, removing...")
+ this.removeRoleFromGuild(data.serverID, data.roleID)
+ MatchPlanningDataRepository.delete(data.id)
+ continue
+ }
+ this.registerJob(data)
+ }
+ Logger.out("Finished updating matches")
+ }
+
+ private fun registerJob(data: MatchPlanningDataData) {
+ JobManager.addJob(
+ MatchJob(
+ data.jobString,
+ data.id,
+ "fromdb-${data.matchType}_Vs_${data.opponentName}_[${data.id}]-${data.serverID}_${data.channelID}"
+ )
+ )
+ Logger.out("Registered job for match ${data.id}...")
+ }
+
+ private suspend fun removeRoleFromGuild(gid: Long, rid: Long): Boolean {
+ val guild = Bot.bot.kordRef.getGuildOrNull(Snowflake(gid)) ?: return false
+ val role = guild.getRoleOrNull(Snowflake(rid)) ?: return false
+ role.delete()
+ return true
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/features/TimeManager.kt b/src/main/kotlin/net/moonleay/liljudd/features/TimeManager.kt
new file mode 100644
index 0000000..0496dff
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/features/TimeManager.kt
@@ -0,0 +1,206 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.UserBehavior
+import dev.kord.core.behavior.channel.createMessage
+import dev.kord.core.entity.channel.Channel
+import dev.kord.core.entity.channel.MessageChannel
+import dev.kord.rest.builder.message.EmbedBuilder
+import dev.kord.rest.builder.message.actionRow
+import dev.kord.rest.builder.message.embed
+import kotlinx.coroutines.delay
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.data.database.entry.TimePlanningChannelsData
+import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData
+import net.moonleay.liljudd.data.database.repository.PlanningNotifierRolesRepository
+import net.moonleay.liljudd.data.database.repository.TimePlanningChannelsRepository
+import net.moonleay.liljudd.data.database.repository.TimePlanningMessagesRepository
+import net.moonleay.liljudd.extensions.FeatureManageExtension
+import net.moonleay.liljudd.features.component.FeatureEnum
+import net.moonleay.liljudd.features.component.IFeature
+import net.moonleay.liljudd.util.EmbedColor
+import net.moonleay.liljudd.util.EmbedUtil
+import net.moonleay.liljudd.util.Logger
+import net.moonleay.liljudd.util.MessageUtil
+import java.time.ZoneId
+import java.time.ZonedDateTime
+
+
+object TimeManager : IFeature {
+ override val feat: FeatureEnum
+ get() = FeatureEnum.TIMEPLANNINGFEATURE
+
+ // Register the cronjob to run at 0:01 AM UTC every Monday
+ override suspend fun registerThread() {
+ Logger.out("Registering weekly planning message posting coroutine")
+ val scheduler = buildSchedule("0 0 1 * * * 0o 1w") // 0 0 4 * * * 0o 1w // 0o is UTC
+ scheduler.doInfinity {
+ this.runThread()
+ }
+ }
+
+ private suspend fun runThread() {
+ Logger.out("Starting to send out weekly planning messages")
+
+ // ChannelID -> Data
+ val targetedChannels = TimePlanningChannelsRepository.getAll().associateBy { it.channelID }
+ val targetedRoles = PlanningNotifierRolesRepository.getAll().associateBy { it.channelID }
+
+ lateinit var msgStr: String
+
+ Logger.out("${targetedChannels.count()} Channels to notify with ${targetedRoles.count()} Roles to ping!")
+ for (ch2 in targetedChannels.keys) {
+ val ch = Snowflake(ch2)
+ if (Bot.bot.kordRef.getChannel(ch) == null)
+ continue
+ val c = Bot.bot.kordRef.getChannelOf(ch)!!
+ msgStr = ""
+ if (targetedRoles != null && targetedRoles.keys.contains(ch2) && targetedRoles[ch2] != null) {
+ c.createMessage {
+ this.content =
+ "The weekly planning starts now <@&${Snowflake(targetedRoles[ch2]?.wantsToBeNotifiedID!!)}>"
+ this.embed {
+ this.color = EmbedColor.INFO.color
+ this.title = "Time Planning Feature"
+ this.description = "Do you have time on the following Days?"
+ this.footer {
+ this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter()
+ }
+ }
+ }
+ } else {
+ c.createMessage {
+ this.embed {
+ this.color = EmbedColor.INFO.color
+ this.title = "Time Planning Feature"
+ this.description = "Do you have time on the following Days?"
+ this.footer {
+ this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter()
+ }
+ }
+ }
+ }
+ delay(2000)
+ var then = ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withHour(4).withMinute(0).withSecond(0)
+ repeat(7) {
+ val eb = MessageUtil.getEmbedWithTable(
+ EmbedColor.INFO,
+ "",
+ "${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
+ mapOf(
+ "Is available" to listOf(),
+ "May be available" to listOf(),
+ "Is not available" to listOf()
+ )
+ )
+ val msg = c.createMessage {
+ this.embed {
+ this.color = eb.color
+ this.title = eb.title
+ this.description = eb.description
+ this.fields = eb.fields
+ this.footer {
+ this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl()
+ this.text = MessageUtil.getFooter()
+ }
+ }
+
+ this.actionRow {
+ this.components.addAll(EmbedUtil.getTimePlannerButtons().components)
+ }
+ }
+ msgStr += "${it}:${msg.id.value};"
+ then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0)
+ Logger.out("Finished sending day $it in $ch")
+
+ delay(1000)
+ }
+
+ // Save the message ids
+ TimePlanningMessagesRepository.write(
+ TimePlanningMessagesData(
+ id = -1,
+ serverID = c.data.guildId.value?.value!!.toLong(),
+ channelID = c.data.id.value.toLong(),
+ weekstamp = then.minusDays(7).toEpochSecond(),
+ messageIDs = msgStr
+ )
+ )
+ Logger.out("Finished with ${c.data.guildId.value}")
+ }
+ Logger.out("Done! Until next Monday! <3 ")
+ }
+
+ override suspend fun enable(
+ u: UserBehavior,
+ gID: Long,
+ cID: Long,
+ ch: Channel,
+ args: FeatureManageExtension.FeatureManagerArgs
+ ): EmbedBuilder {
+ if (!TimePlanningChannelsRepository.exists(cID, gID)) {
+ TimePlanningChannelsRepository.write(TimePlanningChannelsData(id = -1, serverID = gID, channelID = cID))
+ return MessageUtil.getEmbed(
+ EmbedColor.SUCCESS,
+ "200: Success",
+ "The feature was enabled in channel ${args.channel.data.name.value}",
+ u.asUser().username
+ )
+ }
+ return MessageUtil.getEmbed(
+ EmbedColor.ERROR,
+ "409: Conflict",
+ "The feature is already enabled in this channel.",
+ u.asUser().username
+ )
+ }
+
+ override suspend fun disable(
+ u: UserBehavior,
+ gID: Long,
+ cID: Long,
+ ch: Channel,
+ args: FeatureManageExtension.FeatureManagerArgs
+ ): EmbedBuilder {
+ // Check if entry exists in db
+ if (TimePlanningChannelsRepository.exists(cID, gID)) {
+ // delete all entries for this channel
+ TimePlanningChannelsRepository.deleteFromChannelInServer(cID, gID)
+ return MessageUtil.getEmbed(
+ EmbedColor.SUCCESS,
+ "200: Success",
+ "The feature was disabled.",
+ u.asUser().username
+ )
+ }
+ // Do nothing; not in db
+ return MessageUtil.getEmbed(
+ EmbedColor.ERROR,
+ "409: Conflict",
+ "The feature is already disabled in this channel.",
+ u.asUser().username
+ )
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureEnum.kt b/src/main/kotlin/net/moonleay/liljudd/features/component/FeatureEnum.kt
similarity index 92%
rename from src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureEnum.kt
rename to src/main/kotlin/net/moonleay/liljudd/features/component/FeatureEnum.kt
index 8b3a0a8..b06fc3b 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureEnum.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/features/component/FeatureEnum.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.features.component
+package net.moonleay.liljudd.features.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
diff --git a/src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureManager.kt b/src/main/kotlin/net/moonleay/liljudd/features/component/FeatureManager.kt
similarity index 82%
rename from src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureManager.kt
rename to src/main/kotlin/net/moonleay/liljudd/features/component/FeatureManager.kt
index d380d9c..a9212b4 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/features/component/FeatureManager.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/features/component/FeatureManager.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,10 +16,10 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.features.component
+package net.moonleay.liljudd.features.component
-import net.moonleay.lilJudd.features.AvailabilityManager
-import net.moonleay.lilJudd.features.TimeManager
+import net.moonleay.liljudd.features.AvailabilityManager
+import net.moonleay.liljudd.features.TimeManager
object FeatureManager {
val features = mutableListOf(AvailabilityManager, TimeManager) // Stores all features
diff --git a/src/main/kotlin/net/moonleay/lilJudd/features/component/IFeature.kt b/src/main/kotlin/net/moonleay/liljudd/features/component/IFeature.kt
similarity index 84%
rename from src/main/kotlin/net/moonleay/lilJudd/features/component/IFeature.kt
rename to src/main/kotlin/net/moonleay/liljudd/features/component/IFeature.kt
index aa27536..77170f3 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/features/component/IFeature.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/features/component/IFeature.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,12 +16,12 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.features.component
+package net.moonleay.liljudd.features.component
import dev.kord.core.behavior.UserBehavior
import dev.kord.core.entity.channel.Channel
import dev.kord.rest.builder.message.EmbedBuilder
-import net.moonleay.lilJudd.extensions.FeatureManageExtension
+import net.moonleay.liljudd.extensions.FeatureManageExtension
interface IFeature {
val feat: FeatureEnum
@@ -29,16 +29,16 @@ interface IFeature {
suspend fun enable(
u: UserBehavior,
- gID: String,
- cID: String,
+ gID: Long,
+ cID: Long,
ch: Channel,
args: FeatureManageExtension.FeatureManagerArgs
): EmbedBuilder
suspend fun disable(
u: UserBehavior,
- gID: String,
- cID: String,
+ gID: Long,
+ cID: Long,
ch: Channel,
args: FeatureManageExtension.FeatureManagerArgs
): EmbedBuilder
diff --git a/src/main/kotlin/net/moonleay/lilJudd/jobs/MatchJob.kt b/src/main/kotlin/net/moonleay/liljudd/jobs/MatchJob.kt
similarity index 51%
rename from src/main/kotlin/net/moonleay/lilJudd/jobs/MatchJob.kt
rename to src/main/kotlin/net/moonleay/liljudd/jobs/MatchJob.kt
index 394758a..130e304 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/jobs/MatchJob.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/jobs/MatchJob.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,22 +16,17 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.jobs
+package net.moonleay.liljudd.jobs
import dev.inmo.krontab.KronScheduler
import dev.kord.common.entity.Snowflake
import kotlinx.coroutines.Job
-import net.moonleay.lilJudd.Bot
-import net.moonleay.lilJudd.data.entry.MatchPlanningDataData
-import net.moonleay.lilJudd.data.tables.MatchPlanningData
-import net.moonleay.lilJudd.jobs.component.CronjobType
-import net.moonleay.lilJudd.jobs.component.ICronjob
-import net.moonleay.lilJudd.jobs.component.JobManager
-import net.moonleay.lilJudd.util.Logger
-import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
-import org.jetbrains.exposed.sql.deleteWhere
-import org.jetbrains.exposed.sql.select
-import org.jetbrains.exposed.sql.transactions.transaction
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
+import net.moonleay.liljudd.jobs.component.CronjobType
+import net.moonleay.liljudd.jobs.component.ICronjob
+import net.moonleay.liljudd.jobs.component.JobManager
+import net.moonleay.liljudd.util.Logger
class MatchJob(
override val jobIncoming: String,
@@ -48,41 +43,19 @@ class MatchJob(
* */
override suspend fun jobFunction() {
Logger.out("Running MatchJob \"${this.jobName}\"")
- lateinit var mpdd: MatchPlanningDataData
- transaction {
- for (pnr in MatchPlanningData.select {
- MatchPlanningData.id eq (tableId)
- }) {
- mpdd = MatchPlanningDataData(
- pnr[MatchPlanningData.id].value,
- pnr[MatchPlanningData.serverid],
- pnr[MatchPlanningData.channelid],
- pnr[MatchPlanningData.matchtype],
- pnr[MatchPlanningData.registererid],
- pnr[MatchPlanningData.roleid],
- pnr[MatchPlanningData.opponentName],
- pnr[MatchPlanningData.messageid],
- pnr[MatchPlanningData.timestamp],
- pnr[MatchPlanningData.jobstr]
- )
- }
- }
- val guild = Bot.bot.kordRef.getGuildOrNull(Snowflake(mpdd.serverid))
+ val mpdd = MatchPlanningDataRepository.get(tableId)!!
+ val guild = Bot.bot.kordRef.getGuildOrNull(Snowflake(mpdd.serverID))
if (guild == null) {
Logger.out("Guild not found.")
return
}
- val r = guild.getRoleOrNull(Snowflake(mpdd.roleid))
+ val r = guild.getRoleOrNull(Snowflake(mpdd.roleID))
if (r == null) {
Logger.out("Role not found.")
return
}
r.delete()
- transaction {
- MatchPlanningData.deleteWhere {
- MatchPlanningData.id eq (tableId)
- }
- }
+ MatchPlanningDataRepository.delete(tableId)
Logger.out("MatchJob \"${this.jobName}\" finished.")
Logger.out("Killing job \"${this.jobName}\"..")
JobManager.killJob(this)
diff --git a/src/main/kotlin/net/moonleay/liljudd/jobs/Splatoon3ApiScheduleUpdateScheduler.kt b/src/main/kotlin/net/moonleay/liljudd/jobs/Splatoon3ApiScheduleUpdateScheduler.kt
new file mode 100644
index 0000000..b5701c0
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/jobs/Splatoon3ApiScheduleUpdateScheduler.kt
@@ -0,0 +1,45 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.jobs
+
+import dev.inmo.krontab.KronScheduler
+import kotlinx.coroutines.Job
+import net.moonleay.liljudd.data.api.splatoon3ink.Splatoon3Api
+import net.moonleay.liljudd.jobs.component.CronjobType
+import net.moonleay.liljudd.jobs.component.ICronjob
+import net.moonleay.liljudd.util.Logger
+
+object Splatoon3ApiScheduleUpdateScheduler : ICronjob {
+ override val jobName: String
+ get() = "Splatoon3ApiScheduleUpdateScheduler"
+ override val jobIncoming: String
+ get() = "0 0 /1 * * * 0o *" //Every hour
+ override val jobType: CronjobType
+ get() = CronjobType.INFINITE
+ override val continueJob: Boolean
+ get() = true
+ override lateinit var cronjobJob: Job
+ override lateinit var scheduler: KronScheduler
+
+ override suspend fun jobFunction() {
+ Logger.out("Updating Schedules...")
+ Splatoon3Api.updateSchedule()
+ Logger.out("Updating finished.")
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/jobs/StatusUpdater.kt b/src/main/kotlin/net/moonleay/liljudd/jobs/StatusUpdater.kt
new file mode 100644
index 0000000..fdb421b
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/jobs/StatusUpdater.kt
@@ -0,0 +1,66 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.jobs
+
+import dev.inmo.krontab.KronScheduler
+import dev.kord.common.entity.PresenceStatus
+import kotlinx.coroutines.Job
+import net.moonleay.liljudd.Bot
+import net.moonleay.liljudd.data.api.splatoon3ink.Splatoon3ApiDataGrabber
+import net.moonleay.liljudd.jobs.component.CronjobType
+import net.moonleay.liljudd.jobs.component.ICronjob
+
+object StatusUpdater : ICronjob {
+ override val jobName: String
+ get() = "StatusUpdater"
+ override val jobIncoming: String
+ get() = "/30 * * * * * 0o *" //Every 30 seconds
+ override val jobType: CronjobType
+ get() = CronjobType.INFINITE
+ override val continueJob: Boolean
+ get() = true
+ override lateinit var cronjobJob: Job
+ override lateinit var scheduler: KronScheduler
+
+ private var statusList = listOf()
+ private var index = 0
+
+ // I h8 this cronjob. I'll recode this someday.
+ override suspend fun jobFunction() {
+ if (index >= statusList.size) {
+ index = 0
+ refreshStatusList(System.currentTimeMillis())
+ }
+ Bot.bot.kordRef.editPresence {
+ this.status = PresenceStatus.DoNotDisturb
+ this.competing(statusList[index])
+ }
+ ++index
+ }
+
+ private fun refreshStatusList(timestamp: Long) {
+ statusList = listOf(
+ Splatoon3ApiDataGrabber.getRotationTime(timestamp),
+ Splatoon3ApiDataGrabber.getRegularMapsFormatted(timestamp),
+ Splatoon3ApiDataGrabber.getOpenMapFormatted(timestamp),
+ Splatoon3ApiDataGrabber.getSeriesMapsFormatted(timestamp),
+ Splatoon3ApiDataGrabber.getXMapFormatted(timestamp)
+ )
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/jobs/component/CronjobType.kt b/src/main/kotlin/net/moonleay/liljudd/jobs/component/CronjobType.kt
similarity index 90%
rename from src/main/kotlin/net/moonleay/lilJudd/jobs/component/CronjobType.kt
rename to src/main/kotlin/net/moonleay/liljudd/jobs/component/CronjobType.kt
index fa34b60..fa1992b 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/jobs/component/CronjobType.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/jobs/component/CronjobType.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.jobs.component
+package net.moonleay.liljudd.jobs.component
enum class CronjobType {
INFINITE,
diff --git a/src/main/kotlin/net/moonleay/lilJudd/jobs/component/ICronjob.kt b/src/main/kotlin/net/moonleay/liljudd/jobs/component/ICronjob.kt
similarity index 94%
rename from src/main/kotlin/net/moonleay/lilJudd/jobs/component/ICronjob.kt
rename to src/main/kotlin/net/moonleay/liljudd/jobs/component/ICronjob.kt
index d3f6700..8e3f946 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/jobs/component/ICronjob.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/jobs/component/ICronjob.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.jobs.component
+package net.moonleay.liljudd.jobs.component
import dev.inmo.krontab.KronScheduler
import kotlinx.coroutines.Job
diff --git a/src/main/kotlin/net/moonleay/lilJudd/jobs/component/JobManager.kt b/src/main/kotlin/net/moonleay/liljudd/jobs/component/JobManager.kt
similarity index 96%
rename from src/main/kotlin/net/moonleay/lilJudd/jobs/component/JobManager.kt
rename to src/main/kotlin/net/moonleay/liljudd/jobs/component/JobManager.kt
index cc55256..ce62d1c 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/jobs/component/JobManager.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/jobs/component/JobManager.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.jobs.component
+package net.moonleay.liljudd.jobs.component
import dev.inmo.krontab.buildSchedule
import dev.inmo.krontab.doInfinityTz
@@ -25,7 +25,7 @@ import dev.inmo.krontab.doWhileTz
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
-import net.moonleay.lilJudd.util.Logger
+import net.moonleay.liljudd.util.Logger
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/tables/TimePlanningChannels.kt b/src/main/kotlin/net/moonleay/liljudd/util/EmbedColor.kt
similarity index 72%
rename from src/main/kotlin/net/moonleay/lilJudd/data/tables/TimePlanningChannels.kt
rename to src/main/kotlin/net/moonleay/liljudd/util/EmbedColor.kt
index a746aa1..7d9def4 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/data/tables/TimePlanningChannels.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/util/EmbedColor.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,11 +16,13 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.data.tables
+package net.moonleay.liljudd.util
-import org.jetbrains.exposed.dao.id.IntIdTable
+import dev.kord.common.Color
-object TimePlanningChannels : IntIdTable() {
- var serverid = varchar("serverid", 50)
- val channelid = varchar("channelid", 50)
+enum class EmbedColor(val color: Color) {
+ ERROR(Color(0xE0311A)),
+ WARNING(Color(0xFFA500)),
+ SUCCESS(Color(0x52E01A)),
+ INFO(Color(0x4C4645)),
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/util/EmbedUtil.kt b/src/main/kotlin/net/moonleay/liljudd/util/EmbedUtil.kt
similarity index 75%
rename from src/main/kotlin/net/moonleay/lilJudd/util/EmbedUtil.kt
rename to src/main/kotlin/net/moonleay/liljudd/util/EmbedUtil.kt
index d367709..f109ed3 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/util/EmbedUtil.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/util/EmbedUtil.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.util
+package net.moonleay.liljudd.util
import dev.kord.common.entity.ButtonStyle
import dev.kord.core.entity.Embed
@@ -41,17 +41,26 @@ object EmbedUtil {
fun getMatchButtons(): ActionRowBuilder {
val ar = ActionRowBuilder()
ar.interactionButton(ButtonStyle.Success, "public.edit.btn.matchmanagement.accept") {
- this.label = "Sign me up!"
+ this.label = "I'm in!"
}
- ar.interactionButton(ButtonStyle.Danger, "public.edit.btn.matchmanagement.cancel") {
- this.label = "Cancel"
+ ar.interactionButton(ButtonStyle.Danger, "public.edit.btn.matchmanagement.decline") {
+ this.label = "I'm out!"
}
+ /*
+ ar.interactionButton(ButtonStyle.Secondary, "public.edit.btn.matchmanagement.cancel") {
+ this.label = "Cancel this match..."
+ } */
return ar
}
fun replaceXWithYinValuesAtTable(x: String, y: String, e: Embed, table: Int): EmbedBuilder {
- val ebb = MessageUtil.getAClonedEmbedd(e)
- for ((i, f) in e.fields.withIndex()) {
+ return replaceXWithYinValuesAtTable(x, y, MessageUtil.getAClonedEmbed(e), table)
+ }
+
+ fun replaceXWithYinValuesAtTable(x: String, y: String, ebb: EmbedBuilder, table: Int): EmbedBuilder {
+ val ebbb = MessageUtil.getAClonedEmbed(ebb)
+ ebbb.fields = mutableListOf()
+ for ((i, f) in ebb.fields.withIndex()) {
val fb = EmbedBuilder.Field()
fb.name = f.name
if (i == table - 1) {
@@ -66,14 +75,14 @@ object EmbedUtil {
} else
fb.value = f.value
fb.inline = true
- ebb.fields.add(fb)
+ ebbb.fields.add(fb)
}
- return ebb
+ return ebbb
}
fun getAllUsersInTheFirstXTables(amountOfTables: Int, e: Embed): List {
val users = mutableListOf()
- for (i in 0 until amountOfTables - 1) {
+ for (i in 0 until amountOfTables) {
val f = e.fields[i]
if (!f.value.contains("@"))
continue // check next one. this one does not have any entries
@@ -87,8 +96,13 @@ object EmbedUtil {
}
fun addXToValuesAtTable(x: String, e: Embed, table: Int): EmbedBuilder {
- val ebb = MessageUtil.getAClonedEmbedd(e)
- for ((i, f) in e.fields.withIndex()) {
+ return addXToValuesAtTable(x, MessageUtil.getAClonedEmbed(e), table)
+ }
+
+ fun addXToValuesAtTable(x: String, ebb: EmbedBuilder, table: Int): EmbedBuilder {
+ val ebbb = MessageUtil.getAClonedEmbed(ebb)
+ ebbb.fields = mutableListOf()
+ ebb.fields.forEachIndexed { i, f ->
val fb = EmbedBuilder.Field()
fb.name = f.name
if (i == table - 1)
@@ -105,9 +119,9 @@ object EmbedUtil {
}
fb.inline = true
- ebb.fields.add(fb)
+ ebbb.fields.add(fb)
}
- return ebb
+ return ebbb
}
}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/util/Logger.kt b/src/main/kotlin/net/moonleay/liljudd/util/Logger.kt
similarity index 95%
rename from src/main/kotlin/net/moonleay/lilJudd/util/Logger.kt
rename to src/main/kotlin/net/moonleay/liljudd/util/Logger.kt
index 446609c..25a5804 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/util/Logger.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/util/Logger.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.util
+package net.moonleay.liljudd.util
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
diff --git a/src/main/kotlin/net/moonleay/liljudd/util/MessageUtil.kt b/src/main/kotlin/net/moonleay/liljudd/util/MessageUtil.kt
new file mode 100644
index 0000000..f531dd0
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/util/MessageUtil.kt
@@ -0,0 +1,132 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.util
+
+import dev.kord.core.behavior.UserBehavior
+import dev.kord.core.entity.Embed
+import dev.kord.rest.builder.message.EmbedBuilder
+import java.time.LocalDateTime
+import java.time.format.DateTimeFormatter
+
+object MessageUtil {
+ private val dtf: DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy @ HH:mm:ss")
+
+ suspend fun getFooter(u: UserBehavior? = null): String {
+ val now: LocalDateTime = LocalDateTime.now()
+ return ">" + dtf.format(now) + " - ${u?.asUser()?.username ?: "Automated Message"}"
+ }
+
+ ///Get a cloned embedded message
+ fun getAClonedEmbed(e: Embed): EmbedBuilder {
+ val ebb = EmbedBuilder()
+ ebb.color = e.color
+ ebb.title = e.title
+ ebb.author {
+ this.icon = e.author?.url
+ this.name = e.author?.name.toString()
+ this.url = e.author?.url
+ }
+ e.fields.forEach {
+ val fb = EmbedBuilder.Field()
+ fb.name = it.name
+ fb.value = it.value
+ fb.inline = it.inline
+ ebb.fields.add(fb)
+ }
+ ebb.footer {
+ this.icon = e.footer?.iconUrl
+ this.text = e.footer?.text.toString()
+ }
+ ebb.description = e.description
+ return ebb
+ }
+
+ fun getAClonedEmbed(e: EmbedBuilder): EmbedBuilder {
+ val ebb = EmbedBuilder()
+ ebb.color = e.color
+ ebb.title = e.title
+ ebb.author {
+ this.icon = e.author?.url
+ this.name = e.author?.name.toString()
+ this.url = e.author?.url
+ }
+ e.fields.forEach {
+ val fb = EmbedBuilder.Field()
+ fb.name = it.name
+ fb.value = it.value
+ fb.inline = it.inline
+ ebb.fields.add(fb)
+ }
+ ebb.footer {
+ this.icon = e.footer?.icon
+ this.text = e.footer?.text.toString()
+ }
+ ebb.description = e.description
+ return ebb
+ }
+
+ fun getEmbedWithTable(
+ color: EmbedColor,
+ title: String,
+ description: String,
+ values: Map>?
+ ): EmbedBuilder {
+ val ebb = getEmbedSmall(color, title, description)
+ if (values != null)
+ for (key in values.keys) {
+ val fb = EmbedBuilder.Field()
+ fb.name = key
+ var s = ""
+ for (value in values[key]!!)
+ s += "$value\n"
+ fb.value = s
+ fb.inline = true
+ ebb.fields.add(fb)
+ }
+ return ebb
+ }
+
+ ///Get an embedded msg with title and description
+ fun getEmbedSmall(
+ color: EmbedColor,
+ title: String,
+ description: String
+ ): EmbedBuilder {
+ val ebb = EmbedBuilder()
+ ebb.title = title
+ ebb.description = description
+ ebb.color = color.color
+ return ebb
+ }
+
+ ///Get an embedded msg with title, description and a src
+ fun getEmbed(
+ color: EmbedColor,
+ title: String,
+ description: String,
+ source: String
+ ): EmbedBuilder {
+ val ebb = getEmbedSmall(color, title, description)
+ val now: LocalDateTime = LocalDateTime.now()
+ ebb.footer = EmbedBuilder.Footer()
+ ebb.footer!!.text = ">" + dtf.format(now) + " - $source"
+ return ebb
+ }
+
+}
diff --git a/src/main/kotlin/net/moonleay/liljudd/util/NetUtil.kt b/src/main/kotlin/net/moonleay/liljudd/util/NetUtil.kt
new file mode 100644
index 0000000..665d0bb
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/liljudd/util/NetUtil.kt
@@ -0,0 +1,45 @@
+/*
+ * lilJudd
+ * Copyright (C) 2024 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.util
+
+import java.net.URL
+import javax.net.ssl.HttpsURLConnection
+
+object NetUtil {
+ fun GETJsonData(urlIN: String, userAgent: String): String {
+ val startTime = System.currentTimeMillis()
+ val url = URL(urlIN)
+ val connection = url.openConnection() as HttpsURLConnection
+ connection.requestMethod = "GET"
+ connection.setRequestProperty("User-Agent", userAgent)
+ connection.setRequestProperty("Accept", "application/json")
+ val responseCode = connection.responseCode
+ val timeDiff = System.currentTimeMillis() - startTime
+ Logger.out("GET took $timeDiff ms (from: $urlIN, as $userAgent)")
+ return if (responseCode == HttpsURLConnection.HTTP_OK) {
+ val inputStream = connection.inputStream
+ val inputStreamReader = inputStream.reader()
+ val inputAsString = inputStreamReader.readText()
+ inputStream.close()
+ inputAsString
+ } else {
+ "Error $responseCode"
+ }
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/util/TimeUtil.kt b/src/main/kotlin/net/moonleay/liljudd/util/TimeUtil.kt
similarity index 73%
rename from src/main/kotlin/net/moonleay/lilJudd/util/TimeUtil.kt
rename to src/main/kotlin/net/moonleay/liljudd/util/TimeUtil.kt
index c3c3e54..bddc8b1 100644
--- a/src/main/kotlin/net/moonleay/lilJudd/util/TimeUtil.kt
+++ b/src/main/kotlin/net/moonleay/liljudd/util/TimeUtil.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package net.moonleay.lilJudd.util
+package net.moonleay.liljudd.util
import kotlinx.datetime.DayOfWeek
import java.time.Duration
@@ -29,7 +29,7 @@ import java.util.concurrent.TimeUnit
object TimeUtil {
- fun getTimeFormatedShortend(time2: Long): String {
+ fun getTimeFormatedShortend(time2: Long, showS: Boolean): String {
var time = time2
val days: Long = TimeUnit.MILLISECONDS
.toDays(time)
@@ -52,7 +52,7 @@ object TimeUtil {
if (minutes >= 1) {
s += minutes.toString() + "m "
}
- if (seconds >= 1 && hours < 1) {
+ if (seconds >= 1 && hours < 1 && showS) {
s += seconds.toString() + "s"
}
if (s.isEmpty() || s.isBlank()) {
@@ -145,6 +145,16 @@ object TimeUtil {
.withMinute(0).withSecond(0)
}
+ fun validateDateString(input: String): Boolean {
+ val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
+ return try {
+ LocalDateTime.parse(input, formatter)
+ true
+ } catch (e: Exception) {
+ false
+ }
+ }
+
fun getDateFromString(input: String): ZonedDateTime {
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
val localDateTime = LocalDateTime.parse(input, formatter)
@@ -158,4 +168,35 @@ object TimeUtil {
val zdt_ = zdt.minusHours(1)
return "0 ${zdt_.minute} ${zdt_.hour} ${zdt_.dayOfMonth - 1} ${zdt_.month.value - 1} ${zdt_.year}"// 0o *w"
}
+
+ fun deformatJSONTime(inp: String, zone: String): Long {
+ // 2023-10-05T08:00:00Z
+ val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")
+ val localDateTime = LocalDateTime.parse(inp, formatter)
+ val zoneId = ZoneId.of(zone) // TODO: Add the possibility to set your timezone
+ return ZonedDateTime.of(localDateTime, zoneId).toEpochSecond() * 1000
+ }
+
+ fun getTimeFromJSONTime(inp: String, zone: String): String {
+ // 2023-10-05T08:00:00Z
+ val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")
+ val localDateTime = LocalDateTime.parse(inp, formatter)
+ val zoneId = ZoneId.of(zone) // TODO: Add the possibility to set your timezone
+ val returnFormat = DateTimeFormatter.ofPattern("HH:mm")
+ return ZonedDateTime.of(localDateTime, zoneId).format(returnFormat)
+ }
+
+ fun getTimeFromJSONTimeLong(inp: String, zone: String): String {
+ // 2023-10-05T08:00:00Z
+ val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")
+ val localDateTime = LocalDateTime.parse(inp, formatter)
+ val zoneId = ZoneId.of(zone) // TODO: Add the possibility to set your timezone
+ val returnFormat = DateTimeFormatter.ofPattern("dd'/'MM',' HH:mm")
+ return ZonedDateTime.of(localDateTime, zoneId).format(returnFormat)
+ }
+
+ fun getTimeDifferenceFormatted(start: Long, end: Long): String {
+ val diff = end - start
+ return getTimeFormatedShortend(diff, false)
+ }
}
diff --git a/src/main/templates/net/moonleay/lilJudd/build/BuildConstants.kt b/src/main/templates/net/moonleay/lilJudd/build/BuildConstants.kt
index fdcf269..73a4fdd 100644
--- a/src/main/templates/net/moonleay/lilJudd/build/BuildConstants.kt
+++ b/src/main/templates/net/moonleay/lilJudd/build/BuildConstants.kt
@@ -1,6 +1,6 @@
/*
* lilJudd
- * Copyright (C) 2023 moonleay
+ * Copyright (C) 2024 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
@@ -16,15 +16,16 @@
* along with this program. If not, see .
*/
-package net.moonleay.botendo.build
+package net.moonleay.liljudd.build
internal object BuildConstants {
const val version = "${version}"
- const val ownerID = "${ownerID}"
+ const val creatorID = "${creatorID}"
const val kordVersion = "${kordversion}"
const val coroutinesVersion = "${coroutinesversion}"
const val ktorVersion = "${ktorversion}"
const val exposedVersion = "${exposedversion}"
const val postgresVersion = "${postgresversion}"
const val krontabVersion = "${krontabversion}"
+ const val kotlinXSerializationVerson = "${kotlinxserializationversion}"
}