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 - -[![Latest Release](https://gitlab.com/moonleay/liljudd/-/badges/release.svg)](https://gitlab.com/moonleay/liljudd/-/releases) -[![pipeline status](https://gitlab.com/moonleay/liljudd/badges/master/pipeline.svg)](https://gitlab.com/moonleay/liljudd/-/commits/master) -[![License](https://img.shields.io/badge/license-GPL--3.0-brightgreen)](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}" }