Compare commits

..

105 commits

Author SHA1 Message Date
3a4cb20c95 chore: progress commit
Some checks failed
Build Gradle project / build-gradle-project (push) Failing after 3m44s
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-19 16:42:07 +02:00
5bf19e578b chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m59s
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-06 09:43:32 +02:00
982212ddf3 fix: fixed issue with time in the match extension
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-06 09:43:21 +02:00
95f6772581 fix: fixed api schedulers
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-06 09:42:50 +02:00
e9babd0d74 chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 15:09:58 +02:00
50df374564 chore: updated comment
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 15:09:45 +02:00
2a34d15687 fix: StatusUpdater now starts after the bot is online
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 15:09:30 +02:00
85602038e9 feat: removed the not needed status refreshes
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:53:18 +02:00
b13c2e5f5f feat: made the status refresh every time it updates
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:52:42 +02:00
84f0176ba4 feat: registered new jobs and features
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:41:46 +02:00
5b4b3c9828 feat: added StatusUpdater to update the status of the bot
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:40:45 +02:00
e354ed9143 feat: added JSON deformatter to TimeUtil
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:40:16 +02:00
cc41445d2f feat: added NetUtil for web requests
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:39:46 +02:00
b08779546d feat: added cacheUpdateJobs
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:39:23 +02:00
7f173e4bc2 chore: added credits for the provided data
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:38:34 +02:00
93223fa0ab feat: added Splatoon3.ink API
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 11:38:14 +02:00
cd37bd1242 fix: fixed issues with timestamps
Signed-off-by: moonleay <contact@moonleay.net>
2023-10-05 10:29:27 +02:00
4a0792af08 chore: upgrade crontab
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-26 07:43:56 +02:00
9a134c691f chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-26 07:43:37 +02:00
935af908f7 chore: moved Database stuff in /database package
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-18 16:07:55 +02:00
f762e18b1f chore: update names in action.yml
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m41s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-17 13:24:46 +02:00
c7b03d49c9 Update .forgejo/workflows/action.yml 2023-09-17 13:23:13 +02:00
55fafa29c5 chore: update names in action.yml
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-17 13:22:34 +02:00
d789b5ee64 chore: update README.md
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 4m13s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-17 13:20:41 +02:00
967492685a chore: update README.md
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 4m16s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-17 13:17:14 +02:00
e9fac0d687 fix: fixed removed functions
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 4m16s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-17 12:59:54 +02:00
d2af0fce94 chore!: upgrade dependencies & gradle (7.4.2 -> 8.3)
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-17 12:58:15 +02:00
672982ef37 chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m52s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-15 23:37:06 +02:00
95c22c6bd0 feat: moved all transactions into one package for reuse and simplicity
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m52s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-15 22:50:16 +02:00
e27efe094c chore: removed unused comment
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-15 22:49:12 +02:00
b77271517d chore: fixed naming in data objects
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m49s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 18:31:45 +02:00
99c607efd4 feat: added TimePlanningChannelsData
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 18:30:12 +02:00
fdf63c4605 chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m55s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 12:42:49 +02:00
caa5d49bad fix!: Changed all colors to EmbedColor
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m42s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 12:36:19 +02:00
8d14597a38 feat: make embed helper functions use EmbedColor instead of color
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 12:34:27 +02:00
dcdb5c6e56 feat: added EmbedColor
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 12:27:53 +02:00
af15f7eb73 chore: removed unused open modifier in IEditButton
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m35s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 09:46:19 +02:00
36f931b919 feat: improved UpdateRolesExtension
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m37s
chore: updated UpdateRolesExtension Documentation

Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 09:43:36 +02:00
39fb3ba7d6 chore: updated SendPlannerExtension documentation
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 09:42:29 +02:00
99964d7981 !feat: removed TestExtension.kt
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 09:41:43 +02:00
8a77b275dc feat: Bot now skips Bot Users
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 09:41:27 +02:00
3d1f2c7d8f chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m54s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 07:46:07 +02:00
7e0c8e5a9f feat: moved update logic into "updateInChannel" function, updated the function in Timeplanner buttons
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-14 07:44:43 +02:00
de1d8cd3a6 fix: fixed grammar
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m54s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 14:46:40 +02:00
990387fed2 chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m52s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 14:26:43 +02:00
4f8924fb1a Merge pull request 'chore: moved to proper data types in columns' (#3) from chore/cleanup-db into master
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m57s
Reviewed-on: #3
2023-09-11 13:49:47 +02:00
1424e31e2a chore: moved to proper data types in columns
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m45s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 13:35:17 +02:00
d97511eb8b chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m53s
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 12:48:33 +02:00
63fb1c0c8f feat: added DeclineEditButton
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 12:47:31 +02:00
308da65105 feat: improved function of AcceptEditButton
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 12:47:06 +02:00
9400a21403 feat: added Unavailable to MatchExtension table
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 12:46:33 +02:00
f7b701de20 feat: improved replaceXWithYinValuesAtTable function, edited MatchButtons
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 12:45:51 +02:00
165e1d342c feat: improved getAClonedEmbed function, added an equivalent using a EmbedBuilder
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-11 12:44:34 +02:00
883940c8fd Merge remote-tracking branch 'origin/master'
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 4m13s
2023-09-06 22:10:39 +02:00
18cd26c456 chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-06 22:10:17 +02:00
a3c1344f1a feat: Roles now update on button press
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-06 22:09:59 +02:00
f552ea4faa chore: improved readability
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-06 22:06:14 +02:00
d10f8901c9 fix: fixed AvailabilityManager
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-06 22:05:29 +02:00
925398db65 fix: fixed weekstamp
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-06 22:03:50 +02:00
b258747086 chore: improved imports
Signed-off-by: moonleay <contact@moonleay.net>
2023-09-06 21:59:41 +02:00
500ad1a912 Update .forgejo/workflows/action.yml
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m37s
2023-08-18 11:44:43 +02:00
862206e1d5 Update .forgejo/workflows/action.yml
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m30s
2023-08-18 11:40:51 +02:00
9f28aecd57 Update .forgejo/workflows/action.yml
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 3m46s
2023-08-18 11:25:30 +02:00
7bf0f8d56e Update .forgejo/workflows/action.yml 2023-08-18 11:24:48 +02:00
91e4dfde60 Update .forgejo/workflows/action.yml
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 3m17s
2023-08-18 11:16:47 +02:00
9305118f4a Update .forgejo/workflows/action.yml
Some checks failed
Build Gradle project / build-gradle-project (push) Failing after 1m16s
2023-08-18 11:13:03 +02:00
c638021326 Update .forgejo/workflows/action.yml
Some checks reported warnings
Build Gradle project / build-gradle-project (push) Has been cancelled
2023-08-18 09:20:31 +02:00
937541cf61 Update .forgejo/workflows/action.yml
Some checks failed
Build Gradle project / build-gradle-project (push) Failing after 8s
2023-08-18 09:00:23 +02:00
81d248bfb7 Update .forgejo/workflows/action.yml
Some checks reported warnings
Build Gradle project / build-gradle-project (push) Has been cancelled
2023-08-18 08:56:42 +02:00
3018918bff Update .forgejo/workflows/action.yml 2023-08-18 08:55:04 +02:00
9c1842d4f7 Update .forgejo/workflows/action.yml
Some checks failed
Build Gradle project / build-gradle-project (push) Failing after 7s
2023-08-18 08:53:44 +02:00
cf1fed51c3 Update .forgejo/workflows/action.yml
Some checks failed
Build Gradle project / build-gradle-project (push) Failing after 1m9s
2023-08-12 14:12:10 +02:00
9847192074 Update .forgejo/workflows/action.yml 2023-08-12 14:10:43 +02:00
a45d4ae26d Update .forgejo/workflows/action.yml 2023-08-12 14:09:39 +02:00
fc6824cd5e Update .forgejo/workflows/action.yml 2023-08-12 14:09:21 +02:00
1e65e609e1 Update .forgejo/workflows/action.yml
Signed-off-by: moonleay <account@moonleay.net>
2023-08-12 14:06:37 +02:00
a75a70b689 Update .forgejo/workflows/action.yml
Signed-off-by: moonleay <account@moonleay.net>
2023-08-12 14:04:55 +02:00
08b6601663 Update .forgejo/workflows/action.yml
Signed-off-by: moonleay <account@moonleay.net>
2023-08-12 14:02:50 +02:00
619be85353 Update .forgejo/workflows/action.yml
Signed-off-by: moonleay <account@moonleay.net>
2023-08-12 13:47:55 +02:00
c4233a7b6b fix> update ci
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 19:04:47 +02:00
149ce7d5c6 fix> update ci
Some checks failed
/ build_and_publish (push) Failing after 8s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 18:54:14 +02:00
bf8bc013d9 fix> update ci
Some checks failed
/ build_and_publish (push) Failing after 27s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 18:36:48 +02:00
0928d84b9a fix> update ci
Some checks failed
/ build_and_publish (push) Failing after 3s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 18:36:08 +02:00
e215f556e7 fix> update ci
Some checks failed
/ build_and_publish (push) Failing after 1m57s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 18:27:00 +02:00
90f9dd15c9 fix> update ci
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 18:01:12 +02:00
6b0c5058ab feat moved action.yml
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:41:04 +02:00
7d15ef910b feat moved action.yml
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:39:59 +02:00
d9cedb702b fix: fixed build.yml?????????????????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:25:08 +02:00
6b391f2e4d fix: fixed build.yml????????????????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:23:20 +02:00
4cc3fae4ab fix: fixed build.yml???????????????
Some checks failed
/ build_and_publish (push) Failing after 3s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:20:17 +02:00
9d68e9aebb fix: fixed build.yml??????????????
Some checks failed
/ build_and_publish (push) Failing after 3s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:19:40 +02:00
7dbae9a330 fix: fixed build.yml?????????????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:18:42 +02:00
e344c9bd3a fix: fixed build.yml????????????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:17:47 +02:00
02d95b7d12 fix: fixed build.yml???????????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:15:48 +02:00
f3497f9a2b fix: fixed build.yml??????????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 02:00:07 +02:00
eb7ac71dd5 fix: fixed build.yml?????????
Some checks failed
/ Build (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 01:57:02 +02:00
9273b4b168 fix: fixed build.yml????????
Some checks reported warnings
/ Build (push) Has been cancelled
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 01:55:59 +02:00
c4b00aa9a5 fix: fixed build.yml???????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-05 01:40:41 +02:00
a2436cb002 fix: fixed build.yml??????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-04 21:32:45 +02:00
04fa9ad59a fix: fixed build.yml?????
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-04 21:30:17 +02:00
cd84d02608 fix: fixed build.yml????
Some checks failed
/ build_and_publish (push) Failing after 5s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-04 21:28:10 +02:00
2bfc327ceb fix: fixed build.yml???
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-04 21:25:46 +02:00
38832e1c0d fix: fixed build.yml??
Some checks failed
/ build_and_publish (push) Failing after 5s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-04 21:23:16 +02:00
7f2e74ff6c fix: fixed build.yml?
Some checks failed
/ build_and_publish (push) Failing after 3s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-04 21:22:29 +02:00
a93499cfb8 fix: fixed build.yml
Some checks failed
/ build_and_publish (push) Failing after 2s
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-04 21:17:52 +02:00
121 changed files with 1682 additions and 2868 deletions

View file

@ -1,4 +1,3 @@
**.nils **.nils
/run /run
/run/ /run/
docker-compose.yml

View file

@ -5,10 +5,12 @@ on:
jobs: jobs:
build-gradle-project: build-gradle-project:
runs-on: docker runs-on: ubuntu-latest
steps: steps:
- name: apt update - name: apt update
run: apt update run: apt update
- name: apt upgrade
run: apt upgrade -y
- name: install prerequisits - name: install prerequisits
run: apt install openjdk-17-jdk ca-certificates-java ssl-cert openssl ca-certificates -y run: apt install openjdk-17-jdk ca-certificates-java ssl-cert openssl ca-certificates -y
- name: Checkout project sources - name: Checkout project sources

1
.gitignore vendored
View file

@ -1,5 +1,4 @@
run/ run/
/data/
.gradle .gradle
build/ build/

View file

@ -4,13 +4,15 @@
A Discord Bot for Splatoon Teams. A Discord Bot for Splatoon Teams.
More information can be found on the [Homepage](https://moonleay.net/projects/liljudd/).
## Contributors ## Contributors
[![Developer](https://img.shields.io/badge/moonleay-Developer-red)](https://gitlab.com/moonleay) [![Developer](https://img.shields.io/badge/moonleay-Developer-red)](https://gitlab.com/moonleay)
## Known issues ## Known issues
##### 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). ##### If you encounter any bugs, message me on Discord (@moonleay) or send me a mail (issues@moonleay.net).
## Commands & Features ## Commands & Features
@ -20,34 +22,27 @@ A Discord Bot for Splatoon Teams.
- match -- Create a new match - match -- Create a new match
- updateroles -- Update the roles of all users - updateroles -- Update the roles of all users
- sendplanner -- Send the planner message - sendplanner -- Send the planner message
- rotation -- See the current rotation
- Features - Features
- Time Planner -- Make the bot send messages and reactions into a selected channel in order to make planning easier - 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 - 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 - Match Planner -- Make a match, for which players can sign up and the bot will assign teams and roles to them
## The todo list ## (Maybe) upcoming features
##### See the [todo list](https://todo.moonleay.net/share/OmisuzgPDdsrCAXKjGrTfYzWwqNDNclOMGJWeMsi/auth?view=kanban) for more information. - 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
## How to self-host (using the Docker container) ## How to self-host (using the Docker container)
1. Copy the docker-compose.yml file from the repository. 1. Pull the container from [Docker Hub](https://hub.docker.com/repository/docker/limiteddev/liljudd/general)
2. Install docker and docker-compose. 2. Map /data/ to a folder on disk
3. Create a directory called "data" in the same directory as the docker-compose.yml file. 3. Run the Bot once
4. Create a directory called "config" in the same directory as the docker-compose.yml file. 4. follow step 4 and 5 from the JAR section
5. Start the bot once. 5. Run the Bot again
6. After 10 seconds, stop the bot. 6. Profit.
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) ## How to self-host (using the JAR)

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -21,27 +21,25 @@ import org.jetbrains.gradle.ext.TaskTriggersConfig
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
kotlin("jvm") version "1.9.22" kotlin("jvm") version "1.9.10"
kotlin("plugin.serialization") version "1.9.22"
id("com.github.johnrengelman.shadow") version "8.1.1" id("com.github.johnrengelman.shadow") version "8.1.1"
id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7" id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7"
`maven-publish` `maven-publish`
} }
//lilJudd version 2 //lilJudd version 2
val creatorID = 372703841151614976L val ownerID = 372703841151614976L
group = "net.moonleay.liljudd" group = "net.moonleay.liljudd"
version = System.getenv("CI_COMMIT_TAG")?.let { "$it-${System.getenv("CI_COMMIT_SHORT_SHA")}-prod" } version = System.getenv("CI_COMMIT_TAG")?.let { "$it-${System.getenv("CI_COMMIT_SHORT_SHA")}-prod" }
?: System.getenv("CI_COMMIT_SHORT_SHA")?.let { "$it-dev" } ?: System.getenv("CI_COMMIT_SHORT_SHA")?.let { "$it-dev" }
?: "2.7.2" ?: "2.6.4"
val kordver = "1.7.1-SNAPSHOT" val kordver = "1.5.9-SNAPSHOT"
val coroutinesver = "1.7.3" val coroutinesver = "1.7.3"
val ktorver = "2.3.7" val ktorver = "2.3.5"
val exposedver = "0.46.0" val exposedver = "0.43.0"
val postgresver = "42.7.1" val postgresver = "42.6.0"
val krontabver = "2.2.6" val krontabver = "2.2.1"
val kotlinxserializationver = "1.6.0"
val mavenArtifact = "lilJudd" val mavenArtifact = "lilJudd"
project.base.archivesName.set(mavenArtifact) project.base.archivesName.set(mavenArtifact)
@ -95,9 +93,6 @@ dependencies {
//Coroutines //Coroutines
shadow("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesver") shadow("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesver")
//JSON Stuff
shadow("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinxserializationver")
//Logging //Logging
shadow("org.slf4j:slf4j-api:2.0.3") shadow("org.slf4j:slf4j-api:2.0.3")
shadow("org.slf4j:slf4j-simple:2.0.3") shadow("org.slf4j:slf4j-simple:2.0.3")
@ -110,8 +105,8 @@ dependencies {
//Krontab //Krontab
shadow("dev.inmo:krontab:$krontabver") shadow("dev.inmo:krontab:$krontabver")
shadow("io.ktor:ktor-client-core-jvm:$ktorver") shadow("io.ktor:ktor-client-core-jvm:2.3.5")
shadow("io.ktor:ktor-client-cio-jvm:$ktorver") shadow("io.ktor:ktor-client-cio-jvm:2.3.5")
} }
@ -120,14 +115,13 @@ val templateSrc = project.rootDir.resolve("src/main/templates")
val templateDest = project.projectDir.resolve("build/generated/templates") val templateDest = project.projectDir.resolve("build/generated/templates")
val templateProps = mapOf( val templateProps = mapOf(
"version" to project.version as String, "version" to project.version as String,
"creatorID" to creatorID, "ownerID" to ownerID,
"kordversion" to kordver, "kordversion" to kordver,
"coroutinesversion" to coroutinesver, "coroutinesversion" to coroutinesver,
"ktorversion" to ktorver, "ktorversion" to ktorver,
"exposedversion" to exposedver, "exposedversion" to exposedver,
"postgresversion" to postgresver, "postgresversion" to postgresver,
"krontabversion" to krontabver, "krontabversion" to krontabver
"kotlinxserializationversion" to kotlinxserializationver
) )

View file

@ -1,32 +0,0 @@
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/

Binary file not shown.

View file

@ -1,6 +1,6 @@
# #
# lilJudd # lilJudd
# Copyright (C) 2024 moonleay # Copyright (C) 2023 moonleay
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -18,8 +18,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

43
gradlew vendored
View file

@ -2,7 +2,7 @@
# #
# lilJudd # lilJudd
# Copyright (C) 2024 moonleay # Copyright (C) 2023 moonleay
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -57,7 +57,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -82,11 +82,13 @@ do
esac esac
done done
# This is normally unused APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# 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 # 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"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -133,29 +135,22 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
if ! command -v java >/dev/null 2>&1 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
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 Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) 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 ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | 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" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -200,15 +195,11 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# Collect all arguments for the java command: # * put everything else in single quotes, so that it's not re-expanded.
# * 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 -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
@ -216,12 +207,6 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \ 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. # Use "xargs" to parse quoted args.
# #
# With -n1 it outputs one arg per line, with the quotes and backslashes removed. # With -n1 it outputs one arg per line, with the quotes and backslashes removed.

11
gradlew.bat vendored
View file

@ -26,7 +26,6 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=. if "%DIRNAME%" == "" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@ -41,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if "%ERRORLEVEL%" == "0" goto execute
echo. echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -76,15 +75,13 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd if "%ERRORLEVEL%"=="0" goto mainEnd
:fail :fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code! rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL% if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
if %EXIT_CODE% equ 0 set EXIT_CODE=1 exit /b 1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd :mainEnd
if "%OS%"=="Windows_NT" endlocal if "%OS%"=="Windows_NT" endlocal

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,10 +16,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd package net.moonleay.lilJudd
import com.kotlindiscord.kord.extensions.ExtensibleBot import com.kotlindiscord.kord.extensions.ExtensibleBot
import com.kotlindiscord.kord.extensions.utils.dm
import dev.kord.common.entity.PresenceStatus import dev.kord.common.entity.PresenceStatus
import dev.kord.core.behavior.interaction.response.respond import dev.kord.core.behavior.interaction.response.respond
import dev.kord.core.event.gateway.ReadyEvent import dev.kord.core.event.gateway.ReadyEvent
@ -27,28 +26,29 @@ import dev.kord.core.event.interaction.ButtonInteractionCreateEvent
import dev.kord.core.on import dev.kord.core.on
import dev.kord.gateway.Intent import dev.kord.gateway.Intent
import dev.kord.gateway.PrivilegedIntent 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.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.moonleay.liljudd.build.BuildConstants import net.moonleay.botendo.build.BuildConstants
import net.moonleay.liljudd.buttons.component.EditButtonManager import net.moonleay.lilJudd.buttons.component.EditButtonManager
import net.moonleay.liljudd.data.CredentialManager import net.moonleay.lilJudd.data.CredentialManager
import net.moonleay.liljudd.data.NewsManager import net.moonleay.lilJudd.data.api.Splatoon3ApiCache
import net.moonleay.liljudd.data.StacktraceSaver import net.moonleay.lilJudd.data.api.type.ApiDataType
import net.moonleay.liljudd.data.database.DB import net.moonleay.lilJudd.data.api.type.ApiRequestType
import net.moonleay.liljudd.extensions.* import net.moonleay.lilJudd.data.database.DB
import net.moonleay.liljudd.features.AvailabilityManager import net.moonleay.lilJudd.extensions.*
import net.moonleay.liljudd.features.MatchManager import net.moonleay.lilJudd.features.AvailabilityManager
import net.moonleay.liljudd.features.TimeManager import net.moonleay.lilJudd.features.MatchManager
import net.moonleay.liljudd.util.EmbedColor import net.moonleay.lilJudd.features.TimeManager
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.jobs.Splatoon3ApiScheduleUpdateScheduler
import net.moonleay.liljudd.util.MessageUtil import net.moonleay.lilJudd.jobs.StatusUpdater
import net.moonleay.lilJudd.jobs.component.JobManager
import net.moonleay.lilJudd.util.EmbedColor
import net.moonleay.lilJudd.util.Logger
import net.moonleay.lilJudd.util.MessageUtil
import kotlin.system.exitProcess import kotlin.system.exitProcess
object Bot { object Bot {
//The kord object gets set at app launch //The kord object gets set at app launch
lateinit var bot: ExtensibleBot lateinit var bot: ExtensibleBot
@ -74,12 +74,6 @@ object Bot {
exitProcess(3) 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 // Connect to the database
DB.connect( DB.connect(
CredentialManager.dbDomain, CredentialManager.dbDomain,
@ -128,26 +122,11 @@ object Bot {
+Intent.GuildMembers +Intent.GuildMembers
} }
errorResponse { _, type -> // Will add Sharding someday, I promise
val stamp = System.currentTimeMillis() /*
this.embed { sharding { recommended ->
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) Shards(recommended)
} } */
} }
// Register button presses // Register button presses
@ -185,46 +164,20 @@ object Bot {
bot.kordRef.on<ReadyEvent> { bot.kordRef.on<ReadyEvent> {
AvailabilityManager.runThread() // Update Availabilities AvailabilityManager.runThread() // Update Availabilities
MatchManager.update() // Update Matches MatchManager.update() // Update Matches
// Load news
NewsManager.load()
if(NewsManager.shouldPost == "yes"){
val contactedOwners = mutableListOf<ULong>()
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 // Make the bot update the status every 6 seconds
// JobManager.addJob(StatusUpdater) JobManager.addJob(StatusUpdater)
} }
// Update the Splatoon 3 api data and make sure it stays up-to-date // Update the Splatoon 3 api data and make sure it stays up-to-date
// Splatoon3Api.updateSchedule() Splatoon3ApiCache.updateData(ApiDataType.SCHEDULES, ApiRequestType.AUTOMATIC_CACHE_CREATION_AT_STARTUP)
// JobManager.addJob(Splatoon3ApiScheduleUpdateScheduler) JobManager.addJob(Splatoon3ApiScheduleUpdateScheduler)
/* /*
Other caches will be added when implemented Other caches will be added when implemented
its not used yet in order to reduce load on the api, its not used yet in order to reduce load on the api,
which i am using. which i am using.
*/ */
// Had to disable bc of an error. //JobManager.addJob(Splatoon3ApiFestivalAndCoopUpdateScheduler)
// Will fix when I have time //JobManager.addJob(Splatoon3ApiSplatnetGearUpdateScheduler)
//Start the bot //Start the bot
bot.start() bot.start()

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -15,11 +15,9 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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() { suspend fun main() {
println( println(
@ -28,11 +26,9 @@ suspend fun main() {
"| |_| |__| |_ _ _| |_| |\n" + "| |_| |__| |_ _ _| |_| |\n" +
"| | | | | | | | . | . |\n" + "| | | | | | | | . | . |\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() Bot.start()
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,14 +16,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.buttons.component package net.moonleay.lilJudd.buttons.component
import net.moonleay.liljudd.buttons.matchplanner.AcceptEditButton import net.moonleay.lilJudd.buttons.matchplanner.AcceptEditButton
import net.moonleay.liljudd.buttons.matchplanner.CancelEditButton import net.moonleay.lilJudd.buttons.matchplanner.CancelEditButton
import net.moonleay.liljudd.buttons.matchplanner.DeclineEditButton import net.moonleay.lilJudd.buttons.matchplanner.DeclineEditButton
import net.moonleay.liljudd.buttons.timeplanner.IsAvailableEditButton import net.moonleay.lilJudd.buttons.timeplanner.IsAvailableEditButton
import net.moonleay.liljudd.buttons.timeplanner.MaybeAvailableEditButton import net.moonleay.lilJudd.buttons.timeplanner.MaybeAvailableEditButton
import net.moonleay.liljudd.buttons.timeplanner.NotAvailableEditButton import net.moonleay.lilJudd.buttons.timeplanner.NotAvailableEditButton
object EditButtonManager { object EditButtonManager {
val buttons = listOf( val buttons = listOf(

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.buttons.component package net.moonleay.lilJudd.buttons.component
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
import dev.kord.core.entity.Guild import dev.kord.core.entity.Guild

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.buttons.matchplanner package net.moonleay.lilJudd.buttons.matchplanner
import dev.kord.common.entity.Snowflake import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.edit import dev.kord.core.behavior.edit
@ -25,16 +25,15 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.EmbedBuilder import dev.kord.rest.builder.message.modify.embed
import dev.kord.rest.builder.message.embed import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.buttons.component.IEditButton
import net.moonleay.liljudd.buttons.component.IEditButton import net.moonleay.lilJudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository import net.moonleay.lilJudd.util.EmbedUtil
import net.moonleay.liljudd.util.EmbedUtil import net.moonleay.lilJudd.util.Logger
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.util.MessageUtil
import net.moonleay.liljudd.util.MessageUtil
class AcceptEditButton : IEditButton { class AcceptEditButton() : IEditButton {
override val id: String = "public.edit.btn.matchmanagement.accept" override val id: String = "public.edit.btn.matchmanagement.accept"
override suspend fun onInteraction( override suspend fun onInteraction(
@ -60,7 +59,7 @@ class AcceptEditButton : IEditButton {
Logger.out("role is null") Logger.out("role is null")
return return
} }
val member = interaction.user.asMember(guild.id) val member = interaction.user.asMember(guild.id) ?: return
// do the checks and update // do the checks and update
if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) { if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
if (member.roleIds.contains(Snowflake(mpdd.roleID))) { if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
@ -90,13 +89,13 @@ class AcceptEditButton : IEditButton {
if (shouldEditButton) { if (shouldEditButton) {
// update the message // update the message
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit { Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed(fun EmbedBuilder.() { this.embed {
color = eb.color this.color = eb.color
title = eb.title this.title = eb.title
description = eb.description this.description = eb.description
fields = eb.fields this.fields = eb.fields
footer = eb.footer this.footer = eb.footer
}) }
} }
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.buttons.matchplanner package net.moonleay.lilJudd.buttons.matchplanner
import dev.kord.common.entity.Snowflake import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.edit import dev.kord.core.behavior.edit
@ -25,13 +25,12 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.EmbedBuilder import dev.kord.rest.builder.message.modify.embed
import dev.kord.rest.builder.message.embed import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.buttons.component.IEditButton
import net.moonleay.liljudd.buttons.component.IEditButton import net.moonleay.lilJudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository import net.moonleay.lilJudd.util.EmbedUtil
import net.moonleay.liljudd.util.EmbedUtil import net.moonleay.lilJudd.util.Logger
import net.moonleay.liljudd.util.Logger
class CancelEditButton : IEditButton { class CancelEditButton : IEditButton {
override val id: String = "public.edit.btn.matchmanagement.cancel" override val id: String = "public.edit.btn.matchmanagement.cancel"
@ -63,14 +62,14 @@ class CancelEditButton : IEditButton {
member.removeRole(role.id) member.removeRole(role.id)
} }
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit { Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed(fun EmbedBuilder.() { this.embed {
val temp = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 1) val temp = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 1)
color = temp.color this.color = temp.color
title = temp.title this.title = temp.title
description = temp.description this.description = temp.description
fields = temp.fields this.fields = temp.fields
footer = temp.footer this.footer = temp.footer
}) }
} }
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.buttons.matchplanner package net.moonleay.lilJudd.buttons.matchplanner
import dev.kord.common.entity.Snowflake import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.edit import dev.kord.core.behavior.edit
@ -25,14 +25,13 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.EmbedBuilder import dev.kord.rest.builder.message.modify.embed
import dev.kord.rest.builder.message.embed import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.buttons.component.IEditButton
import net.moonleay.liljudd.buttons.component.IEditButton import net.moonleay.lilJudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository import net.moonleay.lilJudd.util.EmbedUtil
import net.moonleay.liljudd.util.EmbedUtil import net.moonleay.lilJudd.util.Logger
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.util.MessageUtil
import net.moonleay.liljudd.util.MessageUtil
class DeclineEditButton : IEditButton { class DeclineEditButton : IEditButton {
override val id: String = "public.edit.btn.matchmanagement.decline" override val id: String = "public.edit.btn.matchmanagement.decline"
@ -60,7 +59,7 @@ class DeclineEditButton : IEditButton {
Logger.out("role is null") Logger.out("role is null")
return return
} }
val member = interaction.user.asMember(guild.id) val member = interaction.user.asMember(guild.id) ?: return
if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) { if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
if (member.roleIds.contains(Snowflake(mpdd.roleID))) { if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
Logger.out("Removing role from ${member.username}") Logger.out("Removing role from ${member.username}")
@ -90,13 +89,13 @@ class DeclineEditButton : IEditButton {
if (shouldEditButton) { if (shouldEditButton) {
// update the message // update the message
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit { Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed(fun EmbedBuilder.() { this.embed {
color = eb.color this.color = eb.color
title = eb.title this.title = eb.title
description = eb.description this.description = eb.description
fields = eb.fields this.fields = eb.fields
footer = eb.footer this.footer = eb.footer
}) }
} }
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.buttons.timeplanner package net.moonleay.lilJudd.buttons.timeplanner
import dev.kord.core.behavior.edit import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
@ -24,11 +24,11 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.modify.embed
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton import net.moonleay.lilJudd.buttons.component.IEditButton
import net.moonleay.liljudd.features.AvailabilityManager import net.moonleay.lilJudd.features.AvailabilityManager
import net.moonleay.liljudd.util.EmbedUtil import net.moonleay.lilJudd.util.EmbedUtil
class IsAvailableEditButton : IEditButton { class IsAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.available" override val id: String = "public.edit.btn.timemanagement.available"

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.buttons.timeplanner package net.moonleay.lilJudd.buttons.timeplanner
import dev.kord.core.behavior.edit import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
@ -24,11 +24,11 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.modify.embed
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton import net.moonleay.lilJudd.buttons.component.IEditButton
import net.moonleay.liljudd.features.AvailabilityManager import net.moonleay.lilJudd.features.AvailabilityManager
import net.moonleay.liljudd.util.EmbedUtil import net.moonleay.lilJudd.util.EmbedUtil
class MaybeAvailableEditButton : IEditButton { class MaybeAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.maybeavailable" override val id: String = "public.edit.btn.timemanagement.maybeavailable"

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.buttons.timeplanner package net.moonleay.lilJudd.buttons.timeplanner
import dev.kord.core.behavior.edit import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
@ -24,11 +24,11 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.embed import dev.kord.rest.builder.message.modify.embed
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton import net.moonleay.lilJudd.buttons.component.IEditButton
import net.moonleay.liljudd.features.AvailabilityManager import net.moonleay.lilJudd.features.AvailabilityManager
import net.moonleay.liljudd.util.EmbedUtil import net.moonleay.lilJudd.util.EmbedUtil
class NotAvailableEditButton : IEditButton { class NotAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.notavailable" override val id: String = "public.edit.btn.timemanagement.notavailable"

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data package net.moonleay.lilJudd.data
import java.io.* import java.io.*
import java.util.* import java.util.*
@ -29,8 +29,6 @@ object CredentialManager {
lateinit var dbName: String lateinit var dbName: String
lateinit var dbUser: String lateinit var dbUser: String
lateinit var dbPassword: String lateinit var dbPassword: String
lateinit var apiDomain: String
lateinit var apiToken: String
///Load the needed credentials, generate a config if there is none ///Load the needed credentials, generate a config if there is none
fun load() { fun load() {
@ -53,8 +51,6 @@ object CredentialManager {
dbName = prop.getProperty("dbName") dbName = prop.getProperty("dbName")
dbUser = prop.getProperty("dbUser") dbUser = prop.getProperty("dbUser")
dbPassword = prop.getProperty("dbPassword") dbPassword = prop.getProperty("dbPassword")
apiDomain = prop.getProperty("apiDomain")
apiToken = prop.getProperty("apiToken")
input.close() input.close()
} catch (e: IOException) { } catch (e: IOException) {
e.printStackTrace() e.printStackTrace()
@ -87,8 +83,6 @@ object CredentialManager {
prop.setProperty("dbName", "empty") prop.setProperty("dbName", "empty")
prop.setProperty("dbUser", "empty") prop.setProperty("dbUser", "empty")
prop.setProperty("dbPassword", "empty") prop.setProperty("dbPassword", "empty")
prop.setProperty("apiDomain", "empty")
prop.setProperty("apiToken", "empty")
prop.store(output, null) prop.store(output, null)
output.close() output.close()

View file

@ -0,0 +1,117 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data.api
import net.moonleay.lilJudd.data.api.entry.schedule.ModeData
import net.moonleay.lilJudd.util.TimeUtil
object Splatoon3Api {
fun getRegularMode(timestamp: Long): ModeData {
Splatoon3ApiCache.cachedRegularModeData.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): ModeData {
Splatoon3ApiCache.cachedCompetitiveOpenModeData.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 getXMode(timestamp: Long): ModeData {
Splatoon3ApiCache.cachedXModeData.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): ModeData {
Splatoon3ApiCache.cachedCompetitiveSeriesModeData.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 getRegularMapsFormatted(timestamp: Long): String {
val modeData = getRegularMode(timestamp)
val map1 = modeData.map1!!.name.split(" ")[0]
val map2 = modeData.map2!!.name.split(" ")[0]
return "R: $map1 & $map2"
}
fun getOpenModeFormatted(timestamp: Long): String {
val modeData = getOpenMode(timestamp)
val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
val diffStamp = TimeUtil.getTimeDifferenceFormatted(System.currentTimeMillis(), endTime)
return "O: ${modeData.ruleSetName} $diffStamp left"
}
fun getOpenMapFormatted(timestamp: Long): String {
val modeData = getOpenMode(timestamp)
val map1 = modeData.map1!!.name.split(" ")[0]
val map2 = modeData.map2!!.name.split(" ")[0]
return "O: $map1 & $map2"
}
fun getSeriesModeFormatted(timestamp: Long): String {
val modeData = getSeriesMode(timestamp)
val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
val diffStamp = TimeUtil.getTimeDifferenceFormatted(System.currentTimeMillis(), endTime)
return "S: ${modeData.ruleSetName} $diffStamp left"
}
fun getSeriesMapsFormatted(timestamp: Long): String {
val modeData = getSeriesMode(timestamp)
val map1 = modeData.map1!!.name.split(" ")[0]
val map2 = modeData.map2!!.name.split(" ")[0]
return "S: $map1 & $map2"
}
fun getXModeFormatted(timestamp: Long): String {
val modeData = getXMode(timestamp)
val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
val diffStamp = TimeUtil.getTimeDifferenceFormatted(System.currentTimeMillis(), endTime)
return "X: ${modeData.ruleSetName} $diffStamp left"
}
fun getXMapFormatted(timestamp: Long): String {
val modeData = getXMode(timestamp)
val map1 = modeData.map1!!.name.split(" ")[0]
val map2 = modeData.map2!!.name.split(" ")[0]
return "X: $map1 & $map2"
}
}

View file

@ -0,0 +1,535 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data.api
import io.ktor.http.*
import kotlinx.serialization.json.*
import net.moonleay.botendo.build.BuildConstants
import net.moonleay.lilJudd.data.api.entry.coop.CoopGearData
import net.moonleay.lilJudd.data.api.entry.schedule.*
import net.moonleay.lilJudd.data.api.entry.splatfest.SplatfestColor
import net.moonleay.lilJudd.data.api.entry.splatfest.SplatfestData
import net.moonleay.lilJudd.data.api.entry.splatfest.SplatfestTeamData
import net.moonleay.lilJudd.data.api.entry.splatfest.SplatfestTeamResults
import net.moonleay.lilJudd.data.api.entry.splatnet.BrandData
import net.moonleay.lilJudd.data.api.entry.splatnet.GearAbilityData
import net.moonleay.lilJudd.data.api.entry.splatnet.SplatnetItemData
import net.moonleay.lilJudd.data.api.type.ApiDataType
import net.moonleay.lilJudd.data.api.type.ApiRequestType
import net.moonleay.lilJudd.util.Logger
import net.moonleay.lilJudd.util.NetUtil
object Splatoon3ApiCache {
private val user_agent =
"lilJudd/${BuildConstants.version} (${System.getProperty("os.name")}/${System.getProperty("os.version")}) [contact@moonleay.net]"
private val base_url = "https://splatoon3.ink/data/" // Thank god there is an API
internal var cachedSplatfestData = mutableListOf<SplatfestData>()
internal var cachedMapData = mutableMapOf<Int, MapData>()
internal var cachedRegularModeData = mutableListOf<ModeData>()
internal var cachedCompetitiveSeriesModeData = mutableListOf<ModeData>()
internal var cachedCompetitiveOpenModeData = mutableListOf<ModeData>()
internal var cachedXModeData = mutableListOf<ModeData>()
internal var cachedChallengesData = mutableListOf<ChallengeModeData>()
internal var cachedShiftData = mutableListOf<ShiftData>()
internal var cachedBigRunShiftData = mutableListOf<ShiftData>()
internal var cachedCoopRewardsData = mutableListOf<CoopGearData>()
internal var cachedSplatnetItemData = mutableListOf<SplatnetItemData>()
internal var cachedSplatnetLimitedItemData = mutableListOf<SplatnetItemData>()
internal lateinit var splatnetShopBrandData: BrandData
internal lateinit var splatnetShopNextBrandData: BrandData
fun updateData(dataType: ApiDataType, requestType: ApiRequestType) {
Logger.out("Updating data for $dataType with USER-AGENT: $user_agent")
Logger.out("Reason for update: $requestType")
when (dataType) {
ApiDataType.SCHEDULES -> {
updateScheduleCache(user_agent)
}
ApiDataType.SPLATNETGEAR -> {
updateSplatnetGearCache(user_agent)
}
ApiDataType.COOP -> {
updateCOOPCache(user_agent)
}
ApiDataType.SPLATFESTS -> {
updateSplatfestCache(user_agent)
}
ApiDataType.ALL -> {
updateScheduleCache(user_agent)
updateSplatnetGearCache(user_agent)
updateSplatfestCache(user_agent)
updateCOOPCache(user_agent)
}
}
Logger.out("Finished updating data for $dataType")
}
private fun updateSplatnetGearCache(uag: String) {
val apiResponse = NetUtil.GETJsonData("${base_url}gear.json", uag)
if (apiResponse.startsWith("Error")) {
Logger.out("Error getting splatnet data: $apiResponse")
return
}
val json = Json.parseToJsonElement(apiResponse)
val pickupBrandData = json.jsonObject["data"]!!.jsonObject["gesotown"]!!.jsonObject["pickupBrand"]!!.jsonObject
val brand = pickupBrandData["brand"]!!.jsonObject
splatnetShopBrandData =
BrandData(
brand["name"]!!.jsonPrimitive.content,
Url(pickupBrandData["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
GearAbilityData(
brand["usualGearPower"]!!.jsonObject["name"]!!.jsonPrimitive.content,
brand["usualGearPower"]!!.jsonObject["desc"]!!.jsonPrimitive.content,
Url(brand["usualGearPower"]!!.jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
pickupBrandData["saleEndTime"]!!.jsonPrimitive.content
)
val nextBrand = pickupBrandData["nextBrand"]!!.jsonObject
splatnetShopNextBrandData =
BrandData(
nextBrand["name"]!!.jsonPrimitive.content,
Url(pickupBrandData["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
null,
null
)
cachedSplatnetItemData = mutableListOf()
val items = pickupBrandData["brandGears"]!!.jsonArray
items.forEach {
val obj = it as JsonObject
val gear = it["gear"]!!.jsonObject
val primaryGearPower = gear["primaryGearPower"]!!.jsonObject
val additionalGearPowers = gear["additionalGearPowers"]!!.jsonArray
val additionalGearPowersList = mutableListOf<GearAbilityData>()
additionalGearPowers.forEach {
val ob = it as JsonObject
additionalGearPowersList.add(
GearAbilityData(
ob["name"]!!.jsonPrimitive.content,
null,
Url(ob["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
)
)
}
cachedSplatnetItemData.add(
SplatnetItemData(
obj["saleEndTime"]!!.jsonPrimitive.content,
obj["price"]!!.jsonPrimitive.int,
gear["__typename"]!!.jsonPrimitive.content,
gear["name"]!!.jsonPrimitive.content,
GearAbilityData(
primaryGearPower["name"]!!.jsonPrimitive.content,
null,
Url(primaryGearPower["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
additionalGearPowersList,
Url(gear["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
splatnetShopBrandData
)
)
}
Logger.out("Updated gear data")
val limitedItemData = json.jsonObject["data"]!!.jsonObject["gesotown"]!!.jsonObject["limitedGears"]!!.jsonArray
cachedSplatnetLimitedItemData = mutableListOf()
limitedItemData.forEach {
val obj = it as JsonObject
val gear = obj["gear"]!!.jsonObject
val additionalGearPowers = gear["additionalGearPowers"]!!.jsonArray
val additionalGearPowersList = mutableListOf<GearAbilityData>()
additionalGearPowers.forEach {
val ob = it as JsonObject
additionalGearPowersList.add(
GearAbilityData(
ob["name"]!!.jsonPrimitive.content,
null,
Url(ob["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
)
)
}
cachedSplatnetLimitedItemData.add(
SplatnetItemData(
obj["saleEndTime"]!!.jsonPrimitive.content,
obj["price"]!!.jsonPrimitive.int,
gear["__typename"]!!.jsonPrimitive.content,
gear["name"]!!.jsonPrimitive.content,
GearAbilityData(
gear["primaryGearPower"]!!.jsonObject["name"]!!.jsonPrimitive.content,
null,
Url(gear["primaryGearPower"]!!.jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
additionalGearPowersList,
Url(gear["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
splatnetShopBrandData
)
)
}
}
private fun updateCOOPCache(uag: String) {
val apiResponse = NetUtil.GETJsonData("${base_url}coop.json", uag)
if (apiResponse.startsWith("Error")) {
Logger.out("Error getting coop data: $apiResponse")
return
}
val json = Json.parseToJsonElement(apiResponse)
val data = json.jsonObject["data"]!!.jsonObject["coopResult"]!!.jsonObject["monthlyGear"]!!.jsonObject
cachedCoopRewardsData = mutableListOf()
cachedCoopRewardsData.add(
CoopGearData(
data["name"]!!.jsonPrimitive.content,
Url(data["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
data["__typename"]!!.jsonPrimitive.content
)
)
Logger.out("Updated COOP data")
}
private fun updateScheduleCache(uag: String) {
val apiResponse = NetUtil.GETJsonData("${base_url}schedules.json", uag)
if (apiResponse.startsWith("Error")) {
Logger.out("Error getting schedule data: $apiResponse")
return
}
val json = Json.decodeFromString(apiResponse) as JsonObject
val data = json["data"]!!.jsonObject
val mapList = data["vsStages"]!!.jsonObject["nodes"]!!.jsonArray
cachedMapData = mutableMapOf()
mapList.forEach {
val obj = it as JsonObject
val imageURL = Url(obj.jsonObject["originalImage"]!!.jsonObject["url"]!!.jsonPrimitive.content)
val id = obj.jsonObject["vsStageId"]!!.jsonPrimitive.int
cachedMapData[id] = MapData(
id,
imageURL,
it.jsonObject["name"]!!.jsonPrimitive.content
)
}
Logger.out("Updated maplist data")
val regularMatches = data["regularSchedules"]!!.jsonObject["nodes"]!!.jsonArray
cachedRegularModeData = mutableListOf()
regularMatches.forEach {
val obj = it as JsonObject
val setting = obj["regularMatchSetting"]!!.jsonObject
cachedRegularModeData.add(
ModeData(
obj["startTime"]!!.jsonPrimitive.content,
obj["endTime"]!!.jsonPrimitive.content,
setting["__typename"]!!.jsonPrimitive.content,
cachedMapData[setting["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
cachedMapData[setting["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
setting["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
setting["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
"TURF_WAR"
)
)
}
Logger.out("Updated Regular match data")
val compMatches = data["bankaraSchedules"]!!.jsonObject["nodes"]!!.jsonArray
cachedCompetitiveSeriesModeData = mutableListOf()
cachedCompetitiveOpenModeData = mutableListOf()
compMatches.forEach {
val obj = it as JsonObject
val setting = obj["bankaraMatchSettings"]!!.jsonArray
setting.forEach {
val ob = it as JsonObject
val mode = ob["bankaraMode"]!!.jsonPrimitive.content
if (mode == "CHALLENGE") {
cachedCompetitiveSeriesModeData.add(
ModeData(
obj["startTime"]!!.jsonPrimitive.content,
obj["endTime"]!!.jsonPrimitive.content,
ob["__typename"]!!.jsonPrimitive.content,
cachedMapData[ob["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
cachedMapData[ob["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
ob["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
ob["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
mode
)
)
} else if (mode == "OPEN") {
cachedCompetitiveOpenModeData.add(
ModeData(
obj["startTime"]!!.jsonPrimitive.content,
obj["endTime"]!!.jsonPrimitive.content,
ob["__typename"]!!.jsonPrimitive.content,
cachedMapData[ob["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
cachedMapData[ob["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
ob["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
ob["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
mode
)
)
}
}
}
Logger.out("Updated Competitive match data")
val xMatches = data["xSchedules"]!!.jsonObject["nodes"]!!.jsonArray
cachedXModeData = mutableListOf()
xMatches.forEach {
val obj = it as JsonObject
val setting = obj["xMatchSetting"]!!.jsonObject
cachedXModeData.add(
ModeData(
obj["startTime"]!!.jsonPrimitive.content,
obj["endTime"]!!.jsonPrimitive.content,
setting["__typename"]!!.jsonPrimitive.content,
cachedMapData[setting["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
cachedMapData[setting["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
setting["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
setting["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
"X"
)
)
}
Logger.out("Updated X match data")
val challengeData = data["eventSchedules"]!!.jsonObject["nodes"]!!.jsonArray
cachedChallengesData = mutableListOf()
challengeData.forEach {
val obj = it as JsonObject
val tpd = obj["timePeriods"]!!.jsonArray
val setting = obj["leagueMatchSetting"]!!.jsonObject
val event = setting["leagueMatchEvent"]!!.jsonObject
cachedChallengesData.add(
ChallengeModeData(
event["leagueMatchEventId"]!!.jsonPrimitive.content,
event["name"]!!.jsonPrimitive.content,
event["desc"]!!.jsonPrimitive.content,
event["regulation"]!!.jsonPrimitive.content,
cachedMapData[setting["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
cachedMapData[setting["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
setting["__typename"]!!.jsonPrimitive.content,
setting["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
setting["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
TimePeriodData(
tpd[0].jsonObject["startTime"]!!.jsonPrimitive.content,
tpd[0].jsonObject["endTime"]!!.jsonPrimitive.content
),
TimePeriodData(
tpd[1].jsonObject["startTime"]!!.jsonPrimitive.content,
tpd[1].jsonObject["endTime"]!!.jsonPrimitive.content
),
TimePeriodData(
tpd[2].jsonObject["startTime"]!!.jsonPrimitive.content,
tpd[2].jsonObject["endTime"]!!.jsonPrimitive.content
)
)
)
}
Logger.out("Updated Challenge data")
val shiftData = data["coopGroupingSchedule"]!!.jsonObject["regularSchedules"]!!.jsonObject["nodes"]!!.jsonArray
cachedShiftData = mutableListOf()
shiftData.forEach {
val obj = it as JsonObject
val setting = obj["setting"]!!.jsonObject
val stage = setting["coopStage"]!!.jsonObject
val weapons = setting["weapons"]!!.jsonArray
cachedShiftData.add(
ShiftData(
obj["startTime"]!!.jsonPrimitive.content,
obj["endTime"]!!.jsonPrimitive.content,
obj["__splatoon3ink_king_salmonid_guess"]!!.jsonPrimitive.content,
setting["__typename"]!!.jsonPrimitive.content,
stage["name"]!!.jsonPrimitive.content,
Url(stage["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
WeaponData(
weapons[0].jsonObject["name"]!!.jsonPrimitive.content,
Url(weapons[0].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
WeaponData(
weapons[1].jsonObject["name"]!!.jsonPrimitive.content,
Url(weapons[1].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
WeaponData(
weapons[2].jsonObject["name"]!!.jsonPrimitive.content,
Url(weapons[2].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
WeaponData(
weapons[3].jsonObject["name"]!!.jsonPrimitive.content,
Url(weapons[3].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
)
)
)
}
val bigRunData = data["coopGroupingSchedule"]!!.jsonObject["bigRunSchedules"]!!.jsonObject["nodes"]!!.jsonArray
cachedBigRunShiftData = mutableListOf()
bigRunData.forEach {
val obj = it as JsonObject
val setting = obj["setting"]!!.jsonObject
val stage = setting["coopStage"]!!.jsonObject
val weapons = setting["weapons"]!!.jsonArray
cachedBigRunShiftData.add(
ShiftData(
obj["startTime"]!!.jsonPrimitive.content,
obj["endTime"]!!.jsonPrimitive.content,
obj["__splatoon3ink_king_salmonid_guess"]!!.jsonPrimitive.content,
setting["__typename"]!!.jsonPrimitive.content,
stage["name"]!!.jsonPrimitive.content,
Url(stage["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
WeaponData(
weapons[0].jsonObject["name"]!!.jsonPrimitive.content,
Url(weapons[0].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
WeaponData(
weapons[1].jsonObject["name"]!!.jsonPrimitive.content,
Url(weapons[1].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
WeaponData(
weapons[2].jsonObject["name"]!!.jsonPrimitive.content,
Url(weapons[2].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
),
WeaponData(
weapons[3].jsonObject["name"]!!.jsonPrimitive.content,
Url(weapons[3].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
)
)
)
}
Logger.out("Updated big run data")
Logger.out("Updated all Schedules")
}
private fun updateSplatfestCache(uag: String) {
val apiResponse = NetUtil.GETJsonData("${base_url}festivals.json", uag)
if (apiResponse.startsWith("Error")) {
Logger.out("Error getting splatfest data: $apiResponse")
return
}
val json = Json.decodeFromString(apiResponse) as JsonObject
val festivals = json["US"]!!.jsonObject["data"]!!.jsonObject["festRecords"]!!.jsonObject["nodes"]!!.jsonArray
cachedSplatfestData = mutableListOf()
festivals.forEach {
val fest = it as JsonObject
val teams = fest.jsonObject["teams"]!!.jsonArray
val team1 = teams[0].jsonObject
val team1Color = team1["color"]!!.jsonObject
var team1Result: JsonObject? = null
if (team1["result"] !is JsonNull) {
team1Result = team1["result"]!!.jsonObject
}
val team2 = teams[1].jsonObject
val team2Color = team2["color"]!!.jsonObject
var team2Result: JsonObject? = null
if (team2["result"] !is JsonNull) {
team2Result = team2["result"]!!.jsonObject
}
val team3 = teams[2].jsonObject
val team3Color = team3["color"]!!.jsonObject
var team3Result: JsonObject? = null
if (team3["result"] !is JsonNull) {
team3Result = team3["result"]!!.jsonObject
}
cachedSplatfestData.add(
SplatfestData(
fest.jsonObject["id"]!!.jsonPrimitive.content,
fest.jsonObject["state"]!!.jsonPrimitive.content,
fest.jsonObject["startTime"]!!.jsonPrimitive.content,
fest.jsonObject["endTime"]!!.jsonPrimitive.content,
fest.jsonObject["title"]!!.jsonPrimitive.content,
Url(fest.jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
SplatfestTeamData(
team1["teamName"]!!.jsonPrimitive.content,
SplatfestColor(
team1Color["a"]!!.jsonPrimitive.int,
team1Color["b"]!!.jsonPrimitive.double,
team1Color["g"]!!.jsonPrimitive.double,
team1Color["r"]!!.jsonPrimitive.double
),
if (team1Result.isNullOrEmpty() || team1Result["tricolorContributionRatio"]!!.jsonPrimitive.doubleOrNull == null)
null
else SplatfestTeamResults(
team1Result["isWinner"]!!.jsonPrimitive.boolean,
team1Result["horagaiRatio"]!!.jsonPrimitive.double,
team1Result["isHoragaiRatioTop"]!!.jsonPrimitive.boolean,
team1Result["voteRatio"]!!.jsonPrimitive.double,
team1Result["isVoteRatioTop"]!!.jsonPrimitive.boolean,
team1Result["regularContributionRatio"]!!.jsonPrimitive.double,
team1Result["isRegularContributionRatioTop"]!!.jsonPrimitive.boolean,
team1Result["challengeContributionRatio"]!!.jsonPrimitive.double,
team1Result["isChallengeContributionRatioTop"]!!.jsonPrimitive.boolean,
team1Result["tricolorContributionRatio"]!!.jsonPrimitive.double,
team1Result["isTricolorContributionRatioTop"]!!.jsonPrimitive.boolean,
)
),
SplatfestTeamData(
team2["teamName"]!!.jsonPrimitive.content,
SplatfestColor(
team2Color["a"]!!.jsonPrimitive.int,
team2Color["b"]!!.jsonPrimitive.double,
team2Color["g"]!!.jsonPrimitive.double,
team2Color["r"]!!.jsonPrimitive.double
),
if (team2Result.isNullOrEmpty() || team2Result["tricolorContributionRatio"]!!.jsonPrimitive.doubleOrNull == null)
null
else SplatfestTeamResults(
team2Result["isWinner"]!!.jsonPrimitive.boolean,
team2Result["horagaiRatio"]!!.jsonPrimitive.double,
team2Result["isHoragaiRatioTop"]!!.jsonPrimitive.boolean,
team2Result["voteRatio"]!!.jsonPrimitive.double,
team2Result["isVoteRatioTop"]!!.jsonPrimitive.boolean,
team2Result["regularContributionRatio"]!!.jsonPrimitive.double,
team2Result["isRegularContributionRatioTop"]!!.jsonPrimitive.boolean,
team2Result["challengeContributionRatio"]!!.jsonPrimitive.double,
team2Result["isChallengeContributionRatioTop"]!!.jsonPrimitive.boolean,
team2Result["tricolorContributionRatio"]!!.jsonPrimitive.double,
team2Result["isTricolorContributionRatioTop"]!!.jsonPrimitive.boolean,
)
),
SplatfestTeamData(
team3["teamName"]!!.jsonPrimitive.content,
SplatfestColor(
team3Color["a"]!!.jsonPrimitive.int,
team3Color["b"]!!.jsonPrimitive.double,
team3Color["g"]!!.jsonPrimitive.double,
team3Color["r"]!!.jsonPrimitive.double
),
if (team3Result.isNullOrEmpty() || team3Result["tricolorContributionRatio"]!!.jsonPrimitive.doubleOrNull == null)
null
else SplatfestTeamResults(
team3Result["isWinner"]!!.jsonPrimitive.boolean,
team3Result["horagaiRatio"]!!.jsonPrimitive.double,
team3Result["isHoragaiRatioTop"]!!.jsonPrimitive.boolean,
team3Result["voteRatio"]!!.jsonPrimitive.double,
team3Result["isVoteRatioTop"]!!.jsonPrimitive.boolean,
team3Result["regularContributionRatio"]!!.jsonPrimitive.double,
team3Result["isRegularContributionRatioTop"]!!.jsonPrimitive.boolean,
team3Result["challengeContributionRatio"]!!.jsonPrimitive.double,
team3Result["isChallengeContributionRatioTop"]!!.jsonPrimitive.boolean,
team3Result["tricolorContributionRatio"]!!.jsonPrimitive.double,
team3Result["isTricolorContributionRatioTop"]!!.jsonPrimitive.boolean,
)
),
)
)
}
Logger.out("Updated Splatfest data")
}
}

View file

@ -0,0 +1,28 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data.api.entry.coop
import io.ktor.http.*
data class CoopGearData(
val name: String,
val image: Url,
val __typename: String,
)

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,24 +16,19 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.schedule
data class ChallengeModeData(
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, val leagueMatchEventId: String,
@SerialName("name")
val name: String, val name: String,
@SerialName("regulation") val description: String,
val regulation: String, val regulation: String,
@SerialName("regulationUrl") val map1: MapData?,
val regulationUrl: String? // is null val map2: MapData?,
val __typename: String,
val ruleSet: String,
val ruleSetName: String,
val timePeriod1: TimePeriodData,
val timePeriod2: TimePeriodData,
val timePeriod3: TimePeriodData,
) )

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,14 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.schedule
import io.ktor.http.*
import kotlinx.serialization.SerialName data class MapData(
import kotlinx.serialization.Serializable val stageID: Int,
val image: Url,
@Serializable val name: String,
data class Image(
@SerialName("url")
val url: String
) )

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,16 +16,15 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.schedule
data class ModeData(
import kotlinx.serialization.SerialName val startTime: String,
import kotlinx.serialization.Serializable
@Serializable
data class TimePeriod(
@SerialName("endTime")
val endTime: String, val endTime: String,
@SerialName("startTime") val matchType: String,
val startTime: String val map1: MapData?,
val map2: MapData?,
val ruleSetName: String,
val ruleSet: String,
val mode: String,
) )

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,18 +16,19 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.schedule
import io.ktor.http.*
import kotlinx.serialization.SerialName data class ShiftData(
import kotlinx.serialization.Serializable val startTime: String,
@Serializable
data class FestNode(
@SerialName("endTime")
val endTime: String, val endTime: String,
@SerialName("festMatchSettings") val __splatoon3ink_king_salmonid_guess: String,
val festMatchSettings: FestMatchSettingX?, val __typename: String,
@SerialName("startTime") val stageName: String,
val startTime: String val image: Url,
val weapon1: WeaponData,
val weapon2: WeaponData,
val weapon3: WeaponData,
val weapon4: WeaponData,
) )

View file

@ -0,0 +1,24 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data.api.entry.schedule
data class TimePeriodData(
val startTime: String,
val endTime: String,
)

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,14 +16,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.schedule
import io.ktor.http.*
import kotlinx.serialization.SerialName data class WeaponData(
import kotlinx.serialization.Serializable val name: String,
val image: Url,
@Serializable
data class UserIcon(
@SerialName("url")
val url: String
) )

View file

@ -0,0 +1,26 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data.api.entry.splatfest
data class SplatfestColor(
val a: Int,
val b: Double,
val g: Double,
val r: Double,
)

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,18 +16,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.splatfest
import io.ktor.http.*
import kotlinx.serialization.SerialName data class SplatfestData(
import kotlinx.serialization.Serializable
@Serializable
data class Team(
@SerialName("color")
val color: Color,
@SerialName("id")
val id: String, val id: String,
// @SerialName("myVoteState") val state: String,
// val myVoteState: Any? val startTime: String,
val endTime: String,
val title: String,
val image: Url,
val team1: SplatfestTeamData,
val team2: SplatfestTeamData,
val team3: SplatfestTeamData,
) )

View file

@ -0,0 +1,25 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data.api.entry.splatfest
data class SplatfestTeamData(
val teamName: String,
val color: SplatfestColor,
val results: SplatfestTeamResults?,
)

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,16 +16,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.splatfest
data class SplatfestTeamResults(
import kotlinx.serialization.SerialName val isWinner: Boolean,
import kotlinx.serialization.Serializable val horagaiRatio: Double,
val horagaiRatioTop: Boolean,
@Serializable val voteRatio: Double,
data class Boss( val voteRatioTop: Boolean,
@SerialName("id") val regularRatio: Double,
val id: String, val regularRatioTop: Boolean,
@SerialName("name") val challengeRatio: Double,
val name: String val challengeRatioTop: Boolean,
val tricolorRatio: Double,
val tricolorRatioTop: Boolean,
) )

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,14 +16,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.splatnet
import io.ktor.http.*
import kotlinx.serialization.SerialName data class BrandData(
import kotlinx.serialization.Serializable val name: String,
val image: Url,
@Serializable val usualGearPower: GearAbilityData?,
data class BannerImage( val saleEndTime: String?,
@SerialName("url")
val url: String,
) )

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,14 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.splatnet
import io.ktor.http.*
import kotlinx.serialization.SerialName data class GearAbilityData(
import kotlinx.serialization.Serializable val name: String,
val description: String?,
@Serializable val image: Url,
data class OriginalImage(
@SerialName("url")
val url: String
) )

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,18 +16,17 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.entry.splatnet
import io.ktor.http.*
import kotlinx.serialization.SerialName data class SplatnetItemData(
import kotlinx.serialization.Serializable val saleEndTime: String,
val price: Int,
@Serializable val typeName: String,
data class VsRule(
@SerialName("id")
val id: String,
@SerialName("name")
val name: String, val name: String,
@SerialName("rule") val primaryGearPower: GearAbilityData,
val rule: String val additionalGearPowers: List<GearAbilityData>,
val image: Url,
val brand: BrandData,
) )

View file

@ -0,0 +1,27 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data.api.type
enum class ApiDataType {
SCHEDULES,
SPLATNETGEAR,
COOP,
SPLATFESTS,
ALL
}

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,14 +16,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.api.splatoon3ink.schedules package net.moonleay.lilJudd.data.api.type
enum class ApiRequestType(val nameToDisplay: String) {
import kotlinx.serialization.SerialName AUTOMATIC_CACHE_UPDATE("automatic request to update the cache"),
import kotlinx.serialization.Serializable AUTOMATIC_CACHE_CREATION_AT_STARTUP("automatic request to create cache at startup"),
MANUAL("manual request"),
@Serializable DEBUG("debug request")
data class BankaraSchedules( }
@SerialName("nodes")
val nodes: List<BankaraNode>
)

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,13 +16,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database package net.moonleay.lilJudd.data.database
import net.moonleay.liljudd.data.database.tables.MatchPlanningData import net.moonleay.lilJudd.data.database.tables.MatchPlanningData
import net.moonleay.liljudd.data.database.tables.PlanningNotifierRoles import net.moonleay.lilJudd.data.database.tables.PlanningNotifierRoles
import net.moonleay.liljudd.data.database.tables.TimePlanningChannels import net.moonleay.lilJudd.data.database.tables.TimePlanningChannels
import net.moonleay.liljudd.data.database.tables.TimePlanningMessages import net.moonleay.lilJudd.data.database.tables.TimePlanningMessages
import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.SchemaUtils import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.entry package net.moonleay.lilJudd.data.database.entry
data class MatchPlanningDataData( data class MatchPlanningDataData(
val id: Int, val id: Int,

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.entry package net.moonleay.lilJudd.data.database.entry
data class PlanningNotifierRolesData( data class PlanningNotifierRolesData(
val id: Int, // The id of the entry val id: Int, // The id of the entry

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.entry package net.moonleay.lilJudd.data.database.entry
data class TimePlanningChannelsData( data class TimePlanningChannelsData(
val id: Int, val id: Int,

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.entry package net.moonleay.lilJudd.data.database.entry
data class TimePlanningMessagesData( data class TimePlanningMessagesData(
val id: Int, // The id of the entry val id: Int, // The id of the entry

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,15 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.repository package net.moonleay.lilJudd.data.database.repository
import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData import net.moonleay.lilJudd.data.database.entry.MatchPlanningDataData
import net.moonleay.liljudd.data.database.tables.MatchPlanningData import net.moonleay.lilJudd.data.database.tables.MatchPlanningData
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq 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 import org.jetbrains.exposed.sql.transactions.transaction
object MatchPlanningDataRepository { object MatchPlanningDataRepository {
@ -54,7 +51,7 @@ object MatchPlanningDataRepository {
fun get(id: Int): MatchPlanningDataData? = fun get(id: Int): MatchPlanningDataData? =
transaction { transaction {
MatchPlanningData.selectAll().where { MatchPlanningData.id eq id }.firstOrNull()?.let { MatchPlanningData.select { MatchPlanningData.id eq id }.firstOrNull()?.let {
MatchPlanningDataData( MatchPlanningDataData(
it[MatchPlanningData.id], it[MatchPlanningData.id],
it[MatchPlanningData.serverid], it[MatchPlanningData.serverid],
@ -72,7 +69,7 @@ object MatchPlanningDataRepository {
fun getFromMessageInChannelInServer(messageID: Long, channelID: Long, serverID: Long): MatchPlanningDataData? = fun getFromMessageInChannelInServer(messageID: Long, channelID: Long, serverID: Long): MatchPlanningDataData? =
transaction { transaction {
MatchPlanningData.selectAll().where { MatchPlanningData.select {
MatchPlanningData.messageid eq (messageID) and ( MatchPlanningData.messageid eq (messageID) and (
MatchPlanningData.serverid eq (serverID)) and ( MatchPlanningData.serverid eq (serverID)) and (
MatchPlanningData.channelid eq (channelID)) MatchPlanningData.channelid eq (channelID))
@ -101,15 +98,15 @@ object MatchPlanningDataRepository {
fun write(data: MatchPlanningDataData): Int = fun write(data: MatchPlanningDataData): Int =
transaction { transaction {
MatchPlanningData.insert { MatchPlanningData.insert {
it[serverid] = data.serverID it[MatchPlanningData.serverid] = data.serverID
it[channelid] = data.channelID it[MatchPlanningData.channelid] = data.channelID
it[matchtype] = data.matchType it[MatchPlanningData.matchtype] = data.matchType
it[registererid] = data.registererID it[MatchPlanningData.registererid] = data.registererID
it[roleid] = data.roleID it[MatchPlanningData.roleid] = data.roleID
it[opponentName] = data.opponentName it[MatchPlanningData.opponentName] = data.opponentName
it[messageid] = data.messageID it[MatchPlanningData.messageid] = data.messageID
it[timestamp] = data.timestamp it[MatchPlanningData.timestamp] = data.timestamp
it[jobstr] = data.jobString it[MatchPlanningData.jobstr] = data.jobString
} get MatchPlanningData.id } get MatchPlanningData.id
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,15 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.repository package net.moonleay.lilJudd.data.database.repository
import net.moonleay.liljudd.data.database.entry.PlanningNotifierRolesData import net.moonleay.lilJudd.data.database.entry.PlanningNotifierRolesData
import net.moonleay.liljudd.data.database.tables.PlanningNotifierRoles import net.moonleay.lilJudd.data.database.tables.PlanningNotifierRoles
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq 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 import org.jetbrains.exposed.sql.transactions.transaction
object PlanningNotifierRolesRepository { object PlanningNotifierRolesRepository {
@ -49,7 +46,9 @@ object PlanningNotifierRolesRepository {
fun getForChannel(channelID: Long): PlanningNotifierRolesData? = fun getForChannel(channelID: Long): PlanningNotifierRolesData? =
transaction { transaction {
PlanningNotifierRoles.selectAll().where { PlanningNotifierRoles.channelid eq channelID }.firstOrNull()?.let { PlanningNotifierRoles.select {
PlanningNotifierRoles.channelid eq channelID
}.firstOrNull()?.let {
PlanningNotifierRolesData( PlanningNotifierRolesData(
it[PlanningNotifierRoles.id], it[PlanningNotifierRoles.id],
it[PlanningNotifierRoles.serverid], it[PlanningNotifierRoles.serverid],
@ -62,9 +61,9 @@ object PlanningNotifierRolesRepository {
fun getForChannelInServer(channelID: Long, serverID: Long): PlanningNotifierRolesData? = fun getForChannelInServer(channelID: Long, serverID: Long): PlanningNotifierRolesData? =
transaction { transaction {
PlanningNotifierRoles.selectAll() PlanningNotifierRoles.select {
.where { PlanningNotifierRoles.channelid eq channelID and (PlanningNotifierRoles.serverid eq serverID) } PlanningNotifierRoles.channelid eq channelID and (PlanningNotifierRoles.serverid eq serverID)
.firstOrNull()?.let { }.firstOrNull()?.let {
PlanningNotifierRolesData( PlanningNotifierRolesData(
it[PlanningNotifierRoles.id], it[PlanningNotifierRoles.id],
it[PlanningNotifierRoles.serverid], it[PlanningNotifierRoles.serverid],
@ -77,23 +76,22 @@ object PlanningNotifierRolesRepository {
fun existsInChannel(channelID: Long): Boolean = fun existsInChannel(channelID: Long): Boolean =
transaction { transaction {
PlanningNotifierRoles.selectAll().where { PlanningNotifierRoles.channelid eq channelID }.count() > 0 PlanningNotifierRoles.select { PlanningNotifierRoles.channelid eq channelID }.count() > 0
} }
fun existsInChannelFromSever(channelID: Long, serverID: Long): Boolean = fun existsInChannelFromSever(channelID: Long, serverID: Long): Boolean =
transaction { transaction {
PlanningNotifierRoles.selectAll() PlanningNotifierRoles.select { PlanningNotifierRoles.channelid eq channelID and (PlanningNotifierRoles.serverid eq serverID) }
.where { PlanningNotifierRoles.channelid eq channelID and (PlanningNotifierRoles.serverid eq serverID) }
.count() > 0 .count() > 0
} }
fun write(data: PlanningNotifierRolesData) { fun write(data: PlanningNotifierRolesData) {
transaction { transaction {
PlanningNotifierRoles.insert { PlanningNotifierRoles.insert {
it[serverid] = data.serverID it[PlanningNotifierRoles.serverid] = data.serverID
it[channelid] = data.channelID it[PlanningNotifierRoles.channelid] = data.channelID
it[hastimeroleid] = data.hasTimeRoleID it[PlanningNotifierRoles.hastimeroleid] = data.hasTimeRoleID
it[wantstobenotifiedid] = data.wantsToBeNotifiedID it[PlanningNotifierRoles.wantstobenotifiedid] = data.wantsToBeNotifiedID
} get PlanningNotifierRoles.id } get PlanningNotifierRoles.id
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,15 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.repository package net.moonleay.lilJudd.data.database.repository
import net.moonleay.liljudd.data.database.entry.TimePlanningChannelsData import net.moonleay.lilJudd.data.database.entry.TimePlanningChannelsData
import net.moonleay.liljudd.data.database.tables.TimePlanningChannels import net.moonleay.lilJudd.data.database.tables.TimePlanningChannels
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq 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 import org.jetbrains.exposed.sql.transactions.transaction
object TimePlanningChannelsRepository { object TimePlanningChannelsRepository {
@ -46,8 +43,7 @@ object TimePlanningChannelsRepository {
fun exists(channelID: Long, serverID: Long): Boolean = fun exists(channelID: Long, serverID: Long): Boolean =
transaction { transaction {
TimePlanningChannels.selectAll() TimePlanningChannels.select { TimePlanningChannels.channelid eq channelID and (TimePlanningChannels.serverid eq serverID) }
.where { TimePlanningChannels.channelid eq channelID and (TimePlanningChannels.serverid eq serverID) }
.firstOrNull() != null .firstOrNull() != null
} }
@ -59,15 +55,15 @@ object TimePlanningChannelsRepository {
fun deleteFromChannelInServer(channelID: Long, serverID: Long) { fun deleteFromChannelInServer(channelID: Long, serverID: Long) {
transaction { transaction {
TimePlanningChannels.deleteWhere { channelid eq channelID and (serverid eq serverID) } TimePlanningChannels.deleteWhere { TimePlanningChannels.channelid eq channelID and (TimePlanningChannels.serverid eq serverID) }
} }
} }
fun write(data: TimePlanningChannelsData): Int = fun write(data: TimePlanningChannelsData): Int =
transaction { transaction {
TimePlanningChannels.insert { TimePlanningChannels.insert {
it[serverid] = data.serverID it[TimePlanningChannels.serverid] = data.serverID
it[channelid] = data.channelID it[TimePlanningChannels.channelid] = data.channelID
} get TimePlanningChannels.id } get TimePlanningChannels.id
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,13 +16,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.repository package net.moonleay.lilJudd.data.database.repository
import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData import net.moonleay.lilJudd.data.database.entry.TimePlanningMessagesData
import net.moonleay.liljudd.data.database.tables.TimePlanningMessages import net.moonleay.lilJudd.data.database.tables.TimePlanningMessages
import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.insert import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.select
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
object TimePlanningMessagesRepository { object TimePlanningMessagesRepository {
@ -40,7 +40,9 @@ object TimePlanningMessagesRepository {
fun getWeek(stamp: Long): List<TimePlanningMessagesData> { fun getWeek(stamp: Long): List<TimePlanningMessagesData> {
val dataList = mutableListOf<TimePlanningMessagesData>() val dataList = mutableListOf<TimePlanningMessagesData>()
transaction { transaction {
for (pnr in TimePlanningMessages.selectAll().where { TimePlanningMessages.weekstamp eq (stamp) }) { for (pnr in TimePlanningMessages.select {
TimePlanningMessages.weekstamp eq (stamp)
}) {
dataList.add( dataList.add(
TimePlanningMessagesData( TimePlanningMessagesData(
pnr[TimePlanningMessages.id], pnr[TimePlanningMessages.id],
@ -57,8 +59,9 @@ object TimePlanningMessagesRepository {
fun getWeekInChannel(stamp: Long, channelID: Long): TimePlanningMessagesData? = fun getWeekInChannel(stamp: Long, channelID: Long): TimePlanningMessagesData? =
transaction { transaction {
TimePlanningMessages.selectAll() TimePlanningMessages.select {
.where { TimePlanningMessages.weekstamp eq (stamp) and (TimePlanningMessages.channelid eq channelID) }.firstOrNull()?.let { TimePlanningMessages.weekstamp eq (stamp) and (TimePlanningMessages.channelid eq channelID)
}.firstOrNull()?.let {
TimePlanningMessagesData( TimePlanningMessagesData(
it[TimePlanningMessages.id], it[TimePlanningMessages.id],
it[TimePlanningMessages.serverid], it[TimePlanningMessages.serverid],

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.tables package net.moonleay.lilJudd.data.database.tables
import org.jetbrains.exposed.sql.Table import org.jetbrains.exposed.sql.Table

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.tables package net.moonleay.lilJudd.data.database.tables
import org.jetbrains.exposed.sql.Table import org.jetbrains.exposed.sql.Table

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.tables package net.moonleay.lilJudd.data.database.tables
import org.jetbrains.exposed.sql.Table import org.jetbrains.exposed.sql.Table

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.data.database.tables package net.moonleay.lilJudd.data.database.tables
import org.jetbrains.exposed.sql.Table import org.jetbrains.exposed.sql.Table

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,22 +16,22 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.extensions package net.moonleay.lilJudd.extensions
import com.kotlindiscord.kord.extensions.commands.Arguments import com.kotlindiscord.kord.extensions.commands.Arguments
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.impl.enumChoice 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.commands.converters.impl.channel
import com.kotlindiscord.kord.extensions.extensions.Extension import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.types.respond
import com.kotlindiscord.kord.extensions.utils.hasPermission import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.entity.Permission import dev.kord.common.entity.Permission
import dev.kord.rest.builder.message.embed import net.moonleay.lilJudd.extensions.component.EnableOrDisable
import net.moonleay.liljudd.extensions.component.EnableOrDisable import net.moonleay.lilJudd.features.component.FeatureEnum
import net.moonleay.liljudd.features.component.FeatureEnum import net.moonleay.lilJudd.features.component.FeatureManager
import net.moonleay.liljudd.features.component.FeatureManager import net.moonleay.lilJudd.util.EmbedColor
import net.moonleay.liljudd.util.EmbedColor import net.moonleay.lilJudd.util.Logger
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.util.MessageUtil
import net.moonleay.liljudd.util.MessageUtil
class FeatureManageExtension : Extension() { class FeatureManageExtension : Extension() {
@ -49,16 +49,14 @@ class FeatureManageExtension : Extension() {
val u = this.user val u = this.user
if (!u.asMember(this.guild!!.id).hasPermission(Permission.Administrator)) { if (!u.asMember(this.guild!!.id).hasPermission(Permission.Administrator)) {
this.respond { this.respond {
this.embed { embeds.add(
this.color = EmbedColor.ERROR.color MessageUtil.getEmbed(
this.title = "401: Not Authorized" EmbedColor.ERROR,
this.description = "403: Forbidden",
"You cannot edit features, as you don't have the Administrator permission." "You cannot edit features, as you don't have the Administrator permission.",
this.footer { u.asUser().username + "#" + u.asUser().discriminator
this.icon = u.asUser().avatar?.cdnUrl?.toUrl() )
this.text = MessageUtil.getFooter(u) )
}
}
} }
return@action return@action
} }
@ -70,45 +68,26 @@ class FeatureManageExtension : Extension() {
val f = FeatureManager.getFeature(args.feature) val f = FeatureManager.getFeature(args.feature)
if (f == null) { if (f == null) {
this.respond { this.respond {
this.embed { this.embeds.add(
this.color = EmbedColor.ERROR.color MessageUtil.getEmbed(
this.title = "404: Not Found" EmbedColor.ERROR,
this.description = "The feature you are trying to edit does not exist." "404: Not Found",
this.footer { "The feature you are trying to edit does not exist.",
this.icon = u.asUser().avatar?.cdnUrl?.toUrl() u.asUser().username + "#" + u.asUser().discriminator
this.text = MessageUtil.getFooter(u) )
} )
}
} }
return@action return@action
} }
if (this.arguments.setStatus == EnableOrDisable.ENABLE) { if (this.arguments.setStatus == EnableOrDisable.ENABLE) {
val enabled = f.enable(u, gID, cID, channel, args)
this.respond { this.respond {
this.embed { this.embeds.add(f.enable(u, gID, cID, channel, args))
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 return@action
} }
val disabled = f.disable(u, gID, cID, channel, args)
this.respond { this.respond {
this.embed { this.embeds.add(f.disable(u, gID, cID, channel, args))
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)
}
}
} }
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,13 +16,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.extensions package net.moonleay.lilJudd.extensions
import com.kotlindiscord.kord.extensions.extensions.Extension import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import dev.kord.rest.builder.message.embed import net.moonleay.botendo.build.BuildConstants
import net.moonleay.liljudd.build.BuildConstants import net.moonleay.lilJudd.util.EmbedColor
import net.moonleay.liljudd.util.EmbedColor import net.moonleay.lilJudd.util.MessageUtil
class InfoExtension : Extension() { class InfoExtension : Extension() {
override val name = "info" override val name = "info"
@ -31,17 +31,16 @@ class InfoExtension : Extension() {
name = "info" name = "info"
description = "Show infos about the bot" description = "Show infos about the bot"
this.action { this.action {
this.respond { MessageUtil.sendEmbedForPublicSlashCommand(
this.embed { this,
this.color = EmbedColor.INFO.color EmbedColor.INFO,
this.title = "Li'l Judd" "Lil' Judd",
this.description = "Li'l Judd ***v." + BuildConstants.version + "***\n" + "Lil' Judd ***v." + BuildConstants.version + "***\n" +
"Kord-Extensions ***v." + BuildConstants.kordVersion + "***\n" + "Kord-Extensions ***v." + BuildConstants.kordVersion + "***\n" +
"Coroutines ***v." + BuildConstants.coroutinesVersion + "***\n" + "Coroutines ***v." + BuildConstants.coroutinesVersion + "***\n" +
"Krontab ***v." + BuildConstants.krontabVersion + "***\n\n" + "Krontab ***v." + BuildConstants.krontabVersion + "***\n\n" +
"Splatoon 3 api data provided by splatoon3.ink" "Splatoon 3 api data provided by splatoon3.ink"
} )
}
} }
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,25 +16,27 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.extensions package net.moonleay.lilJudd.extensions
import com.kotlindiscord.kord.extensions.commands.Arguments import com.kotlindiscord.kord.extensions.commands.Arguments
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.impl.enumChoice 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.commands.converters.impl.string
import com.kotlindiscord.kord.extensions.extensions.Extension import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.types.respond
import dev.kord.core.behavior.channel.createMessage
import dev.kord.core.behavior.createRole import dev.kord.core.behavior.createRole
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.create.actionRow
import dev.kord.rest.builder.message.embed import net.moonleay.lilJudd.data.database.entry.MatchPlanningDataData
import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData import net.moonleay.lilJudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository import net.moonleay.lilJudd.extensions.component.MatchTypes
import net.moonleay.liljudd.extensions.component.MatchTypes import net.moonleay.lilJudd.jobs.MatchJob
import net.moonleay.liljudd.jobs.MatchJob import net.moonleay.lilJudd.jobs.component.JobManager
import net.moonleay.liljudd.jobs.component.JobManager import net.moonleay.lilJudd.util.EmbedColor
import net.moonleay.liljudd.util.EmbedColor import net.moonleay.lilJudd.util.EmbedUtil
import net.moonleay.liljudd.util.EmbedUtil import net.moonleay.lilJudd.util.MessageUtil
import net.moonleay.liljudd.util.MessageUtil import net.moonleay.lilJudd.util.TimeUtil
import net.moonleay.liljudd.util.TimeUtil
class MatchExtension : Extension() { class MatchExtension : Extension() {
@ -52,23 +54,26 @@ class MatchExtension : Extension() {
val m = this.member!! val m = this.member!!
val gID = this.guild!!.id.value val gID = this.guild!!.id.value
val cID = this.channel.id.value val cID = this.channel.id.value
val opponent = args.opponent val opponent = args.opponent ?: "?"
if (!TimeUtil.validateDateString(args.timeStamp)) { val msg = this.respond {
this.respond { this.embeds.add(
this.embed { MessageUtil.getEmbedWithTable(
this.color = EmbedColor.ERROR.color EmbedColor.INFO,
this.title = "400: Bad Request" args.matchType.readableName,
this.description = "The given timestamp is invalid.\n" + "***Vs. $opponent***\n" +
"Please use the format \"dd.MM.yyyy HH:mm\"." "At ${args.timeStamp}\n" +
this.footer { "Registered by ${m.mention}",
this.icon = m.asUser().avatar?.cdnUrl?.toUrl() mapOf(
this.text = MessageUtil.getFooter(m.asUser()) "Signed up" to listOf(),
"Unavailable" to listOf(),
)
)
)
this.actionRow {
this.components.addAll(EmbedUtil.getMatchButtons().components)
} }
} } // filter time to date:
}
return@action
}
// filter time to date:
val zdt = TimeUtil.getDateFromString(args.timeStamp) val zdt = TimeUtil.getDateFromString(args.timeStamp)
// get the string for the cronjob // get the string for the cronjob
val jobString = TimeUtil.getCronjobStringFromDate(zdt) val jobString = TimeUtil.getCronjobStringFromDate(zdt)
@ -80,47 +85,19 @@ class MatchExtension : Extension() {
} }
// Check if the role was created successfully // Check if the role was created successfully
if (role == null) { if (role == null) {
this.respond { this.channel.createMessage {
this.embed { this.embeds.add(
this.color = EmbedColor.ERROR.color MessageUtil.getEmbed(
this.title = "500: Internal Error" EmbedColor.ERROR,
this.description = "Could not find created role.\n" + "500: Internal Error",
"It seems, that said role could not be created." "Could not find created role.\n" +
this.footer { "It seems, that said role could not be created.",
this.icon = m.asUser().avatar?.cdnUrl?.toUrl() "system message"
this.text = MessageUtil.getFooter(m.asUser()) )
} )
}
} }
return@action 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( val tID = MatchPlanningDataRepository.write(
MatchPlanningDataData( MatchPlanningDataData(
0, 0,
@ -137,7 +114,6 @@ class MatchExtension : Extension() {
) )
if (tID == null || tID <= 0) { if (tID == null || tID <= 0) {
return@action // Not saved to db return@action // Not saved to db
// TODO: Add error message
} }
JobManager.addJob( JobManager.addJob(
MatchJob( MatchJob(
@ -164,7 +140,7 @@ class MatchExtension : Extension() {
this.description = "The timestamp of the match. Format \"dd.MM.yyyy HH:mm\"." this.description = "The timestamp of the match. Format \"dd.MM.yyyy HH:mm\"."
} }
val opponent by string { val opponent by optionalString {
this.name = "opponent" this.name = "opponent"
this.description = "The opponent" this.description = "The opponent"
} }

View file

@ -0,0 +1,80 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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 net.moonleay.lilJudd.extensions.component.SplatoonOnlineMode
import net.moonleay.lilJudd.util.Logger
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 -> {
}
SplatoonOnlineMode.REGULAR -> {
}
SplatoonOnlineMode.SERIES -> {
}
SplatoonOnlineMode.OPEN -> {
}
SplatoonOnlineMode.X -> {
}
SplatoonOnlineMode.SALMON_RUN -> {
}
}
Logger.out("Done")
}
}
}
inner class RotationArguments : Arguments() {
val mode by enumChoice<SplatoonOnlineMode> {
this.name = "mode"
this.description = "The mode you want to check the rotation for"
this.typeName = "en_US"
}
}
}

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,20 +16,19 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.extensions package net.moonleay.lilJudd.extensions
import com.kotlindiscord.kord.extensions.extensions.Extension import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.types.respond
import com.kotlindiscord.kord.extensions.utils.hasPermission import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.entity.Permission import dev.kord.common.entity.Permission
import dev.kord.core.behavior.channel.createMessage import dev.kord.core.behavior.channel.createMessage
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.create.actionRow
import dev.kord.rest.builder.message.embed
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.data.database.entry.TimePlanningMessagesData
import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData import net.moonleay.lilJudd.data.database.repository.TimePlanningMessagesRepository
import net.moonleay.liljudd.data.database.repository.TimePlanningMessagesRepository import net.moonleay.lilJudd.util.*
import net.moonleay.liljudd.util.*
import java.time.ZoneId import java.time.ZoneId
import java.time.ZonedDateTime import java.time.ZonedDateTime
@ -41,7 +40,7 @@ class SendPlannerExtension : Extension() {
get() = false get() = false
override suspend fun setup() { override suspend fun setup() {
publicSlashCommand { publicSlashCommand() {
name = "sendplanner" name = "sendplanner"
description = "Send the planner for the current week" description = "Send the planner for the current week"
this.action { this.action {
@ -49,31 +48,13 @@ class SendPlannerExtension : Extension() {
.hasPermission(Permission.Administrator) .hasPermission(Permission.Administrator)
) { ) {
val res = this.respond { val res = this.respond {
this.embed { this.content = "You need to be an administrator to use this command."
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() res.delete()
return@action return@action
} }
val res = this.respond { val res = this.respond {
this.embed { this.content = "OK."
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 res.delete() // Delete the response
val c = this.getChannel().asChannel() val c = this.getChannel().asChannel()
@ -83,19 +64,20 @@ class SendPlannerExtension : Extension() {
.withHour(4) .withHour(4)
.withMinute(0).withSecond(0) .withMinute(0).withSecond(0)
c.createMessage { c.createMessage {
this.embed { this.embeds.add(
this.color = EmbedColor.INFO.color MessageUtil.getEmbed(
this.title = "Time Planning Feature" EmbedColor.INFO,
this.description = "Do you have time on the following Days?" "Time Planning Feature",
this.footer { "Do you have time on the following Days?",
this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl() "Automated Message"
this.text = MessageUtil.getFooter() )
} )
}
} }
delay(1000) delay(1000)
repeat(7) { repeat(7) {
val eb = MessageUtil.getEmbedWithTable( val msg = c.createMessage {
this.embeds.add(
MessageUtil.getEmbedWithTable(
EmbedColor.INFO, EmbedColor.INFO,
"", "",
"${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday", "${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
@ -105,18 +87,7 @@ class SendPlannerExtension : Extension() {
"Is not 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.actionRow {
this.components.addAll(EmbedUtil.getTimePlannerButtons().components) this.components.addAll(EmbedUtil.getTimePlannerButtons().components)

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,17 +16,17 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.extensions package net.moonleay.lilJudd.extensions
import com.kotlindiscord.kord.extensions.extensions.Extension import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.types.respond
import com.kotlindiscord.kord.extensions.utils.hasPermission import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.entity.Permission import dev.kord.common.entity.Permission
import dev.kord.rest.builder.message.embed import net.moonleay.lilJudd.features.AvailabilityManager
import net.moonleay.liljudd.features.AvailabilityManager import net.moonleay.lilJudd.util.EmbedColor
import net.moonleay.liljudd.util.EmbedColor import net.moonleay.lilJudd.util.Logger
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.util.MessageUtil
import net.moonleay.liljudd.util.MessageUtil
class UpdateRolesExtension : Extension() { class UpdateRolesExtension : Extension() {
override val name = "updateroles" override val name = "updateroles"
@ -34,7 +34,7 @@ class UpdateRolesExtension : Extension() {
get() = false get() = false
override suspend fun setup() { override suspend fun setup() {
publicSlashCommand { publicSlashCommand() {
name = "updateroles" name = "updateroles"
description = "Update the roles of the members in the current server" description = "Update the roles of the members in the current server"
this.action { this.action {
@ -42,31 +42,30 @@ class UpdateRolesExtension : Extension() {
.hasPermission(Permission.Administrator) .hasPermission(Permission.Administrator)
) { ) {
this.respond { this.respond {
this.embed { this.embeds.add(
this.color = EmbedColor.ERROR.color MessageUtil.getEmbed(
this.title = "401: Not Authorized" EmbedColor.ERROR,
this.description = "403: Forbidden",
"You need the Administrator permission to use this command." "You need to be an administrator to use this command.",
this.footer { user.asUser().username + "#" + user.asUser().discriminator
this.icon = user.asUser().avatar?.cdnUrl?.toUrl() )
this.text = MessageUtil.getFooter(user) )
}
}
} }
return@action return@action
} }
this.respond { this.respond {
this.embed { this.embeds.add(
this.color = EmbedColor.INFO.color MessageUtil.getEmbed(
this.title = "200: Success" EmbedColor.SUCCESS,
this.description = "Updating roles.\n" + "200: Success",
"This may take a while, please be patient." "Updating roles.\n" +
this.footer { "This may take a while, please be patient.",
this.icon = user.asUser().avatar?.cdnUrl?.toUrl() user.asUser().username + "#" + user.asUser().discriminator
this.text = MessageUtil.getFooter(user) )
} )
}
} }
// -- below here is the code of the cronjob --
Logger.out("Starting to update roles...") Logger.out("Starting to update roles...")
AvailabilityManager.updateInChannel(this.channel.id) AvailabilityManager.updateInChannel(this.channel.id)

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.extensions.component package net.moonleay.lilJudd.extensions.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.extensions.component package net.moonleay.lilJudd.extensions.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.extensions.component package net.moonleay.lilJudd.extensions.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.features package net.moonleay.lilJudd.features
import com.kotlindiscord.kord.extensions.utils.isNullOrBot import com.kotlindiscord.kord.extensions.utils.isNullOrBot
import dev.inmo.krontab.buildSchedule import dev.inmo.krontab.buildSchedule
@ -29,22 +29,22 @@ import dev.kord.core.entity.channel.Channel
import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.MessageChannel
import dev.kord.gateway.PrivilegedIntent import dev.kord.gateway.PrivilegedIntent
import dev.kord.rest.builder.message.EmbedBuilder import dev.kord.rest.builder.message.EmbedBuilder
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.data.database.entry.PlanningNotifierRolesData import net.moonleay.lilJudd.data.database.entry.PlanningNotifierRolesData
import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData import net.moonleay.lilJudd.data.database.entry.TimePlanningMessagesData
import net.moonleay.liljudd.data.database.repository.PlanningNotifierRolesRepository import net.moonleay.lilJudd.data.database.repository.PlanningNotifierRolesRepository
import net.moonleay.liljudd.data.database.repository.TimePlanningMessagesRepository import net.moonleay.lilJudd.data.database.repository.TimePlanningMessagesRepository
import net.moonleay.liljudd.extensions.FeatureManageExtension import net.moonleay.lilJudd.extensions.FeatureManageExtension
import net.moonleay.liljudd.features.component.FeatureEnum import net.moonleay.lilJudd.features.component.FeatureEnum
import net.moonleay.liljudd.features.component.IFeature import net.moonleay.lilJudd.features.component.IFeature
import net.moonleay.liljudd.util.* import net.moonleay.lilJudd.util.*
import java.time.ZonedDateTime import java.time.ZonedDateTime
object AvailabilityManager : IFeature { object AvailabilityManager : IFeature {
// This runs during the cronjob. // This runs during the cronjob.
suspend fun runThread() { suspend fun runThread() {
Logger.out("Updating match roles") Logger.out("Starting to update roles...")
// ChannelID, Data // ChannelID, Data
val messages = TimePlanningMessagesRepository.getWeek(TimeUtil.getWeekStamp().toEpochSecond()) val messages = TimePlanningMessagesRepository.getWeek(TimeUtil.getWeekStamp().toEpochSecond())
@ -70,7 +70,7 @@ object AvailabilityManager : IFeature {
} }
this.updateInChannel(snf, data, roleData) this.updateInChannel(snf, data, roleData)
} }
Logger.out("Finished updating roles") Logger.out("Done! Until tomorrow! <3 ")
} }
suspend fun updateInChannel(snf: Snowflake) { suspend fun updateInChannel(snf: Snowflake) {
@ -162,7 +162,7 @@ object AvailabilityManager : IFeature {
// Register the cronjob to run at 1AM UTC every day // Register the cronjob to run at 1AM UTC every day
override suspend fun registerThread() { override suspend fun registerThread() {
Logger.out("Registering daily planning message role update coroutine") Logger.out("Adding availability scheduler...")
val scheduler = buildSchedule("0 0 2 * * *") // 0 0 4 * * * 0o 1w // 0o is UTC val scheduler = buildSchedule("0 0 2 * * *") // 0 0 4 * * * 0o 1w // 0o is UTC
scheduler.doInfinity { scheduler.doInfinity {
this.runThread() this.runThread()
@ -176,7 +176,7 @@ object AvailabilityManager : IFeature {
ch: Channel, ch: Channel,
args: FeatureManageExtension.FeatureManagerArgs args: FeatureManageExtension.FeatureManagerArgs
): EmbedBuilder { ): EmbedBuilder {
val alreadyExists = PlanningNotifierRolesRepository.existsInChannel(cID) var alreadyExists = PlanningNotifierRolesRepository.existsInChannel(cID)
// Check if the channel and guild already exist in the db // Check if the channel and guild already exist in the db
if (!alreadyExists) { if (!alreadyExists) {
// Create the roles in Discord // Create the roles in Discord

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,19 +16,19 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.features package net.moonleay.lilJudd.features
import dev.kord.common.entity.Snowflake import dev.kord.common.entity.Snowflake
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData import net.moonleay.lilJudd.data.database.entry.MatchPlanningDataData
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository import net.moonleay.lilJudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.jobs.MatchJob import net.moonleay.lilJudd.jobs.MatchJob
import net.moonleay.liljudd.jobs.component.JobManager import net.moonleay.lilJudd.jobs.component.JobManager
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.util.Logger
object MatchManager { object MatchManager {
suspend fun update() { suspend fun update() {
Logger.out("Updating matches") Logger.out("Updating match roles...")
val dataList = MatchPlanningDataRepository.getAll() val dataList = MatchPlanningDataRepository.getAll()
for (data in dataList) { for (data in dataList) {
@ -41,7 +41,7 @@ object MatchManager {
} }
this.registerJob(data) this.registerJob(data)
} }
Logger.out("Finished updating matches") Logger.out("Done. Until next time! <3 ")
} }
private fun registerJob(data: MatchPlanningDataData) { private fun registerJob(data: MatchPlanningDataData) {

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.features package net.moonleay.lilJudd.features
import dev.inmo.krontab.buildSchedule import dev.inmo.krontab.buildSchedule
import dev.inmo.krontab.doInfinity import dev.inmo.krontab.doInfinity
@ -26,22 +26,21 @@ import dev.kord.core.behavior.channel.createMessage
import dev.kord.core.entity.channel.Channel import dev.kord.core.entity.channel.Channel
import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.MessageChannel
import dev.kord.rest.builder.message.EmbedBuilder import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.actionRow import dev.kord.rest.builder.message.create.actionRow
import dev.kord.rest.builder.message.embed
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.data.database.entry.TimePlanningChannelsData import net.moonleay.lilJudd.data.database.entry.TimePlanningChannelsData
import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData import net.moonleay.lilJudd.data.database.entry.TimePlanningMessagesData
import net.moonleay.liljudd.data.database.repository.PlanningNotifierRolesRepository import net.moonleay.lilJudd.data.database.repository.PlanningNotifierRolesRepository
import net.moonleay.liljudd.data.database.repository.TimePlanningChannelsRepository import net.moonleay.lilJudd.data.database.repository.TimePlanningChannelsRepository
import net.moonleay.liljudd.data.database.repository.TimePlanningMessagesRepository import net.moonleay.lilJudd.data.database.repository.TimePlanningMessagesRepository
import net.moonleay.liljudd.extensions.FeatureManageExtension import net.moonleay.lilJudd.extensions.FeatureManageExtension
import net.moonleay.liljudd.features.component.FeatureEnum import net.moonleay.lilJudd.features.component.FeatureEnum
import net.moonleay.liljudd.features.component.IFeature import net.moonleay.lilJudd.features.component.IFeature
import net.moonleay.liljudd.util.EmbedColor import net.moonleay.lilJudd.util.EmbedColor
import net.moonleay.liljudd.util.EmbedUtil import net.moonleay.lilJudd.util.EmbedUtil
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.util.Logger
import net.moonleay.liljudd.util.MessageUtil import net.moonleay.lilJudd.util.MessageUtil
import java.time.ZoneId import java.time.ZoneId
import java.time.ZonedDateTime import java.time.ZonedDateTime
@ -52,7 +51,7 @@ object TimeManager : IFeature {
// Register the cronjob to run at 0:01 AM UTC every Monday // Register the cronjob to run at 0:01 AM UTC every Monday
override suspend fun registerThread() { override suspend fun registerThread() {
Logger.out("Registering weekly planning message posting coroutine") Logger.out("Adding message scheduler...")
val scheduler = buildSchedule("0 0 1 * * * 0o 1w") // 0 0 4 * * * 0o 1w // 0o is UTC val scheduler = buildSchedule("0 0 1 * * * 0o 1w") // 0 0 4 * * * 0o 1w // 0o is UTC
scheduler.doInfinity { scheduler.doInfinity {
this.runThread() this.runThread()
@ -60,7 +59,7 @@ object TimeManager : IFeature {
} }
private suspend fun runThread() { private suspend fun runThread() {
Logger.out("Starting to send out weekly planning messages") Logger.out("Starting to notify...")
// ChannelID -> Data // ChannelID -> Data
val targetedChannels = TimePlanningChannelsRepository.getAll().associateBy { it.channelID } val targetedChannels = TimePlanningChannelsRepository.getAll().associateBy { it.channelID }
@ -72,40 +71,40 @@ object TimeManager : IFeature {
for (ch2 in targetedChannels.keys) { for (ch2 in targetedChannels.keys) {
val ch = Snowflake(ch2) val ch = Snowflake(ch2)
if (Bot.bot.kordRef.getChannel(ch) == null) if (Bot.bot.kordRef.getChannel(ch) == null)
continue continue // TODO: Check if the channel is valid in another shard
val c = Bot.bot.kordRef.getChannelOf<MessageChannel>(ch)!! val c = Bot.bot.kordRef.getChannelOf<MessageChannel>(ch)!!
msgStr = "" msgStr = ""
if (targetedRoles != null && targetedRoles.keys.contains(ch2) && targetedRoles[ch2] != null) { if (targetedRoles != null && targetedRoles.keys.contains(ch2) && targetedRoles[ch2] != null) {
c.createMessage { c.createMessage {
this.content = this.content =
"The weekly planning starts now <@&${Snowflake(targetedRoles[ch2]?.wantsToBeNotifiedID!!)}>" "The weekly planning starts now <@&${Snowflake(targetedRoles[ch2]?.wantsToBeNotifiedID!!)}>"
this.embed { this.embeds.add(
this.color = EmbedColor.INFO.color MessageUtil.getEmbed(
this.title = "Time Planning Feature" EmbedColor.INFO,
this.description = "Do you have time on the following Days?" "Time Planning Feature",
this.footer { "Do you have time on the following Days?",
this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl() "Automated Message"
this.text = MessageUtil.getFooter() )
} )
}
} }
} else { } else {
c.createMessage { c.createMessage {
this.embed { this.embeds.add(
this.color = EmbedColor.INFO.color MessageUtil.getEmbed(
this.title = "Time Planning Feature" EmbedColor.INFO,
this.description = "Do you have time on the following Days?" "Time Planning Feature",
this.footer { "Do you have time on the following Days?",
this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl() "Automated Message"
this.text = MessageUtil.getFooter() )
} )
}
} }
} }
delay(2000) delay(2000)
var then = ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withHour(4).withMinute(0).withSecond(0) var then = ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withHour(4).withMinute(0).withSecond(0)
repeat(7) { repeat(7) {
val eb = MessageUtil.getEmbedWithTable( val msg = c.createMessage {
this.embeds.add(
MessageUtil.getEmbedWithTable(
EmbedColor.INFO, EmbedColor.INFO,
"", "",
"${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday", "${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
@ -115,17 +114,7 @@ object TimeManager : IFeature {
"Is not 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.actionRow {
this.components.addAll(EmbedUtil.getTimePlannerButtons().components) this.components.addAll(EmbedUtil.getTimePlannerButtons().components)
@ -133,7 +122,7 @@ object TimeManager : IFeature {
} }
msgStr += "${it}:${msg.id.value};" msgStr += "${it}:${msg.id.value};"
then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0) then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0)
Logger.out("Finished sending day $it in $ch") Logger.out("Finished sending day $it")
delay(1000) delay(1000)
} }
@ -166,14 +155,14 @@ object TimeManager : IFeature {
EmbedColor.SUCCESS, EmbedColor.SUCCESS,
"200: Success", "200: Success",
"The feature was enabled in channel ${args.channel.data.name.value}", "The feature was enabled in channel ${args.channel.data.name.value}",
u.asUser().username u.asUser().username + "#" + u.asUser().discriminator
) )
} }
return MessageUtil.getEmbed( return MessageUtil.getEmbed(
EmbedColor.ERROR, EmbedColor.ERROR,
"409: Conflict", "403: Forbidden",
"The feature is already enabled in this channel.", "The feature is already enabled in this channel.",
u.asUser().username u.asUser().username + "#" + u.asUser().discriminator
) )
} }
@ -186,21 +175,21 @@ object TimeManager : IFeature {
): EmbedBuilder { ): EmbedBuilder {
// Check if entry exists in db // Check if entry exists in db
if (TimePlanningChannelsRepository.exists(cID, gID)) { if (TimePlanningChannelsRepository.exists(cID, gID)) {
// delete all entries for this channel // delete all entrys for this channel
TimePlanningChannelsRepository.deleteFromChannelInServer(cID, gID) TimePlanningChannelsRepository.deleteFromChannelInServer(cID, gID)
return MessageUtil.getEmbed( return MessageUtil.getEmbed(
EmbedColor.SUCCESS, EmbedColor.SUCCESS,
"200: Success", "200: Success",
"The feature was disabled.", "The feature was disabled.",
u.asUser().username u.asUser().username + "#" + u.asUser().discriminator
) )
} }
// Do nothing; not in db // Do nothing; not in db
return MessageUtil.getEmbed( return MessageUtil.getEmbed(
EmbedColor.ERROR, EmbedColor.ERROR,
"409: Conflict", "403: Forbidden",
"The feature is already disabled in this channel.", "The feature is already disabled in this channel.",
u.asUser().username u.asUser().username + "#" + u.asUser().discriminator
) )
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.features.component package net.moonleay.lilJudd.features.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,10 +16,10 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.features.component package net.moonleay.lilJudd.features.component
import net.moonleay.liljudd.features.AvailabilityManager import net.moonleay.lilJudd.features.AvailabilityManager
import net.moonleay.liljudd.features.TimeManager import net.moonleay.lilJudd.features.TimeManager
object FeatureManager { object FeatureManager {
val features = mutableListOf(AvailabilityManager, TimeManager) // Stores all features val features = mutableListOf(AvailabilityManager, TimeManager) // Stores all features

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,12 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.features.component package net.moonleay.lilJudd.features.component
import dev.kord.core.behavior.UserBehavior import dev.kord.core.behavior.UserBehavior
import dev.kord.core.entity.channel.Channel import dev.kord.core.entity.channel.Channel
import dev.kord.rest.builder.message.EmbedBuilder import dev.kord.rest.builder.message.EmbedBuilder
import net.moonleay.liljudd.extensions.FeatureManageExtension import net.moonleay.lilJudd.extensions.FeatureManageExtension
interface IFeature { interface IFeature {
val feat: FeatureEnum val feat: FeatureEnum

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,17 +16,17 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.jobs package net.moonleay.lilJudd.jobs
import dev.inmo.krontab.KronScheduler import dev.inmo.krontab.KronScheduler
import dev.kord.common.entity.Snowflake import dev.kord.common.entity.Snowflake
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository import net.moonleay.lilJudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.jobs.component.CronjobType import net.moonleay.lilJudd.jobs.component.CronjobType
import net.moonleay.liljudd.jobs.component.ICronjob import net.moonleay.lilJudd.jobs.component.ICronjob
import net.moonleay.liljudd.jobs.component.JobManager import net.moonleay.lilJudd.jobs.component.JobManager
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.util.Logger
class MatchJob( class MatchJob(
override val jobIncoming: String, override val jobIncoming: String,

View file

@ -0,0 +1,50 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.jobs
import dev.inmo.krontab.KronScheduler
import kotlinx.coroutines.Job
import net.moonleay.lilJudd.data.api.Splatoon3ApiCache
import net.moonleay.lilJudd.data.api.type.ApiDataType
import net.moonleay.lilJudd.data.api.type.ApiRequestType
import net.moonleay.lilJudd.jobs.component.CronjobType
import net.moonleay.lilJudd.jobs.component.ICronjob
import net.moonleay.lilJudd.util.Logger
object Splatoon3ApiFestivalAndCoopUpdateScheduler : ICronjob {
override val jobName: String
get() = "Splatoon3ApiFestivalAndCoopUpdateScheduler"
override val jobIncoming: String
get() = "0 0 0 /1 * * 0o *" // once a day
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("Running Splatoon3ApiFestivalUpdateScheduler.")
Splatoon3ApiCache.updateData(ApiDataType.SPLATFESTS, ApiRequestType.AUTOMATIC_CACHE_UPDATE)
Logger.out("Splatoon3ApiFestivalUpdateScheduler finished.")
Logger.out("Running Splatoon3ApiCoopUpdateScheduler.")
Splatoon3ApiCache.updateData(ApiDataType.COOP, ApiRequestType.AUTOMATIC_CACHE_UPDATE)
Logger.out("Splatoon3ApiCoopUpdateScheduler finished.")
}
}

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,14 +16,16 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.jobs package net.moonleay.lilJudd.jobs
import dev.inmo.krontab.KronScheduler import dev.inmo.krontab.KronScheduler
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import net.moonleay.liljudd.data.api.splatoon3ink.Splatoon3Api import net.moonleay.lilJudd.data.api.Splatoon3ApiCache
import net.moonleay.liljudd.jobs.component.CronjobType import net.moonleay.lilJudd.data.api.type.ApiDataType
import net.moonleay.liljudd.jobs.component.ICronjob import net.moonleay.lilJudd.data.api.type.ApiRequestType
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.jobs.component.CronjobType
import net.moonleay.lilJudd.jobs.component.ICronjob
import net.moonleay.lilJudd.util.Logger
object Splatoon3ApiScheduleUpdateScheduler : ICronjob { object Splatoon3ApiScheduleUpdateScheduler : ICronjob {
override val jobName: String override val jobName: String
@ -38,8 +40,8 @@ object Splatoon3ApiScheduleUpdateScheduler : ICronjob {
override lateinit var scheduler: KronScheduler override lateinit var scheduler: KronScheduler
override suspend fun jobFunction() { override suspend fun jobFunction() {
Logger.out("Updating Schedules...") Logger.out("Running Splatoon3ApiScheduleUpdateScheduler.")
Splatoon3Api.updateSchedule() Splatoon3ApiCache.updateData(ApiDataType.SCHEDULES, ApiRequestType.AUTOMATIC_CACHE_UPDATE)
Logger.out("Updating finished.") Logger.out("Splatoon3ApiScheduleUpdateScheduler finished.")
} }
} }

View file

@ -0,0 +1,47 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.jobs
import dev.inmo.krontab.KronScheduler
import kotlinx.coroutines.Job
import net.moonleay.lilJudd.data.api.Splatoon3ApiCache
import net.moonleay.lilJudd.data.api.type.ApiDataType
import net.moonleay.lilJudd.data.api.type.ApiRequestType
import net.moonleay.lilJudd.jobs.component.CronjobType
import net.moonleay.lilJudd.jobs.component.ICronjob
import net.moonleay.lilJudd.util.Logger
object Splatoon3ApiSplatnetGearUpdateScheduler : ICronjob {
override val jobName: String
get() = "Splatoon3ApiSplatnetGearUpdateScheduler"
override val jobIncoming: String
get() = "0 0 /6 * * * 0o *" //Every 6 hours
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("Running Splatoon3ApiSplatnetGearUpdateScheduler.")
Splatoon3ApiCache.updateData(ApiDataType.SPLATNETGEAR, ApiRequestType.AUTOMATIC_CACHE_UPDATE)
Logger.out("Splatoon3ApiSplatnetGearUpdateScheduler finished.")
}
}

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,21 +16,21 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.jobs package net.moonleay.lilJudd.jobs
import dev.inmo.krontab.KronScheduler import dev.inmo.krontab.KronScheduler
import dev.kord.common.entity.PresenceStatus import dev.kord.common.entity.PresenceStatus
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import net.moonleay.liljudd.Bot import net.moonleay.lilJudd.Bot
import net.moonleay.liljudd.data.api.splatoon3ink.Splatoon3ApiDataGrabber import net.moonleay.lilJudd.data.api.Splatoon3Api
import net.moonleay.liljudd.jobs.component.CronjobType import net.moonleay.lilJudd.jobs.component.CronjobType
import net.moonleay.liljudd.jobs.component.ICronjob import net.moonleay.lilJudd.jobs.component.ICronjob
object StatusUpdater : ICronjob { object StatusUpdater : ICronjob {
override val jobName: String override val jobName: String
get() = "StatusUpdater" get() = "StatusUpdater"
override val jobIncoming: String override val jobIncoming: String
get() = "/30 * * * * * 0o *" //Every 30 seconds get() = "/5 * * * * * 0o *" //Every 5 seconds
override val jobType: CronjobType override val jobType: CronjobType
get() = CronjobType.INFINITE get() = CronjobType.INFINITE
override val continueJob: Boolean override val continueJob: Boolean
@ -41,26 +41,27 @@ object StatusUpdater : ICronjob {
private var statusList = listOf<String>() private var statusList = listOf<String>()
private var index = 0 private var index = 0
// I h8 this cronjob. I'll recode this someday.
override suspend fun jobFunction() { override suspend fun jobFunction() {
if (index >= statusList.size) {
index = 0
refreshStatusList(System.currentTimeMillis()) refreshStatusList(System.currentTimeMillis())
}
Bot.bot.kordRef.editPresence { Bot.bot.kordRef.editPresence {
this.status = PresenceStatus.DoNotDisturb this.status = PresenceStatus.DoNotDisturb
this.competing(statusList[index]) this.playing(statusList[index])
} }
++index ++index
if (index >= statusList.size) {
index = 0
}
} }
private fun refreshStatusList(timestamp: Long) { fun refreshStatusList(timestamp: Long) {
statusList = listOf( statusList = listOf(
Splatoon3ApiDataGrabber.getRotationTime(timestamp), Splatoon3Api.getRegularMapsFormatted(timestamp),
Splatoon3ApiDataGrabber.getRegularMapsFormatted(timestamp), Splatoon3Api.getSeriesModeFormatted(timestamp),
Splatoon3ApiDataGrabber.getOpenMapFormatted(timestamp), Splatoon3Api.getSeriesMapsFormatted(timestamp),
Splatoon3ApiDataGrabber.getSeriesMapsFormatted(timestamp), Splatoon3Api.getOpenModeFormatted(timestamp),
Splatoon3ApiDataGrabber.getXMapFormatted(timestamp) Splatoon3Api.getOpenMapFormatted(timestamp),
Splatoon3Api.getXModeFormatted(timestamp),
Splatoon3Api.getXMapFormatted(timestamp),
) )
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.jobs.component package net.moonleay.lilJudd.jobs.component
enum class CronjobType { enum class CronjobType {
INFINITE, INFINITE,

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.jobs.component package net.moonleay.lilJudd.jobs.component
import dev.inmo.krontab.KronScheduler import dev.inmo.krontab.KronScheduler
import kotlinx.coroutines.Job import kotlinx.coroutines.Job

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.jobs.component package net.moonleay.lilJudd.jobs.component
import dev.inmo.krontab.buildSchedule import dev.inmo.krontab.buildSchedule
import dev.inmo.krontab.doInfinityTz import dev.inmo.krontab.doInfinityTz
@ -25,7 +25,7 @@ import dev.inmo.krontab.doWhileTz
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.moonleay.liljudd.util.Logger import net.moonleay.lilJudd.util.Logger
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.util package net.moonleay.lilJudd.util
import dev.kord.common.Color import dev.kord.common.Color

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.util package net.moonleay.lilJudd.util
import dev.kord.common.entity.ButtonStyle import dev.kord.common.entity.ButtonStyle
import dev.kord.core.entity.Embed import dev.kord.core.entity.Embed
@ -82,7 +82,7 @@ object EmbedUtil {
fun getAllUsersInTheFirstXTables(amountOfTables: Int, e: Embed): List<String> { fun getAllUsersInTheFirstXTables(amountOfTables: Int, e: Embed): List<String> {
val users = mutableListOf<String>() val users = mutableListOf<String>()
for (i in 0 until amountOfTables) { for (i in 0 until amountOfTables - 1) {
val f = e.fields[i] val f = e.fields[i]
if (!f.value.contains("@")) if (!f.value.contains("@"))
continue // check next one. this one does not have any entries continue // check next one. this one does not have any entries

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.util package net.moonleay.lilJudd.util
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,9 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.util package net.moonleay.lilJudd.util
import dev.kord.core.behavior.UserBehavior 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.core.entity.Embed import dev.kord.core.entity.Embed
import dev.kord.rest.builder.message.EmbedBuilder import dev.kord.rest.builder.message.EmbedBuilder
import java.time.LocalDateTime import java.time.LocalDateTime
@ -27,9 +30,44 @@ import java.time.format.DateTimeFormatter
object MessageUtil { object MessageUtil {
private val dtf: DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy @ HH:mm:ss") private val dtf: DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy @ HH:mm:ss")
suspend fun getFooter(u: UserBehavior? = null): String { ///Send an embedded message as a reply
val now: LocalDateTime = LocalDateTime.now() suspend fun sendEmbedForPublicSlashCommand(
return ">" + dtf.format(now) + " - ${u?.asUser()?.username ?: "Automated Message"}" ctx: PublicSlashCommandContext<Arguments, ModalForm>,
color: EmbedColor,
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<Arguments, ModalForm>,
color: EmbedColor,
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 ///Get a cloned embedded message
@ -37,11 +75,6 @@ object MessageUtil {
val ebb = EmbedBuilder() val ebb = EmbedBuilder()
ebb.color = e.color ebb.color = e.color
ebb.title = e.title 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 { e.fields.forEach {
val fb = EmbedBuilder.Field() val fb = EmbedBuilder.Field()
fb.name = it.name fb.name = it.name
@ -49,10 +82,6 @@ object MessageUtil {
fb.inline = it.inline fb.inline = it.inline
ebb.fields.add(fb) ebb.fields.add(fb)
} }
ebb.footer {
this.icon = e.footer?.iconUrl
this.text = e.footer?.text.toString()
}
ebb.description = e.description ebb.description = e.description
return ebb return ebb
} }
@ -61,11 +90,6 @@ object MessageUtil {
val ebb = EmbedBuilder() val ebb = EmbedBuilder()
ebb.color = e.color ebb.color = e.color
ebb.title = e.title 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 { e.fields.forEach {
val fb = EmbedBuilder.Field() val fb = EmbedBuilder.Field()
fb.name = it.name fb.name = it.name
@ -73,14 +97,24 @@ object MessageUtil {
fb.inline = it.inline fb.inline = it.inline
ebb.fields.add(fb) ebb.fields.add(fb)
} }
ebb.footer {
this.icon = e.footer?.icon
this.text = e.footer?.text.toString()
}
ebb.description = e.description ebb.description = e.description
return ebb return ebb
} }
fun getEmbedWithTableWithFooter(
color: EmbedColor,
title: String,
description: String,
values: Map<String, List<String>>?,
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( fun getEmbedWithTable(
color: EmbedColor, color: EmbedColor,
title: String, title: String,
@ -102,6 +136,7 @@ object MessageUtil {
return ebb return ebb
} }
///Get an embedded msg with title and description ///Get an embedded msg with title and description
fun getEmbedSmall( fun getEmbedSmall(
color: EmbedColor, color: EmbedColor,
@ -129,4 +164,17 @@ object MessageUtil {
return ebb return ebb
} }
///Get an embedded msg with image, title, description and a src
fun getEmbedWithImage(
color: EmbedColor,
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
}
} }

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.util package net.moonleay.lilJudd.util
import java.net.URL import java.net.URL
import javax.net.ssl.HttpsURLConnection import javax.net.ssl.HttpsURLConnection

View file

@ -1,6 +1,6 @@
/* /*
* lilJudd * lilJudd
* Copyright (C) 2024 moonleay * Copyright (C) 2023 moonleay
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.moonleay.liljudd.util package net.moonleay.lilJudd.util
import kotlinx.datetime.DayOfWeek import kotlinx.datetime.DayOfWeek
import java.time.Duration import java.time.Duration
@ -145,16 +145,6 @@ object TimeUtil {
.withMinute(0).withSecond(0) .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 { fun getDateFromString(input: String): ZonedDateTime {
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
val localDateTime = LocalDateTime.parse(input, formatter) val localDateTime = LocalDateTime.parse(input, formatter)
@ -177,24 +167,6 @@ object TimeUtil {
return ZonedDateTime.of(localDateTime, zoneId).toEpochSecond() * 1000 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 { fun getTimeDifferenceFormatted(start: Long, end: Long): String {
val diff = end - start val diff = end - start
return getTimeFormatedShortend(diff, false) return getTimeFormatedShortend(diff, false)

View file

@ -1,120 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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()
}
}
}

View file

@ -1,37 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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()
}
}

View file

@ -1,38 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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)
}
}

View file

@ -1,140 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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")
}
}

View file

@ -1,37 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<VsStage>
)

View file

@ -1,35 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<BankaraMatchSetting>?,
@SerialName("endTime")
val endTime: String,
@SerialName("festMatchSettings")
val festMatchSettings: List<FestMatchSettingX>?,
@SerialName("startTime")
val startTime: String
)

View file

@ -1,29 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<SalmonRunNode>
)

View file

@ -1,35 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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
)

View file

@ -1,35 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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?
)

View file

@ -1,39 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<Weapon>
)

View file

@ -1,35 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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
)

View file

@ -1,43 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<Team>,
@SerialName("title")
val title: String,
@SerialName("tricolorStage")
val tricolorStage: TricolorStage
)

View file

@ -1,29 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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
)

View file

@ -1,31 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<TimePeriod>
)

View file

@ -1,29 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<EventNode>
)

View file

@ -1,35 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<VsStage>
)

View file

@ -1,28 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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
)

View file

@ -1,29 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<FestNode>
)

View file

@ -1,37 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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<VsStage>
)

Some files were not shown because too many files have changed in this diff Show more