Compare commits

...

166 commits

Author SHA1 Message Date
4b46d34f45
chore: improved logging further
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m54s
Signed-off-by: moonleay <contact@moonleay.net>
2024-02-13 20:07:50 +01:00
0cd3e4d6a8
fix: fixed issue with cloned embeds not implementing the footer correctly
Signed-off-by: moonleay <contact@moonleay.net>
2024-02-13 20:04:13 +01:00
a7e656bcbe
refactor: renamed ownerID to creatorID
Signed-off-by: moonleay <contact@moonleay.net>
2024-02-13 19:44:09 +01:00
404e043da1
chore: improved logging messages of features
Signed-off-by: moonleay <contact@moonleay.net>
2024-02-13 19:43:09 +01:00
c65e4031d9
chore: update copyright
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m55s
Signed-off-by: moonleay <contact@moonleay.net>
2024-02-13 19:24:48 +01:00
ab7016cdb3
feat: added little note at boot
Some checks failed
Build Gradle project / build-gradle-project (push) Failing after 15m48s
fix!: fixed compilation issues on Winblows (This resulted in a new base package.)

Signed-off-by: moonleay <contact@moonleay.net>
2024-02-13 18:47:24 +01:00
d928258028
Merge remote-tracking branch 'origin/master'
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 3m55s
2024-02-13 08:57:32 +01:00
8e1551cd6c
feat: added NewsManager, made bot dm news, when there are any at boot 2024-02-13 08:57:18 +01:00
4dceef6a1f feat!: (temp) dropped the Splatoon3ink api support
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 3m57s
2024-02-01 23:15:04 +01:00
906c41be88
feat: make the bot save a stacktrace, if an error occurs during a command or interaction
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m55s
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-31 13:47:14 +01:00
0f399cb58c
chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m43s
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-29 16:41:09 +01:00
95321b4895
fix: fixed schedules not being deserialized correctly
Some checks failed
Build Gradle project / build-gradle-project (push) Has been cancelled
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-29 16:40:38 +01:00
d0ae43e420
chore: updated README.md
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 2m53s
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-21 02:03:46 +01:00
46ee799760
fix: fixed ci pipeline 2024-01-21 02:03:37 +01:00
02b29da5fd
chore: bump version
Some checks failed
Build Gradle project / build-gradle-project (push) Failing after 0s
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-19 22:42:22 +01:00
98cdbebf79
feat: added RotationExtension
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-19 22:42:14 +01:00
05b4dc39b5
feat: added new JSON time getter
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-19 22:41:52 +01:00
58f2379f45
fix: make the StatusUpdater Run every 30 seconds instead of 10 to reduce the nr of status updates sent to Discord and avoid issues with updating the status
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-19 22:41:29 +01:00
39917e4b5a
feat: updated and improved DataGrabber methods
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-19 22:40:08 +01:00
97d4143cda
chore: fixed wrong class naming
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-19 22:39:43 +01:00
b65dadd42f
chore: code cleanup
Some checks are pending
Build Gradle project / build-gradle-project (push) Waiting to run
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-19 10:53:49 +01:00
38d61ae862
chore: upgraded dependencies
Some checks failed
Build Gradle project / build-gradle-project (push) Has been cancelled
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-18 18:49:53 +01:00
2182f8751a
chore: upgraded gradle to 8.5
Some checks are pending
Build Gradle project / build-gradle-project (push) Waiting to run
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-18 18:46:34 +01:00
894e03c9c6
feat!: updated rest of the code to use new API system
Some checks are pending
Build Gradle project / build-gradle-project (push) Waiting to run
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-18 18:35:17 +01:00
abd17b3256
chore!: removed unused updater cronjobs
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-18 18:34:53 +01:00
ec92cac2e7
feat!: completely rewrote API code to use KotlinXSerialization instead of pasing it manually (WTF was I thinking when I did that??)
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-18 18:34:11 +01:00
0f2410c7c1
chore: added KotlinxSerialization to project, bumped kotlin version
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-18 18:31:57 +01:00
734ac1b74c
WIP: started working on lilJuddApi implementation
Some checks failed
Build Gradle project / build-gradle-project (push) Has been cancelled
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-01 04:12:23 +01:00
e6803f6474
fix: finished removing useless paths from the refactor
Signed-off-by: moonleay <contact@moonleay.net>
2024-01-01 04:11:49 +01:00
f3b28ac392
refactor: splatoon3ink api
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-31 22:02:59 +01:00
d8753a8c1f
fix: updated Error messages to better fit the HTTP standard
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 4m15s
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-19 10:59:31 +01:00
c1536b259b
chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 4m22s
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-19 10:37:39 +01:00
7d442bd224
Merge remote-tracking branch 'origin/master'
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 3m39s
2023-12-19 10:31:54 +01:00
5581f8f348
fix: fixed all exceptions, which were caused by upgrading dependencies
chore!: rewrote all embeds as a result

Signed-off-by: moonleay <contact@moonleay.net>
2023-12-19 10:31:47 +01:00
a2dafa5c72
fix: fixed all exceptions, which were caused by upgrading dependencies
Some checks failed
Build Gradle project / build-gradle-project (push) Has been cancelled
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-19 10:29:53 +01:00
fc7edc0d0d
feat!: improved MessageUtil
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-19 10:28:49 +01:00
b2c43e2c04
chore: upgrade dependencies
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-19 10:28:04 +01:00
32da9ac7af
chore: upgrade gradle
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 4m40s
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-19 09:31:50 +01:00
d71db45532
chore: bump version
All checks were successful
Build Gradle project / build-gradle-project (push) Successful in 3m44s
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
60c30af3e9
feat: reworked Rotation Status
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
5ad7fe0ae6
chore: improve documentation of self-hosting using docker / docker-compose
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
52703b4b61
fix: fixed match command throwing exceptions when being run with false inputs
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
984bcabd0c
fix: added try-catch to Splatoon3Api, fixed Statusupdater
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
94149e4272
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
0bf527b6e0
fix: off-by-one error in EmbedUtil 2023-12-09 16:11:51 +01:00
05d2d1a6b9
chore: update README.md
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
5b613d25f2
chore: update README.md
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
bf057dd317
fix!: temp. stopped the StatusUpdater and Cache updater from running to make the bot run again, fixed package names
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
dac2bdd6d3
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
75b8321ba6
fix: fixed issue with time in the match extension
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
2834989bbb
fix: fixed api schedulers
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
486417b383
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
a2fa3c0d51
chore: updated comment
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
daf3ed0c21
fix: StatusUpdater now starts after the bot is online
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
89e6142ebf
feat: removed the not needed status refreshes
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
390cd2a345
feat: made the status refresh every time it updates
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
e02117fa36
feat: registered new jobs and features
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
594050dd61
feat: added StatusUpdater to update the status of the bot
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
ef6820da11
feat: added JSON deformatter to TimeUtil
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
1b24a9b7d7
feat: added NetUtil for web requests
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
1c17a5d2be
feat: added cacheUpdateJobs
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
886d891787
chore: added credits for the provided data
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
06edbb9288
feat: added Splatoon3.ink API
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
028e566c70
fix: fixed issues with timestamps
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
984c9653d9
chore: upgrade crontab
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
11cc32ce72
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
59c399d41f
chore: moved Database stuff in /database package
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
9e1a06bdd5
chore: update names in action.yml
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
1cdcef209b
Update .forgejo/workflows/action.yml 2023-12-09 16:11:51 +01:00
76571f10e4
chore: update names in action.yml
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
8c33192472
chore: update README.md
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
ea505a1395
chore: update README.md
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
344751b9de
fix: fixed removed functions
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
9072109b34
chore!: upgrade dependencies & gradle (7.4.2 -> 8.3)
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
a730bdffa5
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
39c8867722
feat: moved all transactions into one package for reuse and simplicity
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
47a703156c
chore: removed unused comment
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
3d1b2750e5
chore: fixed naming in data objects
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
3695f716ed
feat: added TimePlanningChannelsData
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
4e4876a61d
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
2b42ef5dec
fix!: Changed all colors to EmbedColor
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
79b0dd8d6a
feat: make embed helper functions use EmbedColor instead of color
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
266376f7cb
feat: added EmbedColor
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
0a2368417a
chore: removed unused open modifier in IEditButton
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
24687d4060
feat: improved UpdateRolesExtension
chore: updated UpdateRolesExtension Documentation

Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
1cd622a778
chore: updated SendPlannerExtension documentation
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:51 +01:00
50ab9c0b0d
!feat: removed TestExtension.kt
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
eee820917d
feat: Bot now skips Bot Users
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
8a2d2be505
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
e0e522f561
feat: moved update logic into "updateInChannel" function, updated the function in Timeplanner buttons
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
5ce99c904e
fix: fixed grammar
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
7d1952d870
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
266b331699
chore: moved to proper data types in columns
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
fa0ba09412
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
998de8bae5
feat: added DeclineEditButton
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
5d2ef4fc44
feat: improved function of AcceptEditButton
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
6b612dcec6
feat: added Unavailable to MatchExtension table
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
8dd123fe44
feat: improved replaceXWithYinValuesAtTable function, edited MatchButtons
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
5431515976
feat: improved getAClonedEmbed function, added an equivalent using a EmbedBuilder
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
9c27e13ec6
Update .forgejo/workflows/action.yml
Signed-off-by: moonleay <account@moonleay.net>
2023-12-09 16:11:50 +01:00
b8915cfefa
chore: bump version
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
e051335d84
feat: Roles now update on button press
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
c16ff4bdba
chore: improved readability
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
4f3c76910c
fix: fixed AvailabilityManager
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
6ab6aa1279
fix: fixed weekstamp
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
a3d3005ff0
chore: improved imports
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
0c363391ba
fix: fixed build.yml
Signed-off-by: moonleay <contact@moonleay.net>
2023-12-09 16:11:50 +01:00
4ae3b0052b feat: add build.yml
Some checks reported warnings
/ build_and_publish (push) Has been cancelled
Signed-off-by: moonleay <contact@moonleay.net>
2023-08-04 21:17:15 +02:00
bf9754f404 chore: bump version
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-13 01:15:24 +02:00
86771a36fb chore: formatting
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-13 00:58:51 +02:00
c663641e42 fix: fixed AvailabilityManager not being able to set the right roles
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-13 00:58:43 +02:00
213cb45d6c fix: fixed gitlab-ci.yml
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:35:09 +02:00
6b0bf40e0a feat: added MatchExtension, added MatchManager updater
chore: updated comments

Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:28:24 +02:00
9fa7f38228 feat: added MatchJob to clean up roles
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:26:27 +02:00
9099d02bf4 feat: added getMatchButtons to EmbedUtil
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:26:00 +02:00
ef28b08214 feat: added cronjob system
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:25:03 +02:00
187da815e2 feat: added CancelEditButton
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:24:12 +02:00
e04956a800 feat: added SignMeUpEditButton
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:24:04 +02:00
ad99e2767e feat: updated buttons and ButtonManager
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:23:03 +02:00
407f0ff1ea feat: changed EditButton to an interface
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:21:08 +02:00
3f3fb87ebd feat: added MatchManager
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:20:01 +02:00
62e230777b feat: added MatchExtension
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:19:48 +02:00
cd4e881e60 feat: added MatchTypes enum
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:19:28 +02:00
97fc2975c5 feat: added MatchPlanningData and MatchPlanningDataData
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:17:47 +02:00
e03e5bbd9e chore: moved Logger info to runThread function
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:15:31 +02:00
1b2b35e10a fix: fixed errors with the TimeManager if there is no notifier role
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:12:55 +02:00
7ab73765e4 feat: added function to get a ZonedDateTimeObject from a string, added function to generate a cronjob string from a ZonedDateTime object
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 13:05:12 +02:00
ad6040ebf3 feat: added EmbedWithTableWithFooter to MessageUtil
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 12:57:22 +02:00
f79e1b1582 feat: added info output to SendPlannerExtension
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 12:55:54 +02:00
aabc50952b chore: upgrade krontab version, bump version
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-07-12 12:51:28 +02:00
063ef3ef91 chore: removed comment, as the function has been cleaned up
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 12:12:57 +02:00
d92396784e feat: improved isEmpty check
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 11:14:13 +02:00
196bb378b4 feat: make the bot update the roles on startup
fix: fixed the bot throwing Errors when there is no role for a channel

Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 09:57:36 +02:00
d6bf2e7bc9 chore: update .gitlab-ci.yml to only run at tag creation
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 08:57:22 +02:00
948ac8a184 chore: update README.md
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 08:40:10 +02:00
4fac341c11 feat: AvailabilityManager cronjob now runs at 1:00 AM utc
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 08:39:57 +02:00
a42016961f feat: timemanager cronjob now runs at 0:01 AM utc
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 08:39:43 +02:00
f87ef82e66 chore: update README.md
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 08:27:02 +02:00
5b1b9682ff chore: update README.md
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 08:26:11 +02:00
e64569c748 feat: improved feature system
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 08:25:37 +02:00
e8667dca5b feat: upgrade README.md
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-29 00:05:12 +02:00
5ffd3c7ccc chore: bump version
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 23:15:37 +02:00
e0228c65cd feat: removed old Feature interface, removed manager temp, moved IFeature into .feature.component
chore: add credits, add comments

Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 23:15:26 +02:00
15d2aec85e feat: improved feature / cronjob system
Changes by silenium-dev

Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 23:15:11 +02:00
72670d4dd4 feat: added saving of the messageids,
chore: moved getMondayDayOfMonth function to TimeUtil

Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:52:44 +02:00
5c488fa91d feat: (re)added PlanningRolesFeature
fix: fixed being able to register TimePlanningFeature multiple times in the same channel
chore: added comments

Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:50:34 +02:00
ae0d67f3fd feat: added UpdateRolesExtension for debugging
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:48:46 +02:00
fb287b24cf chore: Renamed ButtonUtil to EmbedUtil
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:48:27 +02:00
04ff442d86 feat: started working on improving feature system, added Feature, added FeatureManager to store all Features
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:47:13 +02:00
2e63bee9a6 feat: added PlanningRoles feature to FeatureEnum, added AvailabilityManager with Cronjob
chore: moved FeatureEnum from .extensions.component to .features.component

Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:46:24 +02:00
03fa8a51a7 feat: save messageids to database
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:43:55 +02:00
3aeefefd32 feat: added TimePlanningMessagesData
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:43:08 +02:00
46df0a1371 chore: add comments to PlanningNotifierRolesData
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:42:43 +02:00
d99d468680 fix: fixed wantstobenotifiedid in PlanningNotifierRoles
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:42:22 +02:00
ce25b20a35 feat: add TimePlanningMessagesTable
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:41:53 +02:00
4bc2fe6930 feat: added get Users in the first X fields
fix: fixed typo in May be available button
chore: renamed ButtonUtil to EmbedUtil

Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:40:27 +02:00
8bca3838bc feat: split getDelay function into three different getDelay functions
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:39:15 +02:00
0a16994e61 feat: add MemberIntent
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:38:26 +02:00
865964aebe chore: update README.md
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-28 22:35:04 +02:00
7115a74e16 chore: bump version
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-24 16:18:26 +02:00
da0edb762c chore: update README.md
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-24 15:58:49 +02:00
48b0384628 chore: upgrade krontab
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-22 07:49:08 +02:00
fe70c3f6bb chore: update README.md
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-18 18:16:17 +02:00
cea3e17617 chore: update README.md
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-15 09:08:55 +02:00
89e1c750f9 chore: bump version
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-15 08:52:00 +02:00
27b721ae1f fix: removed nonexistent feature in feature command, fixed timing on timeplanner.
Signed-off-by: limited_dev <loginakkisativ@gmail.com>
2023-06-15 08:51:32 +02:00
117 changed files with 5410 additions and 1014 deletions

View file

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

View file

@ -0,0 +1,23 @@
name: Build Gradle project
on:
push:
jobs:
build-gradle-project:
runs-on: docker
steps:
- name: apt update
run: apt update
- name: install prerequisits
run: apt install openjdk-17-jdk ca-certificates-java ssl-cert openssl ca-certificates -y
- name: Checkout project sources
uses: actions/checkout@v3
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Run build with Gradle Wrapper
run: ./gradlew shadowJar
- uses: actions/upload-artifact@v3
with:
name: lilJudd.jar
path: build/libs/

1
.gitignore vendored
View file

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

View file

@ -21,14 +21,15 @@ cache:
- build
build:
only:
- tags
stage: build
script:
- gradle shadowJar
except:
- tags
publish:
only:
- tags
stage: publish
script:
- gradle publish

View file

@ -2,11 +2,7 @@
"Oh boy, here we go again" ~ me
A Discord Bot for Splatoon Teams
[![Latest Release](https://gitlab.com/moonleay/liljudd/-/badges/release.svg)](https://gitlab.com/moonleay/liljudd/-/releases)
[![pipeline status](https://gitlab.com/moonleay/liljudd/badges/master/pipeline.svg)](https://gitlab.com/moonleay/liljudd/-/commits/master)
[![License](https://img.shields.io/badge/license-GPL--3.0-brightgreen)](https://gitlab.com/moonleay/liljudd/-/blob/master/LICENSE)
A Discord Bot for Splatoon Teams.
## Contributors
@ -14,50 +10,60 @@ A Discord Bot for Splatoon Teams
## Known issues
- There is a bug with the TimePlanning feature. This bug makes the bot not remove the user properly, the result looks
like [this](https://cdn.discordapp.com/attachments/1015606848797290566/1110671293436661812/image.png)
##### If you encounter any bugs, message me on Discord (@moonleay) or email me (issues@moonleay.net). You can also open a ticket [on the support server](https://discord.gg/HTZRktfH4A).
## Commands & Features
- Commands
- version -- Show the versions of the bot and the most important dependencies
- feature -- Manage bot features
- match -- Create a new match
- updateroles -- Update the roles of all users
- sendplanner -- Send the planner message
- rotation -- See the current rotation
- Features
- Time Planner -- Make the bot send messages and reactions into a selected channel in order to make planning easier
- Availability Manager -- Make the bot assign users roles every day, so it is possible to notify available people
- Match Planner -- Make a match, for which players can sign up and the bot will assign teams and roles to them
## (Maybe) upcoming features
## The todo list
- Match Planner (Send Notifications some time before a match starts)
- Planning Notifier (Make it possible to ping people, who have time at a specific time)
- Game Tracker (Save the results of the last matches)
- Replay Saver (Maybe; will save the replay code to a database)
##### See the [todo list](https://todo.moonleay.net/share/OmisuzgPDdsrCAXKjGrTfYzWwqNDNclOMGJWeMsi/auth?view=kanban) for more information.
## How to self-host (using the Docker container)
1. Pull the container
2. Map /data/ to a folder on disk
3. Run the Bot once
4. Follow step 4 - 7 of "How to self-host (using the JAR)"
1. Copy the docker-compose.yml file from the repository.
2. Install docker and docker-compose.
3. Create a directory called "data" in the same directory as the docker-compose.yml file.
4. Create a directory called "config" in the same directory as the docker-compose.yml file.
5. Start the bot once.
6. After 10 seconds, stop the bot.
7. Open the config file "credentials.nils" in the config directory.
8. Put in your credentials.
1. token: your Discord bot token
2. dbDomain: the domain and port of your postgresql database (e.g.: "postgresql", when using the docker-compose.yml
file)
3. dbName: the name of the database
4. dbUser: the username of the database
5. dbPassword: the password to the db user
9. Start the bot again.
10. The bot should now be up and running.
## How to self-host (using the JAR)
1. Download the latest release from the Package Registry ("Packages and registries" > "Package Registry")
1. It should be called something like this: "lilJudd-X.X.X-xxxxxxxx-prod.jar" (replace "X.X.X" with the latest
version and xxxxxxxx" with the commit its based on.)
2. If you want to run an early version, which may be (very) unsable, you can run a development version. Just use an
entry ending in "-dev.jar"
1. Download the latest release from the Releases page.
2. Place it anywhere you want.
3. Run the following command:
> java -jar lilJudd-X.X.X-xxxxxxxx-prod.jar
> java -jar lilJudd.jar
4. The bot should start and create a config file named "credentials.nils" in a folder called "data"
5. Open it and put in your credentials.
1. token: your Discord bot token
2. dbDomain: the domain and port of your postgresql database (e.g.: 192.168.178.1:5432)
3. dbName: the name of your database
3. dbName: the name of the database
4. dbUser: the username of the database
5. dbPassword: the password to your user
5. dbPassword: the password to the db user
6. Rerun the command
> java -jar lilJudd-X.X.X-xxxxxxxx-prod.jar
> java -jar lilJudd.jar
7. The bot should now be up and running.
## How to set up workspace

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -21,25 +21,27 @@ import org.jetbrains.gradle.ext.TaskTriggersConfig
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.8.20"
id("com.github.johnrengelman.shadow") version "7.1.2"
id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.6"
kotlin("jvm") version "1.9.22"
kotlin("plugin.serialization") version "1.9.22"
id("com.github.johnrengelman.shadow") version "8.1.1"
id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7"
`maven-publish`
}
//lilJudd version 2
val ownerID = 372703841151614976L
val creatorID = 372703841151614976L
group = "net.moonleay.liljudd"
version = System.getenv("CI_COMMIT_TAG")?.let { "$it-${System.getenv("CI_COMMIT_SHORT_SHA")}-prod" }
?: System.getenv("CI_COMMIT_SHORT_SHA")?.let { "$it-dev" }
?: "2.2.1"
?: "2.7.2"
val kordver = "1.5.6"
val coroutinesver = "1.1.0"
val ktor_version = "2.3.0"
val exposedver = "0.40.1"
val postgresver = "42.3.8"
val krontabver = "1.0.0"
val kordver = "1.7.1-SNAPSHOT"
val coroutinesver = "1.7.3"
val ktorver = "2.3.7"
val exposedver = "0.46.0"
val postgresver = "42.7.1"
val krontabver = "2.2.6"
val kotlinxserializationver = "1.6.0"
val mavenArtifact = "lilJudd"
project.base.archivesName.set(mavenArtifact)
@ -72,6 +74,14 @@ repositories {
}
}
}
maven {
name = "sonatype"
url = uri("https://s01.oss.sonatype.org/content/repositories/snapshots")
}
maven {
name = "sonatype 2"
url = uri("https://oss.sonatype.org/content/repositories/snapshots")
}
}
val shadow by configurations.getting
@ -81,8 +91,13 @@ implementation.extendsFrom(shadow)
dependencies {
//Discord
shadow("com.kotlindiscord.kord.extensions:kord-extensions:$kordver")
//Coroutines
shadow("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesver")
//JSON Stuff
shadow("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinxserializationver")
//Logging
shadow("org.slf4j:slf4j-api:2.0.3")
shadow("org.slf4j:slf4j-simple:2.0.3")
@ -93,25 +108,26 @@ dependencies {
shadow("org.jetbrains.exposed:exposed-jdbc:$exposedver")
shadow("org.postgresql:postgresql:$postgresver")
//Korntab
//Krontab
shadow("dev.inmo:krontab:$krontabver")
"shadow"("io.ktor:ktor-client-core-jvm:2.3.1")
"shadow"("io.ktor:ktor-client-cio-jvm:2.3.1")
shadow("io.ktor:ktor-client-core-jvm:$ktorver")
shadow("io.ktor:ktor-client-cio-jvm:$ktorver")
}
val targetJavaVersion = 17
val templateSrc = project.rootDir.resolve("src/main/templates")
val templateDest = project.buildDir.resolve("generated/templates")
val templateDest = project.projectDir.resolve("build/generated/templates")
val templateProps = mapOf(
"version" to project.version as String,
"ownerID" to ownerID,
"creatorID" to creatorID,
"kordversion" to kordver,
"coroutinesversion" to coroutinesver,
"ktorversion" to ktor_version,
"ktorversion" to ktorver,
"exposedversion" to exposedver,
"postgresversion" to postgresver,
"krontabversion" to krontabver
"krontabversion" to krontabver,
"kotlinxserializationversion" to kotlinxserializationver
)

32
docker-compose.yml Normal file
View file

@ -0,0 +1,32 @@
version: "3"
services:
lilJudd:
container_name: liljudd
image: limiteddev/liljudd:x.x.x
deploy:
resources:
limits:
cpus: "1"
memory: 1G
networks:
- traefik
restart: unless-stopped
volumes:
- ./config/liljudd/:/data/
postgresql:
container_name: postgresql
image: postgres:13.3-alpine
deploy:
resources:
limits:
cpus: "1"
memory: 1G
environment:
- POSTGRES_USER=liljudd
- POSTGRES_PASSWORD=changeme
- POSTGRES_DB=liljudd
networks:
- traefik
restart: unless-stopped
volumes:
- ./data/postgresql/:/var/lib/postgresql/data/

Binary file not shown.

View file

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

43
gradlew vendored
View file

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

11
gradlew.bat vendored
View file

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

View file

@ -1,142 +0,0 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd
import com.kotlindiscord.kord.extensions.ExtensibleBot
import dev.kord.common.Color
import dev.kord.common.entity.PresenceStatus
import dev.kord.core.behavior.interaction.response.respond
import dev.kord.core.event.interaction.ButtonInteractionCreateEvent
import dev.kord.core.on
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.moonleay.botendo.build.BuildConstants
import net.moonleay.lilJudd.buttons.component.EditButtonManager
import net.moonleay.lilJudd.data.CredentialManager
import net.moonleay.lilJudd.data.DB
import net.moonleay.lilJudd.extensions.FeatureManageExtension
import net.moonleay.lilJudd.extensions.SendPlannerExtension
import net.moonleay.lilJudd.extensions.VersionExtension
import net.moonleay.lilJudd.features.TimeManager
import net.moonleay.lilJudd.util.Logger
import net.moonleay.lilJudd.util.MessageUtil
import kotlin.system.exitProcess
object Bot {
//The kord object gets set at app launch
lateinit var bot: ExtensibleBot
suspend fun start() {
Logger.out("Starting Bot...")
// Load config
CredentialManager.load()
// Don't run the bot when there is no bot token in config
if (CredentialManager.token == "empty") {
Logger.out("The config does not contain a bot token.")
exitProcess(3)
}
// Check if the credentials for the Database are existent
if (CredentialManager.dbDomain == "empty" || CredentialManager.dbName == "empty" || CredentialManager.dbUser == "empty" || CredentialManager.dbPassword == "empty") {
Logger.out("The config does not contain the whole Database credentials.")
exitProcess(3)
}
// Connect to the database
DB.connect(
CredentialManager.dbDomain,
CredentialManager.dbName,
CredentialManager.dbUser,
CredentialManager.dbPassword
)
// Register the TimePlanner thread
val coroutineJob = GlobalScope.launch {
TimeManager.registerThread()
}
// Add a shutdown hook to cancel the coroutine when the application is terminated
Runtime.getRuntime().addShutdownHook(Thread {
coroutineJob.cancel()
})
// Add bot token to kord
bot = ExtensibleBot(CredentialManager.token) {
applicationCommands {
enabled = true
}
extensions {
add(::VersionExtension)
add(::FeatureManageExtension)
add(::SendPlannerExtension)
//add(::TestExtension) // See comment in TestExtension.kt
}
this.presence {
this.status = PresenceStatus.DoNotDisturb
this.playing("v." + BuildConstants.version)
}
// Sharding will be added if the load of the bot cannot be handled by one instance
/*
sharding { recommended ->
Shards(recommended)
} */
}
// Register button presses
bot.kordRef.on<ButtonInteractionCreateEvent> {
val inter = this.interaction
val u = inter.user
Logger.out("Button interaction: ${inter.componentId} from ${u.asUser().username}#${u.asUser().discriminator}")
if (inter.componentId.startsWith("public.edit.")) {
val response = inter.deferPublicMessageUpdate()
val g = this.interaction.getOriginalInteractionResponse().getGuild()
for (b in EditButtonManager.buttons) {
if (b.id != inter.componentId)
continue
b.onInteraction(inter, response, g, u)
return@on
}
return@on
}
if (inter.componentId.startsWith("public.message.")) {
val response = inter.deferPublicResponse()
val g = this.interaction.getOriginalInteractionResponse().getGuild()
response.respond {
this.embeds = mutableListOf(
MessageUtil.getEmbed(
Color(0xE0311A),
"Error",
"Could not find button with id \"${inter.componentId}\".\nPlease report this.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
}
}
//Start the bot
bot.start()
}
}

View file

@ -1,292 +0,0 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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.commands.converters.impl.channel
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.types.respond
import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.Color
import dev.kord.common.entity.Permission
import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.createRole
import net.moonleay.lilJudd.data.tables.PlanningNotifierRoles
import net.moonleay.lilJudd.data.tables.TimePlanningChannels
import net.moonleay.lilJudd.extensions.component.EnableOrDisable
import net.moonleay.lilJudd.extensions.component.FeatureEnum
import net.moonleay.lilJudd.util.Logger
import net.moonleay.lilJudd.util.MessageUtil
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.jetbrains.exposed.sql.transactions.transaction
class FeatureManageExtension : Extension() {
override val name = "feature"
override val allowApplicationCommandInDMs: Boolean
get() = false
/*
* Note: This has to be rewritten at some point to better support more features
* and improve this mess of a class.
* */
override suspend fun setup() {
publicSlashCommand(::FeatureManagerArgs) {
name = "feature"
description = "Manage features"
this.action {
val u = this.user
if (!u.asMember(this.guild!!.id).hasPermission(Permission.Administrator)) {
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0xE0311A),
"403: Forbidden",
"You cannot edit features, as you don't have the Administrator permission.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
return@action
}
val gID = this.guild!!.id.toString()
val cID = this.arguments.channel.id.toString()
val channel = this.arguments.channel
val args = this.arguments
Logger.out("${args.feature.readableName} ${args.setStatus.readableName} ${channel.data.name.value}")
if (this.arguments.setStatus == EnableOrDisable.ENABLE) {
when (this.arguments.feature) {
FeatureEnum.TIMEPLANNINGFEATURE -> {
var alreadyExists = false
transaction {
alreadyExists = TimePlanningChannels.select {
(TimePlanningChannels.channelid eq gID) and
(TimePlanningChannels.channelid eq cID)
}.count() > 0
}
if (!alreadyExists) {
transaction {
TimePlanningChannels.insert {
it[TimePlanningChannels.serverid] = gID
it[TimePlanningChannels.channelid] = cID
} get TimePlanningChannels.id
}
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0x52E01A),
"200: Success",
"The feature was enabled in channel ${args.channel.data.name.value}",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
return@action
}
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0xE0311A),
"403: Forbidden",
"The feature is already enabled in this channel.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
}
FeatureEnum.PLANNINGNOTIFIER -> {
var alreadyExists = false
transaction {
alreadyExists = PlanningNotifierRoles.select {
(PlanningNotifierRoles.serverid eq gID) and (PlanningNotifierRoles.channelid eq cID)
}.count() > 0
}
if (!alreadyExists) {
val hasTimeRole = this.guild!!.createRole {
this.name = "available [${channel.data.name.value}]"
this.mentionable = true
}
val htr = hasTimeRole.id.toString()
val wantsNotifsRole = this.guild!!.createRole {
this.name = "notifications [${channel.data.name.value}]"
this.mentionable = true
}
val wnr = wantsNotifsRole.id.toString()
transaction {
PlanningNotifierRoles.insert {
it[PlanningNotifierRoles.serverid] = gID
it[PlanningNotifierRoles.channelid] = cID
it[PlanningNotifierRoles.hastimeroleid] = htr
it[PlanningNotifierRoles.wantstobenotifid] = wnr
} get PlanningNotifierRoles.id
}
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0x52E01A),
"200: Success",
"The feature was enabled in channel ${args.channel.data.name.value} with roles ${hasTimeRole.mention} & ${wantsNotifsRole.mention}.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
return@action
}
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0xE0311A),
"403: Forbidden",
"The feature is already enabled in this channel.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
}
}
return@action
}
//Disable
when (this.arguments.feature) {
FeatureEnum.TIMEPLANNINGFEATURE -> {
var alreadyExists = false
transaction {
alreadyExists = TimePlanningChannels.select {
(TimePlanningChannels.serverid eq gID) and
(TimePlanningChannels.channelid eq cID)
}.count() > 0
}
if (alreadyExists) {
transaction {
val matchingEntries = TimePlanningChannels.select {
(TimePlanningChannels.serverid eq gID) and
(TimePlanningChannels.channelid eq cID)
}.toList()
matchingEntries.forEach { entry ->
TimePlanningChannels.deleteWhere { id eq entry[id] }
}
}
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0x52E019),
"200: Success",
"The feature was disabled.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
return@action
}
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0xE0311A),
"403: Forbidden",
"The feature is already disabled in this channel.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
}
FeatureEnum.PLANNINGNOTIFIER -> {
var alreadyExists = false
transaction {
alreadyExists = PlanningNotifierRoles.select {
(PlanningNotifierRoles.serverid eq gID) and (PlanningNotifierRoles.channelid eq cID)
}.count() > 0
}
if (alreadyExists) {
var matchingEntries: List<ResultRow> = mutableListOf()
transaction {
matchingEntries = PlanningNotifierRoles.select {
(PlanningNotifierRoles.serverid eq gID) and
(PlanningNotifierRoles.channelid eq cID)
}.toList()
}
for (e in matchingEntries) {
this.guild!!.getRoleOrNull(Snowflake(e[PlanningNotifierRoles.hastimeroleid]))?.delete()
this.guild!!.getRoleOrNull(Snowflake(e[PlanningNotifierRoles.wantstobenotifid]))
?.delete()
}
transaction {
matchingEntries.forEach { entry ->
PlanningNotifierRoles.deleteWhere { id eq entry[id] }
}
}
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0x52E019),
"200: Success",
"The feature was disabled.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
return@action
}
this.respond {
embeds.add(
MessageUtil.getEmbed(
Color(0xE0311A),
"403: Forbidden",
"The feature is already disabled in this channel.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
}
}
}
}
}
inner class FeatureManagerArgs : Arguments() {
val feature by enumChoice<FeatureEnum> {
this.name = "feature"
this.description = "The targeted feature"
this.typeName = "en_US"
}
val setStatus by enumChoice<EnableOrDisable> {
this.name = "set"
this.description = "Set enabled or disabled"
this.typeName = "en_US"
}
val channel by channel {
this.name = "channel"
this.description = "Target Channel"
}
}
}

View file

@ -1,110 +0,0 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.extensions
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.types.respond
import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.Color
import dev.kord.common.entity.Permission
import dev.kord.core.behavior.channel.createMessage
import dev.kord.rest.builder.message.create.actionRow
import kotlinx.coroutines.delay
import kotlinx.datetime.DayOfWeek
import net.moonleay.lilJudd.util.ButtonUtil
import net.moonleay.lilJudd.util.Logger
import net.moonleay.lilJudd.util.MessageUtil
import java.time.ZoneId
import java.time.ZonedDateTime
/* This extension has no proper use.
It is used in testing to test stuff, without having to wait for certain events to trigger. */
class SendPlannerExtension : Extension() {
override val name = "sendplanner"
override val allowApplicationCommandInDMs: Boolean
get() = false
override suspend fun setup() {
publicSlashCommand() {
name = "sendplanner"
description = "Send the planner for the current and x next weeks"
this.action {
if (!this.member!!.asMember(this.guild!!.id)
.hasPermission(Permission.Administrator)
) {
val res = this.respond {
this.content = "no."
}
res.delete()
return@action
}
val res = this.respond {
this.content = "OK."
}
res.delete()
val c = this.getChannel().asChannel()
var then =
ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withDayOfMonth(getMondayDayOfMonth()).withHour(4)
.withMinute(0).withSecond(0)
c.createMessage {
this.embeds.add(
MessageUtil.getEmbed(
Color(0X4C4645),
"Time Planning Feature",
"Do you have time on the following Days?",
"Automated Message"
)
)
}
delay(1000)
repeat(7) {
c.createMessage {
this.embeds.add(
MessageUtil.getEmbedWithTable(
Color(0X4C4645),
"",
"${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
mapOf(
"Is available" to listOf(),
"May be available" to listOf(),
"Is not available" to listOf()
)
)
)
this.actionRow {
this.components.addAll(ButtonUtil.getTimePlannerButtons().components)
}
}
then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0)
Logger.out("Finished sending day $it")
delay(1000)
}
Logger.out("Finished with ${c.data.guildId.value}")
}
}
}
fun getMondayDayOfMonth(): Int {
val now = ZonedDateTime.now()
val monday = now.with(DayOfWeek.MONDAY)
return monday.dayOfMonth
}
}

View file

@ -1,62 +0,0 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.extensions
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.types.respond
import dev.kord.common.Color
import dev.kord.rest.builder.message.create.actionRow
import net.moonleay.lilJudd.util.ButtonUtil
import net.moonleay.lilJudd.util.MessageUtil
/* This extension has no proper use.
It is used in testing to test stuff, without having to wait for certain events to trigger. */
class TestExtension : Extension() {
override val name = "test"
override val allowApplicationCommandInDMs: Boolean
get() = false
override suspend fun setup() {
publicSlashCommand {
name = "test"
description = "Test game"
this.action {
this.respond {
this.embeds.add(
MessageUtil.getEmbedWithTable(
Color(0X4C4645),
"",
"MONDAY, 22.05.2023",
mapOf(
"Is available" to listOf(),
"May be available" to listOf(),
"Is not available" to listOf()
)
)
)
this.actionRow {
this.components.addAll(ButtonUtil.getTimePlannerButtons().components)
}
}
}
}
}
}

View file

@ -1,131 +0,0 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.features
import dev.inmo.krontab.buildSchedule
import dev.inmo.krontab.doInfinity
import dev.kord.common.Color
import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.channel.createMessage
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.rest.builder.message.create.actionRow
import kotlinx.coroutines.delay
import net.moonleay.lilJudd.Bot
import net.moonleay.lilJudd.data.entry.PlanningNotifierRolesData
import net.moonleay.lilJudd.data.tables.PlanningNotifierRoles
import net.moonleay.lilJudd.data.tables.TimePlanningChannels
import net.moonleay.lilJudd.util.ButtonUtil
import net.moonleay.lilJudd.util.Logger
import net.moonleay.lilJudd.util.MessageUtil
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction
import java.time.ZoneId
import java.time.ZonedDateTime
object TimeManager {
/* /--------------- Seconds
| /------------- Minutes
| | /----------- Hours
| | | /--------- Days of months
| | | | /------- Months
| | | | | /----- (optional) Year
| | | | | | /--- (optional) Timezone offset
| | | | | | | / (optional) Week days
* * * * * * 0o *w*/
suspend fun registerThread() {
Logger.out("Adding message scheduler...")
val scheduler = buildSchedule("0 00 23 * * * 0o *") // 0 0 4 * * * 0o 1w // 0o is UTC
scheduler.doInfinity {
Logger.out("Starting to notify...")
// ChannelID, ServerID
val channelList = mutableMapOf<Snowflake, Snowflake>()
// ChannelID, Data
val roleList = mutableMapOf<Snowflake, PlanningNotifierRolesData>()
transaction {
for (tp in TimePlanningChannels.selectAll()) {
channelList[Snowflake(tp[TimePlanningChannels.channelid])] =
Snowflake(tp[TimePlanningChannels.serverid])
Logger.out("Have to notify channel with ID ${tp[TimePlanningChannels.channelid]}.")
}
for (pnr in PlanningNotifierRoles.selectAll()) {
roleList[Snowflake(pnr[PlanningNotifierRoles.channelid])] = PlanningNotifierRolesData(
pnr[PlanningNotifierRoles.serverid],
pnr[PlanningNotifierRoles.channelid],
pnr[PlanningNotifierRoles.hastimeroleid],
pnr[PlanningNotifierRoles.wantstobenotifid]
)
Logger.out("Have to ping roles: ${pnr[PlanningNotifierRoles.wantstobenotifid]}}")
}
}
Logger.out("${channelList.count()} Channels to notify with ${roleList.count()} Roles to ping!")
for (ch in channelList.keys) {
if (Bot.bot.kordRef.getChannel(ch) == null)
continue // TODO: Check if the channel is valid in another shard
val c = Bot.bot.kordRef.getChannelOf<MessageChannel>(ch)!!
c.createMessage {
if (roleList[ch] != null) {
this.content = "<@&${Snowflake(roleList[ch]?.wantstobenotifid!!)}>"
}
this.embeds.add(
MessageUtil.getEmbed(
Color(0X4C4645),
"Time Planning Feature",
"Do you have time on the following Days?",
"Automated Message"
)
)
}
delay(2000)
var then = ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withHour(4).withMinute(0).withSecond(0)
repeat(7) {
c.createMessage {
this.embeds.add(
MessageUtil.getEmbedWithTable(
Color(0X4C4645),
"",
"${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
mapOf(
"Is available" to listOf(),
"May be available" to listOf(),
"Is not available" to listOf()
)
)
)
this.actionRow {
this.components.addAll(ButtonUtil.getTimePlannerButtons().components)
}
}
then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0)
Logger.out("Finished sending day $it")
delay(1000)
}
Logger.out("Finished with ${c.data.guildId.value}")
}
Logger.out("Done! Until next Monday! <3 ")
}
}
}

View file

@ -0,0 +1,232 @@
/*
* 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
import com.kotlindiscord.kord.extensions.ExtensibleBot
import com.kotlindiscord.kord.extensions.utils.dm
import dev.kord.common.entity.PresenceStatus
import dev.kord.core.behavior.interaction.response.respond
import dev.kord.core.event.gateway.ReadyEvent
import dev.kord.core.event.interaction.ButtonInteractionCreateEvent
import dev.kord.core.on
import dev.kord.gateway.Intent
import dev.kord.gateway.PrivilegedIntent
import dev.kord.gateway.builder.Shards
import dev.kord.rest.builder.message.embed
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import net.moonleay.liljudd.build.BuildConstants
import net.moonleay.liljudd.buttons.component.EditButtonManager
import net.moonleay.liljudd.data.CredentialManager
import net.moonleay.liljudd.data.NewsManager
import net.moonleay.liljudd.data.StacktraceSaver
import net.moonleay.liljudd.data.database.DB
import net.moonleay.liljudd.extensions.*
import net.moonleay.liljudd.features.AvailabilityManager
import net.moonleay.liljudd.features.MatchManager
import net.moonleay.liljudd.features.TimeManager
import net.moonleay.liljudd.util.EmbedColor
import net.moonleay.liljudd.util.Logger
import net.moonleay.liljudd.util.MessageUtil
import kotlin.system.exitProcess
object Bot {
//The kord object gets set at app launch
lateinit var bot: ExtensibleBot
private val jobs = mutableListOf<Job>()
@OptIn(PrivilegedIntent::class)
suspend fun start() {
Logger.out("Starting Bot...")
// Load config
CredentialManager.load()
// Don't run the bot when there is no bot token in config
if (CredentialManager.token == "empty") {
Logger.out("The config does not contain a bot token.")
exitProcess(3)
}
// Check if the credentials for the Database are existent, don't run if they are missing
if (CredentialManager.dbDomain == "empty" || CredentialManager.dbName == "empty" || CredentialManager.dbUser == "empty" || CredentialManager.dbPassword == "empty") {
Logger.out("The config does not contain the whole Database credentials.")
exitProcess(3)
}
// Check if there are api credentials
if (CredentialManager.apiDomain == "empty" || CredentialManager.apiToken == "empty") {
Logger.out("The config does not contain the whole API credentials.")
exitProcess(3)
}
// Connect to the database
DB.connect(
CredentialManager.dbDomain,
CredentialManager.dbName,
CredentialManager.dbUser,
CredentialManager.dbPassword
)
// Make sure the database is up-to-date
DB.register()
// Register all the jobs
jobs.addAll(
listOf(
TimeManager,
AvailabilityManager,
).map {
CoroutineScope(Dispatchers.Default).launch {
it.registerThread()
}
}
)
// Thanks silenium-dev <3
// Create the bot object
bot = ExtensibleBot(CredentialManager.token) {
applicationCommands {
enabled = true
}
extensions {
add(::InfoExtension)
add(::FeatureManageExtension)
add(::SendPlannerExtension)
add(::MatchExtension)
add(::UpdateRolesExtension)
add(::RotationExtension)
}
this.presence {
this.status = PresenceStatus.DoNotDisturb
this.playing("v." + BuildConstants.version)
}
this.intents {
+Intent.GuildMembers
}
errorResponse { _, type ->
val stamp = System.currentTimeMillis()
this.embed {
this.title = "Oops. Something went wrong."
this.description = "The bot encountered an error during execution.\n" +
"Please report this to <@${BuildConstants.creatorID}>.\n" +
"The errorid is \"$stamp.stk\""
this.field {
this.name = "Error message:"
this.value = type.error.message.toString()
this.inline = false
}
}
StacktraceSaver.saveStacktrace(type.error, stamp)
}
this.sharding { recommended ->
Shards(recommended)
}
}
// Register button presses
bot.kordRef.on<ButtonInteractionCreateEvent> {
val inter = this.interaction
val u = inter.user
Logger.out("Button interaction: ${inter.componentId} from ${u.asUser().username}#${u.asUser().discriminator}")
if (inter.componentId.startsWith("public.edit.")) {
val response = inter.deferPublicMessageUpdate()
val g = this.interaction.getOriginalInteractionResponse().getGuild()
for (b in EditButtonManager.buttons) {
if (b.id != inter.componentId)
continue
b.onInteraction(inter, response, g, u)
return@on
}
return@on
}
if (inter.componentId.startsWith("public.message.")) {
val response = inter.deferPublicResponse()
response.respond {
this.embeds = mutableListOf(
MessageUtil.getEmbed(
EmbedColor.ERROR,
"404: Not Found",
"Could not find button with id \"${inter.componentId}\"." +
"\nPlease report this.",
u.asUser().username + "#" + u.asUser().discriminator
)
)
}
}
}
bot.kordRef.on<ReadyEvent> {
AvailabilityManager.runThread() // Update Availabilities
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
// JobManager.addJob(StatusUpdater)
}
// Update the Splatoon 3 api data and make sure it stays up-to-date
// Splatoon3Api.updateSchedule()
// JobManager.addJob(Splatoon3ApiScheduleUpdateScheduler)
/*
Other caches will be added when implemented
its not used yet in order to reduce load on the api,
which i am using.
*/
// Had to disable bc of an error.
// Will fix when I have time
//Start the bot
bot.start()
}
}

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -15,9 +15,11 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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() {
println(
@ -26,9 +28,11 @@ suspend fun main() {
"| |_| |__| |_ _ _| |_| |\n" +
"| | | | | | | | . | . |\n" +
"|_|_|_|_____|___|___|___|\n" +
" "
"v.${BuildConstants.version}\n"
)
println("v.${BuildConstants.version}")
Logger.out("li'l Judd made by moonleay (https://moonleay.net). Web UI made by aronmal (https://mal-noh.de).")
Logger.out("For more information check out https://liljudd.ink and https://git.moonleay.net/DiscordBots/lilJudd")
Bot.start()
}

View file

@ -0,0 +1,37 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.buttons.component
import net.moonleay.liljudd.buttons.matchplanner.AcceptEditButton
import net.moonleay.liljudd.buttons.matchplanner.CancelEditButton
import net.moonleay.liljudd.buttons.matchplanner.DeclineEditButton
import net.moonleay.liljudd.buttons.timeplanner.IsAvailableEditButton
import net.moonleay.liljudd.buttons.timeplanner.MaybeAvailableEditButton
import net.moonleay.liljudd.buttons.timeplanner.NotAvailableEditButton
object EditButtonManager {
val buttons = listOf(
IsAvailableEditButton(),
MaybeAvailableEditButton(),
NotAvailableEditButton(),
AcceptEditButton(),
CancelEditButton(),
DeclineEditButton(),
)
}

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,16 +16,17 @@
* 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.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.interaction.ButtonInteraction
open class EditButton(val id: String) {
interface IEditButton {
open suspend fun onInteraction(
val id: String
suspend fun onInteraction(
interaction: ButtonInteraction,
response: PublicMessageInteractionResponseBehavior,
guild: Guild,

View file

@ -0,0 +1,103 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.buttons.matchplanner
import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.util.EmbedUtil
import net.moonleay.liljudd.util.Logger
import net.moonleay.liljudd.util.MessageUtil
class AcceptEditButton : IEditButton {
override val id: String = "public.edit.btn.matchmanagement.accept"
override suspend fun onInteraction(
interaction: ButtonInteraction,
response: PublicMessageInteractionResponseBehavior,
guild: Guild,
user: User
) {
val m = interaction.message
val eb = MessageUtil.getAClonedEmbed(m.embeds[0])
var shouldEditButton = false
val mpdd = MatchPlanningDataRepository.getFromMessageInChannelInServer(
m.id.value.toLong(),
interaction.channelId.value.toLong(),
guild.id.value.toLong()
)
if (mpdd == null) {
Logger.out("mpdd is null")
return
}
val role = guild.getRoleOrNull(Snowflake(mpdd.roleID))
if (role == null) {
Logger.out("role is null")
return
}
val member = interaction.user.asMember(guild.id)
// do the checks and update
if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
Logger.out("Removing role from ${member.username}")
member.removeRole(role.id)
}
// remove the user from the 1st list in the embed
Logger.out("Removing ${user.username} from the 1st list in the embed")
eb.fields = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", eb, 1).fields
shouldEditButton = true
}
if (m.embeds[0].fields[1].value.contains(user.id.value.toString())) {
Logger.out("Removing ${user.username} from the 2nd list in the embed")
eb.fields = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", eb, 2).fields
shouldEditButton = true
}
if (!m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
if (!member.roleIds.contains(Snowflake(mpdd.roleID))) {
Logger.out("Adding role to ${member.username}")
member.addRole(role.id)
}
//Add the user to the list in the embed
Logger.out("Adding ${user.username} to the 1st list in the embed")
eb.fields = EmbedUtil.addXToValuesAtTable(user.id.value.toString(), eb, 1).fields
shouldEditButton = true
}
if (shouldEditButton) {
// update the message
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed(fun EmbedBuilder.() {
color = eb.color
title = eb.title
description = eb.description
fields = eb.fields
footer = eb.footer
})
}
}
}
}

View file

@ -0,0 +1,77 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.buttons.matchplanner
import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.util.EmbedUtil
import net.moonleay.liljudd.util.Logger
class CancelEditButton : IEditButton {
override val id: String = "public.edit.btn.matchmanagement.cancel"
override suspend fun onInteraction(
interaction: ButtonInteraction,
response: PublicMessageInteractionResponseBehavior,
guild: Guild,
user: User
) {
val m = interaction.message
if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
val mpdd = MatchPlanningDataRepository.getFromMessageInChannelInServer(
m.id.value.toLong(),
interaction.channelId.value.toLong(),
guild.id.value.toLong()
)
if (mpdd == null) {
Logger.out("mpdd is null")
return
}
val role = guild.getRoleOrNull(Snowflake(mpdd.roleID))
if (role == null) {
Logger.out("role is null")
return
}
val member = interaction.user.asMember(guild.id)
if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
member.removeRole(role.id)
}
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed(fun EmbedBuilder.() {
val temp = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 1)
color = temp.color
title = temp.title
description = temp.description
fields = temp.fields
footer = temp.footer
})
}
}
}
}

View file

@ -0,0 +1,103 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.buttons.matchplanner
import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.edit
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.util.EmbedUtil
import net.moonleay.liljudd.util.Logger
import net.moonleay.liljudd.util.MessageUtil
class DeclineEditButton : IEditButton {
override val id: String = "public.edit.btn.matchmanagement.decline"
override suspend fun onInteraction(
interaction: ButtonInteraction,
response: PublicMessageInteractionResponseBehavior,
guild: Guild,
user: User
) {
val m = interaction.message
val eb = MessageUtil.getAClonedEmbed(m.embeds[0])
var shouldEditButton = false
val mpdd = MatchPlanningDataRepository.getFromMessageInChannelInServer(
m.id.value.toLong(),
interaction.channelId.value.toLong(),
guild.id.value.toLong()
)
if (mpdd == null) {
Logger.out("mpdd is null")
return
}
val role = guild.getRoleOrNull(Snowflake(mpdd.roleID))
if (role == null) {
Logger.out("role is null")
return
}
val member = interaction.user.asMember(guild.id)
if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
Logger.out("Removing role from ${member.username}")
member.removeRole(role.id)
}
// remove the user from the 1st list in the embed
Logger.out("Removing ${user.username} from the 1st list in the embed")
eb.fields = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", eb, 1).fields
shouldEditButton = true
}
if (!m.embeds[0].fields[1].value.contains(user.id.value.toString())) {
if (member.roleIds.contains(Snowflake(mpdd.roleID))) {
Logger.out("Removing role from ${member.username}")
member.removeRole(role.id)
}
// Add the user to the list in the embed
Logger.out("Adding ${user.username} to the 2nd list in the embed")
eb.fields = EmbedUtil.addXToValuesAtTable(user.id.value.toString(), eb, 2).fields
shouldEditButton = true
}
if (m.embeds[0].fields[1].value.contains(user.id.value.toString())) {
// Remove the user from all tables
Logger.out("Removing ${user.username} from the 2nd list in the embed")
eb.fields = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", eb, 2).fields
shouldEditButton = true
}
if (shouldEditButton) {
// update the message
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed(fun EmbedBuilder.() {
color = eb.color
title = eb.title
description = eb.description
fields = eb.fields
footer = eb.footer
})
}
}
}
}

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <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.interaction.response.PublicMessageInteractionResponseBehavior
@ -24,12 +24,15 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.modify.embed
import net.moonleay.lilJudd.Bot
import net.moonleay.lilJudd.buttons.component.EditButton
import net.moonleay.lilJudd.util.ButtonUtil
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton
import net.moonleay.liljudd.features.AvailabilityManager
import net.moonleay.liljudd.util.EmbedUtil
class IsAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.available"
class IsAvailableEditButton : EditButton("public.edit.btn.timemanagement.available") {
override suspend fun onInteraction(
interaction: ButtonInteraction,
response: PublicMessageInteractionResponseBehavior,
@ -40,7 +43,7 @@ class IsAvailableEditButton : EditButton("public.edit.btn.timemanagement.availab
if (m.embeds[0].fields[0].value.contains(user.id.value.toString())) {
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed {
val temp = ButtonUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 1)
val temp = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 1)
this.color = temp.color
this.title = temp.title
this.description = temp.description
@ -51,7 +54,7 @@ class IsAvailableEditButton : EditButton("public.edit.btn.timemanagement.availab
} else {
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed {
val temp = ButtonUtil.addXToValuesAtTable(user.id.value.toString(), m.embeds[0], 1)
val temp = EmbedUtil.addXToValuesAtTable(user.id.value.toString(), m.embeds[0], 1)
this.color = temp.color
this.title = temp.title
this.description = temp.description
@ -60,5 +63,6 @@ class IsAvailableEditButton : EditButton("public.edit.btn.timemanagement.availab
}
}
}
AvailabilityManager.updateInChannel(interaction.channelId)
}
}

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <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.interaction.response.PublicMessageInteractionResponseBehavior
@ -24,12 +24,15 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.modify.embed
import net.moonleay.lilJudd.Bot
import net.moonleay.lilJudd.buttons.component.EditButton
import net.moonleay.lilJudd.util.ButtonUtil
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton
import net.moonleay.liljudd.features.AvailabilityManager
import net.moonleay.liljudd.util.EmbedUtil
class MaybeAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.maybeavailable"
class MaybeAvailableEditButton : EditButton("public.edit.btn.timemanagement.maybeavailable") {
override suspend fun onInteraction(
interaction: ButtonInteraction,
response: PublicMessageInteractionResponseBehavior,
@ -40,7 +43,7 @@ class MaybeAvailableEditButton : EditButton("public.edit.btn.timemanagement.mayb
if (m.embeds[0].fields[1].value.contains(user.id.value.toString())) {
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed {
val temp = ButtonUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 2)
val temp = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 2)
this.color = temp.color
this.title = temp.title
this.description = temp.description
@ -51,7 +54,7 @@ class MaybeAvailableEditButton : EditButton("public.edit.btn.timemanagement.mayb
} else {
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed {
val temp = ButtonUtil.addXToValuesAtTable(user.id.value.toString(), m.embeds[0], 2)
val temp = EmbedUtil.addXToValuesAtTable(user.id.value.toString(), m.embeds[0], 2)
this.color = temp.color
this.title = temp.title
this.description = temp.description
@ -60,5 +63,6 @@ class MaybeAvailableEditButton : EditButton("public.edit.btn.timemanagement.mayb
}
}
}
AvailabilityManager.updateInChannel(interaction.channelId)
}
}

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <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.interaction.response.PublicMessageInteractionResponseBehavior
@ -24,12 +24,14 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.User
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.ButtonInteraction
import dev.kord.rest.builder.message.modify.embed
import net.moonleay.lilJudd.Bot
import net.moonleay.lilJudd.buttons.component.EditButton
import net.moonleay.lilJudd.util.ButtonUtil
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.buttons.component.IEditButton
import net.moonleay.liljudd.features.AvailabilityManager
import net.moonleay.liljudd.util.EmbedUtil
class NotAvailableEditButton : EditButton("public.edit.btn.timemanagement.notavailable") {
class NotAvailableEditButton : IEditButton {
override val id: String = "public.edit.btn.timemanagement.notavailable"
override suspend fun onInteraction(
interaction: ButtonInteraction,
@ -41,7 +43,7 @@ class NotAvailableEditButton : EditButton("public.edit.btn.timemanagement.notava
if (m.embeds[0].fields[2].value.contains(user.id.value.toString())) {
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed {
val temp = ButtonUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 3)
val temp = EmbedUtil.replaceXWithYinValuesAtTable(user.id.value.toString(), "", m.embeds[0], 3)
this.color = temp.color
this.title = temp.title
this.description = temp.description
@ -52,7 +54,7 @@ class NotAvailableEditButton : EditButton("public.edit.btn.timemanagement.notava
} else {
Bot.bot.kordRef.getChannelOf<MessageChannel>(interaction.channelId)!!.getMessage(m.id).edit {
this.embed {
val temp = ButtonUtil.addXToValuesAtTable(user.id.value.toString(), m.embeds[0], 3)
val temp = EmbedUtil.addXToValuesAtTable(user.id.value.toString(), m.embeds[0], 3)
this.color = temp.color
this.title = temp.title
this.description = temp.description
@ -61,5 +63,6 @@ class NotAvailableEditButton : EditButton("public.edit.btn.timemanagement.notava
}
}
}
AvailabilityManager.updateInChannel(interaction.channelId)
}
}

View file

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

View file

@ -0,0 +1,120 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,21 +16,22 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.features
package net.moonleay.liljudd.data
import dev.inmo.krontab.buildSchedule
import dev.inmo.krontab.doInfinity
import net.moonleay.lilJudd.util.Logger
object PlanningNotifier {
suspend fun registerThread() {
Logger.out("Adding ping scheduler...")
val scheduler = buildSchedule("0 00 23 * * * 0o *") // 0 0 4 * * * 0o 1w // 0o is UTC
scheduler.doInfinity {
Logger.out("Starting to update roles...")
Logger.out("Done! Until tomorrow! <3 ")
}
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

@ -0,0 +1,38 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,140 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,37 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class BankaraSchedules(
@SerialName("nodes")
val nodes: List<BankaraNode>
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class BannerImage(
@SerialName("url")
val url: String,
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,31 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Boss(
@SerialName("id")
val id: String,
@SerialName("name")
val name: String
)

View file

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,39 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,43 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,31 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,28 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,33 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class FestNode(
@SerialName("endTime")
val endTime: String,
@SerialName("festMatchSettings")
val festMatchSettings: FestMatchSettingX?,
@SerialName("startTime")
val startTime: String
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Image(
@SerialName("url")
val url: String
)

View file

@ -0,0 +1,39 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class LeagueMatchEvent(
@SerialName("desc")
val desc: String,
@SerialName("id")
val id: String,
@SerialName("leagueMatchEventId")
val leagueMatchEventId: String,
@SerialName("name")
val name: String,
@SerialName("regulation")
val regulation: String,
@SerialName("regulationUrl")
val regulationUrl: String? // is null
)

View file

@ -0,0 +1,37 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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>
)

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,19 +16,22 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import org.jetbrains.exposed.sql.Database
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
object DB {
//Connect to the provided DB; trows errors, if the DB is not avalible.
fun connect(dbDomain: String, dbName: String, dbUser: String, dbPasswd: String) {
Database.connect(
"jdbc:postgresql://$dbDomain/$dbName",
driver = "org.postgresql.Driver",
user = dbUser,
password = dbPasswd
@Serializable
data class MapNode(
@SerialName("id")
val id: String,
@SerialName("name")
val name: String,
@SerialName("originalImage")
val originalImage: OriginalImage,
@SerialName("stats")
val stats: String?, // is null
@SerialName("vsStageId")
val vsStageId: Int
)
}
}

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class OriginalImage(
@SerialName("url")
val url: String
)

View file

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class RegularMatchSetting(
@SerialName("__isVsSetting")
val isVsSetting: String,
@SerialName("__typename")
val typename: String,
@SerialName("vsRule")
val vsRule: VsRule,
@SerialName("vsStages")
val vsStages: List<VsStage>
)

View file

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class RegularNode(
@SerialName("endTime")
val endTime: String,
@SerialName("festMatchSettings")
val festMatchSettings: FestMatchSettingXX?,
@SerialName("regularMatchSetting")
val regularMatchSetting: RegularMatchSetting,
@SerialName("startTime")
val startTime: String
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class RegularSchedules(
@SerialName("nodes")
val nodes: List<SalmonRunNode>
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class RegularSchedulesX(
@SerialName("nodes")
val nodes: List<RegularNode>
)

View file

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class SalmonRunNode(
@SerialName("endTime")
val endTime: String,
@SerialName("setting")
val setting: Setting,
@SerialName("__splatoon3ink_king_salmonid_guess")
val splatoon3inkKingSalmonidGuess: String,
@SerialName("startTime")
val startTime: String
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Schedules(
@SerialName("data")
val data: SchedulesData
)

View file

@ -0,0 +1,45 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class SchedulesData(
@SerialName("bankaraSchedules")
val bankaraSchedules: BankaraSchedules,
@SerialName("coopGroupingSchedule")
val coopGroupingSchedule: CoopGroupingSchedule,
@SerialName("currentFest")
val currentFest: CurrentFest?,
@SerialName("currentPlayer")
val currentPlayer: CurrentPlayer,
@SerialName("eventSchedules")
val eventSchedules: EventSchedules,
@SerialName("festSchedules")
val festSchedules: FestSchedules,
@SerialName("regularSchedules")
val regularSchedules: RegularSchedulesX,
@SerialName("vsStages")
val vsStages: VsStages,
@SerialName("xSchedules")
val xSchedules: XSchedules
)

View file

@ -0,0 +1,37 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Setting(
@SerialName("boss")
val boss: Boss,
@SerialName("coopStage")
val coopStage: CoopStage,
@SerialName("__isCoopSetting")
val isCoopSetting: String,
@SerialName("__typename")
val typename: String,
@SerialName("weapons")
val weapons: List<Weapon>
)

View file

@ -0,0 +1,33 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Team(
@SerialName("color")
val color: Color,
@SerialName("id")
val id: String,
// @SerialName("myVoteState")
// val myVoteState: Any?
)

View file

@ -0,0 +1,33 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class TeamContestNode(
@SerialName("endTime")
val endTime: String,
@SerialName("setting")
val setting: CoopSetting,
@SerialName("startTime")
val startTime: String
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class TeamContestSchedules(
@SerialName("nodes")
val nodes: List<TeamContestNode> // This is a placeholder.
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class ThumbnailImage(
@SerialName("url")
val url: String
)

View file

@ -0,0 +1,31 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class TimePeriod(
@SerialName("endTime")
val endTime: String,
@SerialName("startTime")
val startTime: String
)

View file

@ -0,0 +1,33 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class TricolorStage(
@SerialName("id")
val id: String,
@SerialName("image")
val image: Image,
@SerialName("name")
val name: String
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class UserIcon(
@SerialName("url")
val url: String
)

View file

@ -0,0 +1,33 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class VsRule(
@SerialName("id")
val id: String,
@SerialName("name")
val name: String,
@SerialName("rule")
val rule: String
)

View file

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class VsStage(
@SerialName("id")
val id: String,
@SerialName("image")
val image: Image,
@SerialName("name")
val name: String,
@SerialName("vsStageId")
val vsStageId: Int
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class VsStages(
@SerialName("nodes")
val nodes: List<MapNode>
)

View file

@ -0,0 +1,33 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Weapon(
@SerialName("image")
val image: Image,
@SerialName("name")
val name: String,
@SerialName("__splatoon3ink_id")
val splatoon3inkId: String
)

View file

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class XMatchSetting(
@SerialName("__isVsSetting")
val isVsSetting: String,
@SerialName("__typename")
val typename: String,
@SerialName("vsRule")
val vsRule: VsRule,
@SerialName("vsStages")
val vsStages: List<VsStage>
)

View file

@ -0,0 +1,35 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class XNode(
@SerialName("endTime")
val endTime: String,
@SerialName("festMatchSettings")
val festMatchSettings: FestMatchSettingXX?,
@SerialName("startTime")
val startTime: String,
@SerialName("xMatchSetting")
val xMatchSetting: XMatchSetting
)

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.api.splatoon3ink.schedules
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class XSchedules(
@SerialName("nodes")
val nodes: List<XNode>
)

View file

@ -0,0 +1,55 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.database
import net.moonleay.liljudd.data.database.tables.MatchPlanningData
import net.moonleay.liljudd.data.database.tables.PlanningNotifierRoles
import net.moonleay.liljudd.data.database.tables.TimePlanningChannels
import net.moonleay.liljudd.data.database.tables.TimePlanningMessages
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.transactions.transaction
object DB {
private var connected = false
//Connect to the provided DB; trows errors, if the DB is not available.
fun connect(dbDomain: String, dbName: String, dbUser: String, dbPasswd: String) {
Database.connect(
"jdbc:postgresql://$dbDomain/$dbName",
driver = "org.postgresql.Driver",
user = dbUser,
password = dbPasswd
)
connected = true
}
fun register() {
if (!connected)
return
// Register tables here
transaction {
SchemaUtils.create(TimePlanningChannels)
SchemaUtils.create(TimePlanningMessages)
SchemaUtils.create(MatchPlanningData)
SchemaUtils.create(PlanningNotifierRoles)
}
}
}

View file

@ -0,0 +1,32 @@
/*
* 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.database.entry
data class MatchPlanningDataData(
val id: Int,
val serverID: Long,
val channelID: Long,
val matchType: String,
val registererID: Long,
val roleID: Long,
val opponentName: String,
val messageID: Long,
val timestamp: Long,
val jobString: String
)

View file

@ -0,0 +1,27 @@
/*
* 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.database.entry
data class PlanningNotifierRolesData(
val id: Int, // The id of the entry
val serverID: Long, // The id of the server
val channelID: Long, // The id of the channel
val hasTimeRoleID: Long, // The id of the role that has time today
val wantsToBeNotifiedID: Long // The id of the role that wants to be notified
)

View file

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

View file

@ -0,0 +1,27 @@
/*
* 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.database.entry
data class TimePlanningMessagesData(
val id: Int, // The id of the entry
val serverID: Long, // The discord server id
val channelID: Long, // The discord channel id
val weekstamp: Long, // The timestamp of the monday of the week at 4am UTC
val messageIDs: String // IDs are in the following format: "{weekdayNr}:{id};{weekdayNr}:{id};[etc.]"
)

View file

@ -0,0 +1,115 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.database.repository
import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData
import net.moonleay.liljudd.data.database.tables.MatchPlanningData
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.deleteWhere
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction
object MatchPlanningDataRepository {
fun getAll(): List<MatchPlanningDataData> {
val dataList = mutableListOf<MatchPlanningDataData>()
transaction {
MatchPlanningData.selectAll().forEach {
dataList.add(
MatchPlanningDataData(
it[MatchPlanningData.id],
it[MatchPlanningData.serverid],
it[MatchPlanningData.channelid],
it[MatchPlanningData.matchtype],
it[MatchPlanningData.registererid],
it[MatchPlanningData.roleid],
it[MatchPlanningData.opponentName],
it[MatchPlanningData.messageid],
it[MatchPlanningData.timestamp],
it[MatchPlanningData.jobstr]
)
)
}
}
return dataList
}
fun get(id: Int): MatchPlanningDataData? =
transaction {
MatchPlanningData.selectAll().where { MatchPlanningData.id eq id }.firstOrNull()?.let {
MatchPlanningDataData(
it[MatchPlanningData.id],
it[MatchPlanningData.serverid],
it[MatchPlanningData.channelid],
it[MatchPlanningData.matchtype],
it[MatchPlanningData.registererid],
it[MatchPlanningData.roleid],
it[MatchPlanningData.opponentName],
it[MatchPlanningData.messageid],
it[MatchPlanningData.timestamp],
it[MatchPlanningData.jobstr]
)
}
}
fun getFromMessageInChannelInServer(messageID: Long, channelID: Long, serverID: Long): MatchPlanningDataData? =
transaction {
MatchPlanningData.selectAll().where {
MatchPlanningData.messageid eq (messageID) and (
MatchPlanningData.serverid eq (serverID)) and (
MatchPlanningData.channelid eq (channelID))
}.firstOrNull()?.let {
MatchPlanningDataData(
it[MatchPlanningData.id],
it[MatchPlanningData.serverid],
it[MatchPlanningData.channelid],
it[MatchPlanningData.matchtype],
it[MatchPlanningData.registererid],
it[MatchPlanningData.roleid],
it[MatchPlanningData.opponentName],
it[MatchPlanningData.messageid],
it[MatchPlanningData.timestamp],
it[MatchPlanningData.jobstr]
)
}
}
fun delete(id: Int) {
transaction {
MatchPlanningData.deleteWhere { MatchPlanningData.id eq id }
}
}
fun write(data: MatchPlanningDataData): Int =
transaction {
MatchPlanningData.insert {
it[serverid] = data.serverID
it[channelid] = data.channelID
it[matchtype] = data.matchType
it[registererid] = data.registererID
it[roleid] = data.roleID
it[opponentName] = data.opponentName
it[messageid] = data.messageID
it[timestamp] = data.timestamp
it[jobstr] = data.jobString
} get MatchPlanningData.id
}
}

View file

@ -0,0 +1,106 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.database.repository
import net.moonleay.liljudd.data.database.entry.PlanningNotifierRolesData
import net.moonleay.liljudd.data.database.tables.PlanningNotifierRoles
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.deleteWhere
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction
object PlanningNotifierRolesRepository {
fun getAll(): List<PlanningNotifierRolesData> {
val dataList = mutableListOf<PlanningNotifierRolesData>()
transaction {
for (pnr in PlanningNotifierRoles.selectAll()) {
dataList.add(
PlanningNotifierRolesData(
pnr[PlanningNotifierRoles.id],
pnr[PlanningNotifierRoles.serverid],
pnr[PlanningNotifierRoles.channelid],
pnr[PlanningNotifierRoles.hastimeroleid],
pnr[PlanningNotifierRoles.wantstobenotifiedid]
)
)
}
}
return dataList
}
fun getForChannel(channelID: Long): PlanningNotifierRolesData? =
transaction {
PlanningNotifierRoles.selectAll().where { PlanningNotifierRoles.channelid eq channelID }.firstOrNull()?.let {
PlanningNotifierRolesData(
it[PlanningNotifierRoles.id],
it[PlanningNotifierRoles.serverid],
it[PlanningNotifierRoles.channelid],
it[PlanningNotifierRoles.hastimeroleid],
it[PlanningNotifierRoles.wantstobenotifiedid]
)
}
}
fun getForChannelInServer(channelID: Long, serverID: Long): PlanningNotifierRolesData? =
transaction {
PlanningNotifierRoles.selectAll()
.where { PlanningNotifierRoles.channelid eq channelID and (PlanningNotifierRoles.serverid eq serverID) }
.firstOrNull()?.let {
PlanningNotifierRolesData(
it[PlanningNotifierRoles.id],
it[PlanningNotifierRoles.serverid],
it[PlanningNotifierRoles.channelid],
it[PlanningNotifierRoles.hastimeroleid],
it[PlanningNotifierRoles.wantstobenotifiedid]
)
}
}
fun existsInChannel(channelID: Long): Boolean =
transaction {
PlanningNotifierRoles.selectAll().where { PlanningNotifierRoles.channelid eq channelID }.count() > 0
}
fun existsInChannelFromSever(channelID: Long, serverID: Long): Boolean =
transaction {
PlanningNotifierRoles.selectAll()
.where { PlanningNotifierRoles.channelid eq channelID and (PlanningNotifierRoles.serverid eq serverID) }
.count() > 0
}
fun write(data: PlanningNotifierRolesData) {
transaction {
PlanningNotifierRoles.insert {
it[serverid] = data.serverID
it[channelid] = data.channelID
it[hastimeroleid] = data.hasTimeRoleID
it[wantstobenotifiedid] = data.wantsToBeNotifiedID
} get PlanningNotifierRoles.id
}
}
fun delete(id: Int) {
transaction {
PlanningNotifierRoles.deleteWhere { PlanningNotifierRoles.id eq id }
}
}
}

View file

@ -0,0 +1,73 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.database.repository
import net.moonleay.liljudd.data.database.entry.TimePlanningChannelsData
import net.moonleay.liljudd.data.database.tables.TimePlanningChannels
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.deleteWhere
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction
object TimePlanningChannelsRepository {
fun getAll(): List<TimePlanningChannelsData> {
val dataList = mutableListOf<TimePlanningChannelsData>()
transaction {
for (tp in TimePlanningChannels.selectAll())
dataList.add(
TimePlanningChannelsData(
id = tp[TimePlanningChannels.id],
serverID = tp[TimePlanningChannels.serverid],
channelID = tp[TimePlanningChannels.channelid],
)
)
}
return dataList
}
fun exists(channelID: Long, serverID: Long): Boolean =
transaction {
TimePlanningChannels.selectAll()
.where { TimePlanningChannels.channelid eq channelID and (TimePlanningChannels.serverid eq serverID) }
.firstOrNull() != null
}
fun delete(id: Int) {
transaction {
TimePlanningChannels.deleteWhere { TimePlanningChannels.id eq id }
}
}
fun deleteFromChannelInServer(channelID: Long, serverID: Long) {
transaction {
TimePlanningChannels.deleteWhere { channelid eq channelID and (serverid eq serverID) }
}
}
fun write(data: TimePlanningChannelsData): Int =
transaction {
TimePlanningChannels.insert {
it[serverid] = data.serverID
it[channelid] = data.channelID
} get TimePlanningChannels.id
}
}

View file

@ -0,0 +1,73 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.database.repository
import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData
import net.moonleay.liljudd.data.database.tables.TimePlanningMessages
import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction
object TimePlanningMessagesRepository {
fun write(data: TimePlanningMessagesData): Int =
transaction {
TimePlanningMessages.insert {
it[serverid] = data.serverID
it[channelid] = data.channelID
it[weekstamp] = data.weekstamp
it[messageids] = data.messageIDs
} get TimePlanningMessages.id
}
fun getWeek(stamp: Long): List<TimePlanningMessagesData> {
val dataList = mutableListOf<TimePlanningMessagesData>()
transaction {
for (pnr in TimePlanningMessages.selectAll().where { TimePlanningMessages.weekstamp eq (stamp) }) {
dataList.add(
TimePlanningMessagesData(
pnr[TimePlanningMessages.id],
pnr[TimePlanningMessages.serverid],
pnr[TimePlanningMessages.channelid],
pnr[TimePlanningMessages.weekstamp],
pnr[TimePlanningMessages.messageids]
)
)
}
}
return dataList
}
fun getWeekInChannel(stamp: Long, channelID: Long): TimePlanningMessagesData? =
transaction {
TimePlanningMessages.selectAll()
.where { TimePlanningMessages.weekstamp eq (stamp) and (TimePlanningMessages.channelid eq channelID) }.firstOrNull()?.let {
TimePlanningMessagesData(
it[TimePlanningMessages.id],
it[TimePlanningMessages.serverid],
it[TimePlanningMessages.channelid],
it[TimePlanningMessages.weekstamp],
it[TimePlanningMessages.messageids]
)
}
}
}

View file

@ -0,0 +1,34 @@
/*
* 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.database.tables
import org.jetbrains.exposed.sql.Table
object MatchPlanningData : Table(name = "new_matchplanning_data") {
var id = integer("id").autoIncrement()
var serverid = long("serverid")
var channelid = long("channelid")
var matchtype = varchar("matchtype", 50)
var registererid = long("registererid")
var roleid = long("roleid")
var opponentName = varchar("opponentname", 100)
var messageid = long("messageid")
var timestamp = long("timestamp")
var jobstr = varchar("jobstr", 50)
}

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,16 +16,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.buttons.component
package net.moonleay.liljudd.data.database.tables
import net.moonleay.lilJudd.buttons.timeplanner.IsAvailableEditButton
import net.moonleay.lilJudd.buttons.timeplanner.MaybeAvailableEditButton
import net.moonleay.lilJudd.buttons.timeplanner.NotAvailableEditButton
import org.jetbrains.exposed.sql.Table
object EditButtonManager {
val buttons = listOf(
IsAvailableEditButton(),
MaybeAvailableEditButton(),
NotAvailableEditButton()
)
object PlanningNotifierRoles : Table(name = "new_planningnotifier_roles") {
var id = integer("id").autoIncrement()
var serverid = long("serverid")
var channelid = long("channelid")
var hastimeroleid = long("hastimeroleid")
var wantstobenotifiedid = long("wantstobenotifiedid")
}

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,13 +16,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.lilJudd.data.tables
package net.moonleay.liljudd.data.database.tables
import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.Table
object PlanningNotifierRoles : IntIdTable() {
var serverid = varchar("serverid", 50)
var channelid = varchar("channelid", 50)
var hastimeroleid = varchar("hastimeroleid", 50)
var wantstobenotifid = varchar("wantstobenotifid", 50)
object TimePlanningChannels : Table(name = "new_timeplanning_channels") {
var id = integer("id").autoIncrement()
var serverid = long("serverid")
val channelid = long("channelid")
}

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.data.database.tables
import org.jetbrains.exposed.sql.Table
object TimePlanningMessages : Table(name = "new_timeplanning_messages") {
var id = integer("id").autoIncrement()
var serverid = long("serverid")
var channelid = long("channelid")
var weekstamp = long("weekstamp")
var messageids = varchar("messageids", 200)
}

View file

@ -0,0 +1,136 @@
/*
* 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.extensions
import com.kotlindiscord.kord.extensions.commands.Arguments
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.impl.enumChoice
import com.kotlindiscord.kord.extensions.commands.converters.impl.channel
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.entity.Permission
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.extensions.component.EnableOrDisable
import net.moonleay.liljudd.features.component.FeatureEnum
import net.moonleay.liljudd.features.component.FeatureManager
import net.moonleay.liljudd.util.EmbedColor
import net.moonleay.liljudd.util.Logger
import net.moonleay.liljudd.util.MessageUtil
class FeatureManageExtension : Extension() {
override val name = "feature"
override val allowApplicationCommandInDMs: Boolean
get() = false
override suspend fun setup() {
publicSlashCommand(::FeatureManagerArgs) {
name = "feature"
description = "Manage features"
this.action {
val u = this.user
if (!u.asMember(this.guild!!.id).hasPermission(Permission.Administrator)) {
this.respond {
this.embed {
this.color = EmbedColor.ERROR.color
this.title = "401: Not Authorized"
this.description =
"You cannot edit features, as you don't have the Administrator permission."
this.footer {
this.icon = u.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(u)
}
}
}
return@action
}
val gID = this.guild!!.id.value.toLong()
val cID = this.arguments.channel.id.value.toLong()
val channel = this.arguments.channel
val args = this.arguments
Logger.out("${args.feature.readableName} ${args.setStatus.readableName} ${channel.data.name.value}")
val f = FeatureManager.getFeature(args.feature)
if (f == null) {
this.respond {
this.embed {
this.color = EmbedColor.ERROR.color
this.title = "404: Not Found"
this.description = "The feature you are trying to edit does not exist."
this.footer {
this.icon = u.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(u)
}
}
}
return@action
}
if (this.arguments.setStatus == EnableOrDisable.ENABLE) {
val enabled = f.enable(u, gID, cID, channel, args)
this.respond {
this.embed {
this.color = enabled.color
this.title = enabled.title
this.description = enabled.description
this.footer {
this.icon = u.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(u)
}
}
}
return@action
}
val disabled = f.disable(u, gID, cID, channel, args)
this.respond {
this.embed {
this.color = disabled.color
this.title = disabled.title
this.description = disabled.description
this.footer {
this.icon = u.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(u)
}
}
}
}
}
}
inner class FeatureManagerArgs : Arguments() {
val feature by enumChoice<FeatureEnum> {
this.name = "feature"
this.description = "The targeted feature"
this.typeName = "en_US"
}
val setStatus by enumChoice<EnableOrDisable> {
this.name = "set"
this.description = "Set enabled or disabled"
this.typeName = "en_US"
}
val channel by channel {
this.name = "channel"
this.description = "Target Channel"
}
}
}

View file

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

View file

@ -0,0 +1,172 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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.commands.converters.impl.string
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import dev.kord.core.behavior.createRole
import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.extensions.component.MatchTypes
import net.moonleay.liljudd.jobs.MatchJob
import net.moonleay.liljudd.jobs.component.JobManager
import net.moonleay.liljudd.util.EmbedColor
import net.moonleay.liljudd.util.EmbedUtil
import net.moonleay.liljudd.util.MessageUtil
import net.moonleay.liljudd.util.TimeUtil
class MatchExtension : Extension() {
override val name = "match"
override val allowApplicationCommandInDMs: Boolean
get() = false
override suspend fun setup() {
publicSlashCommand(::MatchArguments) {
name = "match"
description = "Create a match"
this.action {
val args = this.arguments
val m = this.member!!
val gID = this.guild!!.id.value
val cID = this.channel.id.value
val opponent = args.opponent
if (!TimeUtil.validateDateString(args.timeStamp)) {
this.respond {
this.embed {
this.color = EmbedColor.ERROR.color
this.title = "400: Bad Request"
this.description = "The given timestamp is invalid.\n" +
"Please use the format \"dd.MM.yyyy HH:mm\"."
this.footer {
this.icon = m.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(m.asUser())
}
}
}
return@action
}
// filter time to date:
val zdt = TimeUtil.getDateFromString(args.timeStamp)
// get the string for the cronjob
val jobString = TimeUtil.getCronjobStringFromDate(zdt)
// create the role
val role = this.guild!!.createRole {
this.name =
"${args.matchType.readableName} Vs ${opponent} At ${zdt.dayOfMonth}/${zdt.month}/${zdt.year} ${zdt.hour}:${zdt.minute}"
this.mentionable = true
}
// Check if the role was created successfully
if (role == null) {
this.respond {
this.embed {
this.color = EmbedColor.ERROR.color
this.title = "500: Internal Error"
this.description = "Could not find created role.\n" +
"It seems, that said role could not be created."
this.footer {
this.icon = m.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(m.asUser())
}
}
}
return@action
}
val msg = this.respond {
val eb = MessageUtil.getEmbedWithTable(
EmbedColor.INFO,
args.matchType.readableName,
"***Vs. $opponent***\n" +
"At ${args.timeStamp}\n" +
"Registered by ${m.mention}",
mapOf(
"Signed up" to listOf(),
"Unavailable" to listOf(),
)
)
this.embed {
this.color = eb.color
this.title = eb.title
this.description = eb.description
this.fields = eb.fields
this.footer {
this.icon = m.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(m.asUser())
}
}
this.actionRow {
this.components.addAll(EmbedUtil.getMatchButtons().components)
}
}
val tID = MatchPlanningDataRepository.write(
MatchPlanningDataData(
0,
gID.toLong(),
cID.toLong(),
args.matchType.readableName,
m.id.value.toLong(),
role.id.value.toLong(),
opponent,
msg.id.value.toLong(),
(zdt.toEpochSecond() * 1000),
jobString
)
)
if (tID == null || tID <= 0) {
return@action // Not saved to db
// TODO: Add error message
}
JobManager.addJob(
MatchJob(
jobString,
tID,
"${args.matchType.readableName}_Vs_${opponent}_[${tID}]-${gID}_${cID}",
)
)
}
}
}
inner class MatchArguments : Arguments() {
val matchType by enumChoice<MatchTypes> {
this.name = "match"
this.description = "The type of match"
this.typeName = "en_US"
}
val timeStamp by string {
this.name = "timestamp"
this.description = "The timestamp of the match. Format \"dd.MM.yyyy HH:mm\"."
}
val opponent by string {
this.name = "opponent"
this.description = "The opponent"
}
}
}

View file

@ -0,0 +1,464 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <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 dev.kord.common.Color
import dev.kord.rest.builder.message.embed
import kotlinx.datetime.Clock
import net.moonleay.liljudd.data.api.splatoon3ink.Splatoon3ApiDataGrabber
import net.moonleay.liljudd.extensions.component.SplatoonOnlineMode
import net.moonleay.liljudd.util.TimeUtil
class RotationExtension : Extension() {
override val name = "rotation"
override val allowApplicationCommandInDMs: Boolean
get() = false
override suspend fun setup() {
publicSlashCommand(::RotationArguments) {
name = "rotation"
description = "Check the current rotations"
this.action {
val mode = this.arguments.mode
when (mode) {
SplatoonOnlineMode.ALL -> {
val regSched = Splatoon3ApiDataGrabber.getRegularMode(System.currentTimeMillis())
val regMaps = regSched.regularMatchSetting.vsStages
val regMap1 = regMaps[0]
val regMap2 = regMaps[1]
val serSched = Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis())
val serMaps = serSched.bankaraMatchSettings!!.first().vsStages
val serMap1 = serMaps[0]
val serMap2 = serMaps[1]
val opnSched = Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis())
val opnMaps = opnSched.bankaraMatchSettings!!.last().vsStages
val opnMap1 = opnMaps[0]
val opnMap2 = opnMaps[1]
val xSched = Splatoon3ApiDataGrabber.getXMode(System.currentTimeMillis())
val xMaps = xSched.xMatchSetting.vsStages
val xMap1 = xMaps[0]
val xMap2 = xMaps[1]
val salSched = Splatoon3ApiDataGrabber.getSalmonRun(System.currentTimeMillis())
val salMap = salSched.setting.coopStage.name
val salBoss = salSched.setting.boss.name
val salWeapons = salSched.setting.weapons
this.respond {
this.embed {
this.author {
this.name = "Current rotation for"
}
this.title = "All Modes"
this.description = "[[Open on website](https://splatoon3.ink/)]"
this.color = Color(0x1437FF)
this.thumbnail {
this.url = "https://static.moonleay.net/img/lilJudd/deepcut.png"
}
this.field {
this.name = "Regular (${
TimeUtil.getTimeFromJSONTime(
regSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(regSched.endTime, "UTC")})"
this.value =
"${regSched.regularMatchSetting.vsRule.name} on ${regMap1.name} & ${regMap2.name}"
this.inline = false
}
this.field {
this.name = "Series (${
TimeUtil.getTimeFromJSONTime(
serSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(serSched.endTime, "UTC")})"
this.value =
"${serSched.bankaraMatchSettings.first().vsRule.name} on ${serMap1.name} & ${serMap2.name}"
this.inline = false
}
this.field {
this.name = "Open (${
TimeUtil.getTimeFromJSONTime(
opnSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(opnSched.endTime, "UTC")})"
this.value =
"${opnSched.bankaraMatchSettings.last().vsRule.name} on ${opnMap1.name} & ${opnMap2.name}"
this.inline = false
}
this.field {
this.name = "X (${
TimeUtil.getTimeFromJSONTime(
xSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(xSched.endTime, "UTC")})"
this.value = "${xSched.xMatchSetting.vsRule.name} on ${xMap1.name} & ${xMap2.name}"
this.inline = false
}
this.field {
this.name = "Salmon Run (${
TimeUtil.getTimeFromJSONTimeLong(
salSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTimeLong(salSched.endTime, "UTC")})"
this.value =
"${salBoss} on ${salMap} with ${salWeapons[0].name}, ${salWeapons[1].name}, ${salWeapons[2].name} & ${salWeapons[3].name}"
this.inline = false
}
this.timestamp = Clock.System.now()
this.footer {
this.text = "Data provided by splatoon3.ink"
this.icon = "https://fedi.splatoon3.ink/favicon.png"
}
}
}
}
SplatoonOnlineMode.REGULAR -> {
val regSched = Splatoon3ApiDataGrabber.getRegularMode(System.currentTimeMillis())
val regMaps = regSched.regularMatchSetting.vsStages
val regMap1 = regMaps[0]
val regMap2 = regMaps[1]
val regSched2 =
Splatoon3ApiDataGrabber.getRegularMode(System.currentTimeMillis() + 1000 * 60 * 60 * 2)
val regMaps2 = regSched2.regularMatchSetting.vsStages
val regMap12 = regMaps2[0]
val regMap22 = regMaps2[1]
this.respond {
this.embed {
this.author {
this.name = "Current rotation for"
}
this.title = "Regular Mode"
this.description = "[[Open on website](https://splatoon3.ink/)]"
this.color = Color(0x18c81b)
this.thumbnail {
this.url = "https://static.moonleay.net/img/lilJudd/regular.png"
}
this.field {
this.name = "Current (${
TimeUtil.getTimeFromJSONTime(
regSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(regSched.endTime, "UTC")})"
this.value =
"${regSched.regularMatchSetting.vsRule.name} on ${regMap1.name} & ${regMap2.name}"
this.inline = false
}
this.field {
this.name = "${
TimeUtil.getTimeFromJSONTime(
regSched2.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(regSched2.endTime, "UTC")}"
this.value =
"${regSched2.regularMatchSetting.vsRule.name} on ${regMap12.name} & ${regMap22.name}"
this.inline = false
}
this.timestamp = Clock.System.now()
this.footer {
this.text = "Data provided by splatoon3.ink"
this.icon = "https://fedi.splatoon3.ink/favicon.png"
}
}
}
}
SplatoonOnlineMode.SERIES -> {
val serSched = Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis())
val serMaps = serSched.bankaraMatchSettings!!.first().vsStages
val serMap1 = serMaps[0]
val serMap2 = serMaps[1]
val serSched2 =
Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis() + 1000 * 60 * 60 * 2)
val serMaps2 = serSched2.bankaraMatchSettings!!.first().vsStages
val serMap12 = serMaps2[0]
val serMap22 = serMaps2[1]
this.respond {
this.embed {
this.author {
this.name = "Current rotation for"
}
this.title = "Ranked Series Mode"
this.description = "[[Open on website](https://splatoon3.ink/)]"
this.color = Color(0xE14412)
this.thumbnail {
this.url = "https://static.moonleay.net/img/lilJudd/bankara.png"
}
this.field {
this.name = "Current (${
TimeUtil.getTimeFromJSONTime(
serSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(serSched.endTime, "UTC")})"
this.value =
"${serSched.bankaraMatchSettings.first().vsRule.name} on ${serMap1.name} & ${serMap2.name}"
this.inline = false
}
this.field {
this.name = "${
TimeUtil.getTimeFromJSONTime(
serSched2.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(serSched2.endTime, "UTC")}"
this.value =
"${serSched2.bankaraMatchSettings.first().vsRule.name} on ${serMap12.name} & ${serMap22.name}"
this.inline = false
}
this.timestamp = Clock.System.now()
this.footer {
this.text = "Data provided by splatoon3.ink"
this.icon = "https://fedi.splatoon3.ink/favicon.png"
}
}
}
}
SplatoonOnlineMode.OPEN -> {
val opnSched = Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis())
val opnMaps = opnSched.bankaraMatchSettings!!.last().vsStages
val opnMap1 = opnMaps[0]
val opnMap2 = opnMaps[1]
val opnSched2 =
Splatoon3ApiDataGrabber.getSeriesMode(System.currentTimeMillis() + 1000 * 60 * 60 * 2)
val opnMaps2 = opnSched2.bankaraMatchSettings!!.last().vsStages
val opnMap12 = opnMaps2[0]
val opnMap22 = opnMaps2[1]
this.respond {
this.embed {
this.author {
this.name = "Current rotation for"
}
this.title = "Ranked Open Mode"
this.description = "[[Open on website](https://splatoon3.ink/)]"
this.color = Color(0xE14412)
this.thumbnail {
this.url = "https://static.moonleay.net/img/lilJudd/bankara.png"
}
this.field {
this.name = "Current (${
TimeUtil.getTimeFromJSONTime(
opnSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(opnSched.endTime, "UTC")})"
this.value =
"${opnSched.bankaraMatchSettings.last().vsRule.name} on ${opnMap1.name} & ${opnMap2.name}"
this.inline = false
}
this.field {
this.name = "${
TimeUtil.getTimeFromJSONTime(
opnSched2.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(opnSched2.endTime, "UTC")}"
this.value =
"${opnSched2.bankaraMatchSettings.last().vsRule.name} on ${opnMap12.name} & ${opnMap22.name}"
this.inline = false
}
this.timestamp = Clock.System.now()
this.footer {
this.text = "Data provided by splatoon3.ink"
this.icon = "https://fedi.splatoon3.ink/favicon.png"
}
}
}
}
SplatoonOnlineMode.X -> {
val xSched = Splatoon3ApiDataGrabber.getXMode(System.currentTimeMillis())
val xMaps = xSched.xMatchSetting.vsStages
val xMap1 = xMaps[0]
val xMap2 = xMaps[1]
val xSched2 = Splatoon3ApiDataGrabber.getXMode(System.currentTimeMillis() + 1000 * 60 * 60 * 2)
val xMaps2 = xSched2.xMatchSetting.vsStages
val xMap12 = xMaps2[0]
val xMap22 = xMaps2[1]
this.respond {
this.embed {
this.author {
this.name = "Current rotation for"
}
this.title = "X Mode"
this.description = "[[Open on website](https://splatoon3.ink/)]"
this.color = Color(0x0ECB93)
this.thumbnail {
this.url = "https://static.moonleay.net/img/lilJudd/x.png"
}
this.field {
this.name = "Current (${
TimeUtil.getTimeFromJSONTime(
xSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(xSched.endTime, "UTC")})"
this.value = "${xSched.xMatchSetting.vsRule.name} on ${xMap1.name} & ${xMap2.name}"
this.inline = false
}
this.field {
this.name = "${
TimeUtil.getTimeFromJSONTime(
xSched2.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTime(xSched2.endTime, "UTC")}"
this.value =
"${xSched2.xMatchSetting.vsRule.name} on ${xMap12.name} & ${xMap22.name}"
this.inline = false
}
this.timestamp = Clock.System.now()
this.footer {
this.text = "Data provided by splatoon3.ink"
this.icon = "https://fedi.splatoon3.ink/favicon.png"
}
}
}
}
SplatoonOnlineMode.SALMON_RUN -> {
val salSched = Splatoon3ApiDataGrabber.getSalmonRun(System.currentTimeMillis())
val salMap = salSched.setting.coopStage.name
val salBoss = salSched.setting.boss.name
val salWeapons = salSched.setting.weapons
val salSched2 =
Splatoon3ApiDataGrabber.getSalmonRun(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 2)
val salMap2 = salSched2.setting.coopStage.name
val salBoss2 = salSched2.setting.boss.name
val salWeapons2 = salSched2.setting.weapons
this.respond {
this.embed {
this.author {
this.name = "Current rotation for"
}
this.title = "Salmon Run"
this.description = "[[Open on website](https://splatoon3.ink/salmonrun)]"
this.color = Color(0xEA4F03)
this.thumbnail {
this.url = "https://static.moonleay.net/img/lilJudd/grizz.png"
}
this.field {
this.name = "Current (${
TimeUtil.getTimeFromJSONTimeLong(
salSched.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTimeLong(salSched.endTime, "UTC")})"
this.value =
"${salBoss} on ${salMap} with ${salWeapons[0].name}, ${salWeapons[1].name}, ${salWeapons[2].name} & ${salWeapons[3].name}"
this.inline = false
}
this.field {
this.name = "${
TimeUtil.getTimeFromJSONTimeLong(
salSched2.startTime,
"UTC"
)
} - ${TimeUtil.getTimeFromJSONTimeLong(salSched2.endTime, "UTC")}"
this.value =
"${salBoss2} on ${salMap2} with ${salWeapons2[0].name}, ${salWeapons2[1].name}, ${salWeapons2[2].name} & ${salWeapons2[3].name}"
this.inline = false
}
this.timestamp = Clock.System.now()
this.footer {
this.text = "Data provided by splatoon3.ink"
this.icon = "https://fedi.splatoon3.ink/favicon.png"
}
}
}
}
}
}
}
}
inner class RotationArguments : Arguments() {
val mode by enumChoice<SplatoonOnlineMode> {
this.name = "mode"
this.description = "The mode you want to check the rotation for"
this.typeName = "en_US"
}
}
}

View file

@ -0,0 +1,145 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.extensions
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.entity.Permission
import dev.kord.core.behavior.channel.createMessage
import dev.kord.rest.builder.message.actionRow
import dev.kord.rest.builder.message.embed
import kotlinx.coroutines.delay
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData
import net.moonleay.liljudd.data.database.repository.TimePlanningMessagesRepository
import net.moonleay.liljudd.util.*
import java.time.ZoneId
import java.time.ZonedDateTime
/* This extension has no proper use.
It is used in testing to test stuff, without having to wait for certain events to trigger. */
class SendPlannerExtension : Extension() {
override val name = "sendplanner"
override val allowApplicationCommandInDMs: Boolean
get() = false
override suspend fun setup() {
publicSlashCommand {
name = "sendplanner"
description = "Send the planner for the current week"
this.action {
if (!this.member!!.asMember(this.guild!!.id)
.hasPermission(Permission.Administrator)
) {
val res = this.respond {
this.embed {
this.color = EmbedColor.ERROR.color
this.title = "401: Not Authorized"
this.description =
"You need the Administrator permission to use this command."
this.footer {
this.icon = user.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(user)
}
}
}
res.delete()
return@action
}
val res = this.respond {
this.embed {
this.color = EmbedColor.INFO.color
this.title = "200: Success"
this.description = "Sending the planner.\n" +
"This may take a while, please be patient."
this.footer {
this.icon = user.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(user)
}
}
}
res.delete() // Delete the response
val c = this.getChannel().asChannel()
var msgStr = ""
var then =
ZonedDateTime.now(ZoneId.of("Europe/Berlin")).withDayOfMonth(TimeUtil.getMondayDayOfMonth())
.withHour(4)
.withMinute(0).withSecond(0)
c.createMessage {
this.embed {
this.color = EmbedColor.INFO.color
this.title = "Time Planning Feature"
this.description = "Do you have time on the following Days?"
this.footer {
this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter()
}
}
}
delay(1000)
repeat(7) {
val eb = MessageUtil.getEmbedWithTable(
EmbedColor.INFO,
"",
"${then.dayOfWeek.name}, ${then.dayOfMonth}.${then.monthValue}.${then.year} /${it + 1}. weekday",
mapOf(
"Is available" to listOf(),
"May be available" to listOf(),
"Is not available" to listOf()
)
)
val msg = c.createMessage {
this.embed {
this.color = eb.color
this.title = eb.title
this.description = eb.description
this.fields = eb.fields
this.footer {
this.icon = Bot.bot.kordRef.getSelf().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter()
}
}
this.actionRow {
this.components.addAll(EmbedUtil.getTimePlannerButtons().components)
}
}
msgStr += "${it}:${msg.id.value};"
then = then.plusDays(1).withHour(4).withMinute(0).withSecond(0)
Logger.out("Finished sending day $it/ This was manually triggered")
delay(1000)
}
// Save the message ids
TimePlanningMessagesRepository.write(
TimePlanningMessagesData(
-1,
c.data.guildId.value?.value!!.toLong(),
c.id.value.toLong(),
(TimeUtil.getWeekStamp().toEpochSecond()),
msgStr
)
)
Logger.out("Finished with ${c.data.guildId.value}")
}
}
}
}

View file

@ -0,0 +1,76 @@
/*
* 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.extensions
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
import com.kotlindiscord.kord.extensions.utils.hasPermission
import dev.kord.common.entity.Permission
import dev.kord.rest.builder.message.embed
import net.moonleay.liljudd.features.AvailabilityManager
import net.moonleay.liljudd.util.EmbedColor
import net.moonleay.liljudd.util.Logger
import net.moonleay.liljudd.util.MessageUtil
class UpdateRolesExtension : Extension() {
override val name = "updateroles"
override val allowApplicationCommandInDMs: Boolean
get() = false
override suspend fun setup() {
publicSlashCommand {
name = "updateroles"
description = "Update the roles of the members in the current server"
this.action {
if (!this.member!!.asMember(this.guild!!.id)
.hasPermission(Permission.Administrator)
) {
this.respond {
this.embed {
this.color = EmbedColor.ERROR.color
this.title = "401: Not Authorized"
this.description =
"You need the Administrator permission to use this command."
this.footer {
this.icon = user.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(user)
}
}
}
return@action
}
this.respond {
this.embed {
this.color = EmbedColor.INFO.color
this.title = "200: Success"
this.description = "Updating roles.\n" +
"This may take a while, please be patient."
this.footer {
this.icon = user.asUser().avatar?.cdnUrl?.toUrl()
this.text = MessageUtil.getFooter(user)
}
}
}
Logger.out("Starting to update roles...")
AvailabilityManager.updateInChannel(this.channel.id)
}
}
}
}

View file

@ -1,6 +1,6 @@
/*
* lilJudd
* Copyright (C) 2023 moonleay
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
* along with this program. If not, see <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

View file

@ -0,0 +1,29 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.extensions.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
enum class MatchTypes(override val readableName: String) : ChoiceEnum {
TOURNEY("Tourney Match"),
LADDER("Ladder Match"),
SCRIM("Scrim"),
LAN("LAN Match"),
OPEN("Anarchy Open");
}

View file

@ -0,0 +1,30 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.extensions.component
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.ChoiceEnum
enum class SplatoonOnlineMode(override val readableName: String) : ChoiceEnum {
ALL("All Modes"),
REGULAR("Regular Battle"),
SERIES("Ranked Battle (Series)"),
OPEN("Ranked Battle (Open)"),
X("X Battle"),
SALMON_RUN("Salmon Run"),
}

View file

@ -0,0 +1,256 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.features
import com.kotlindiscord.kord.extensions.utils.isNullOrBot
import dev.inmo.krontab.buildSchedule
import dev.inmo.krontab.doInfinity
import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.UserBehavior
import dev.kord.core.behavior.createRole
import dev.kord.core.behavior.requestMembers
import dev.kord.core.entity.channel.Channel
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.gateway.PrivilegedIntent
import dev.kord.rest.builder.message.EmbedBuilder
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.data.database.entry.PlanningNotifierRolesData
import net.moonleay.liljudd.data.database.entry.TimePlanningMessagesData
import net.moonleay.liljudd.data.database.repository.PlanningNotifierRolesRepository
import net.moonleay.liljudd.data.database.repository.TimePlanningMessagesRepository
import net.moonleay.liljudd.extensions.FeatureManageExtension
import net.moonleay.liljudd.features.component.FeatureEnum
import net.moonleay.liljudd.features.component.IFeature
import net.moonleay.liljudd.util.*
import java.time.ZonedDateTime
object AvailabilityManager : IFeature {
// This runs during the cronjob.
suspend fun runThread() {
Logger.out("Updating match roles")
// ChannelID, Data
val messages = TimePlanningMessagesRepository.getWeek(TimeUtil.getWeekStamp().toEpochSecond())
.associateBy { it.channelID }
val targetedRoles = PlanningNotifierRolesRepository.getAll().associateBy { it.channelID }
if (targetedRoles.isEmpty()) {
Logger.out("No saved roles. Canceling.")
return
}
for (id in messages.keys) {
val snf = Snowflake(id) // snf = Snowflake
val data = messages[id]!! // this is the data of the table
if (Bot.bot.kordRef.getChannel(Snowflake(data.channelID)) == null) {
// This channel does not exist anymore.
Logger.out("Warning: Channel ${data.channelID} does not exist anymore. Skipping.")
continue
}
val roleData = targetedRoles[data.channelID] // Get the role data
if (roleData == null) {
Logger.out("Role for channel ${data.channelID} does not exist")
continue // this took way to long to find out that this was the issue
}
this.updateInChannel(snf, data, roleData)
}
Logger.out("Finished updating roles")
}
suspend fun updateInChannel(snf: Snowflake) {
val stamp = TimeUtil.getWeekStamp().toEpochSecond()
Logger.out("Weekstamp: $stamp")
val messageData = TimePlanningMessagesRepository.getWeekInChannel(
stamp,
snf.value.toLong()
)
if (messageData == null) {
Logger.out("Could not find data for channel ${snf.value}")
return
}
val roleData = PlanningNotifierRolesRepository.getForChannel(snf.value.toLong())
if (roleData == null) {
Logger.out("Role for channel ${messageData.channelID} does not exist")
return // this took way to long to find out that this was the issue
}
updateInChannel(snf, messageData, roleData)
}
@OptIn(PrivilegedIntent::class)
suspend fun updateInChannel(snf: Snowflake, tpmd: TimePlanningMessagesData, pnrd: PlanningNotifierRolesData) {
if (Bot.bot.kordRef.getChannel(snf) == null)
return // This channel does not exist anymore.
val c = Bot.bot.kordRef.getChannelOf<MessageChannel>(snf)!! // Get the channel as MessageChannel
val weekday = ZonedDateTime.now().dayOfWeek // The current week day
val weekStamp = TimeUtil.getWeekStamp().toEpochSecond() // The current week time stamp
Logger.out("It is week ${weekStamp} and day ${weekday}/${TimeUtil.getDayOfMonthInt(weekday)} of the week.")
val g = Bot.bot.kordRef.getGuild(Snowflake(tpmd.serverID))
// Get all members with the role
val mce = g.requestMembers {
this.requestAllMembers()
}
mce.collect { memberchunkevent ->
memberchunkevent.members.forEach {
if (!it.isNullOrBot()) { // Check if the member is a bot
Logger.out("Checking member ${it.id.value} (${it.username})")
if (it.roleIds.contains(Snowflake(pnrd.hasTimeRoleID))) {
it.removeRole(Snowflake(pnrd.hasTimeRoleID))
Logger.out("Removed role from ${it.username}") // Removed the role
}
}
// I cant use continue here, because it does not work with .forEach
}
}
Logger.out("Got through all members")
// This stores the ids of the messages.
// The format is weekdaNR:ID
// The last entry (nr 8) is empty, so we can ignore it
val messageIdSplit = tpmd.messageIDs.split(";").subList(0, 7)
for (mid in messageIdSplit) {
Logger.out("Checking id $mid")
if (!mid.startsWith((TimeUtil.getDayOfMonthInt(weekday) - 1).toString(), true))
continue// This is not the right message, check the next one
val idFiltered = mid.split(":")[1] // This is the target message id
val message = c.getMessageOrNull(Snowflake(idFiltered)) // Get the message from the channel
if (message == null) {
Logger.out("Could not find message.")
return // This message does not exist anymore. Nothing we can do about that.
}
if (message.data.embeds.isEmpty()) {
Logger.out("There are no embeds.")
return // There are no embeds or there are not enough embeds
}
val targets = EmbedUtil.getAllUsersInTheFirstXTables(2, message.embeds[0])
for (tid in targets) {
Logger.out("Checking id $tid")
if (Bot.bot.kordRef.getGuildOrNull(Snowflake(tpmd.serverID))!!
.getMemberOrNull(Snowflake(tid)) == null
)
continue// This member does not exist anymore.
val member = Bot.bot.kordRef.getGuild(Snowflake(tpmd.serverID))
.getMember(Snowflake(tid)) // Get the member
if (member.roleIds.contains(Snowflake(pnrd.hasTimeRoleID)))
continue // This member already has the role
member.addRole(Snowflake(pnrd.hasTimeRoleID)) // Add the role
Logger.out("Added role to ${member.username}")
}
Logger.out("Done with message. Moving on...")
// We found the right message. We don't need to check the others.
break
}
}
override val feat: FeatureEnum
get() = FeatureEnum.PLANNINGROLES
// Register the cronjob to run at 1AM UTC every day
override suspend fun registerThread() {
Logger.out("Registering daily planning message role update coroutine")
val scheduler = buildSchedule("0 0 2 * * *") // 0 0 4 * * * 0o 1w // 0o is UTC
scheduler.doInfinity {
this.runThread()
}
}
override suspend fun enable(
u: UserBehavior,
gID: Long,
cID: Long,
ch: Channel,
args: FeatureManageExtension.FeatureManagerArgs
): EmbedBuilder {
val alreadyExists = PlanningNotifierRolesRepository.existsInChannel(cID)
// Check if the channel and guild already exist in the db
if (!alreadyExists) {
// Create the roles in Discord
val hasTimeRole = Bot.bot.kordRef.getGuild(Snowflake(gID)).createRole {
this.name = "available [${ch.data.name.value}]"
this.mentionable = true
}
val htr = hasTimeRole.id.value.toLong()
val wantsNotifsRole = Bot.bot.kordRef.getGuild(Snowflake(gID)).createRole {
this.name = "notifications [${ch.data.name.value}]"
this.mentionable = true
}
val wnr = wantsNotifsRole.id.value.toLong()
// Save the role ids to db
PlanningNotifierRolesRepository.write(
PlanningNotifierRolesData(
id = -1,
serverID = gID,
channelID = cID,
hasTimeRoleID = htr,
wantsToBeNotifiedID = wnr
)
)
return MessageUtil.getEmbed(
EmbedColor.SUCCESS,
"200: Success",
"The feature was enabled in channel ${args.channel.data.name.value} with roles ${hasTimeRole.mention} & ${wantsNotifsRole.mention}.",
u.asUser().username + "#" + u.asUser().discriminator
)
}
// They exist, do not add them
return MessageUtil.getEmbed(
EmbedColor.ERROR,
"403: Forbidden",
"The feature is already enabled in this channel.",
u.asUser().username + "#" + u.asUser().discriminator
)
}
override suspend fun disable(
u: UserBehavior,
gID: Long,
cID: Long,
ch: Channel,
args: FeatureManageExtension.FeatureManagerArgs
): EmbedBuilder {
// Check if entry exists in db
if (PlanningNotifierRolesRepository.existsInChannelFromSever(cID, gID)) {
val entry = PlanningNotifierRolesRepository.getForChannelInServer(cID, gID)!!
// delete all entries for this guild and channel combo
Bot.bot.kordRef.getGuild(Snowflake(gID))
.getRoleOrNull(Snowflake(entry.hasTimeRoleID))?.delete()
Bot.bot.kordRef.getGuild(Snowflake(gID))
.getRoleOrNull(Snowflake(entry.wantsToBeNotifiedID))?.delete()
// delete all found entries
PlanningNotifierRolesRepository.delete(entry.id)
return MessageUtil.getEmbed(
EmbedColor.SUCCESS,
"200: Success",
"The feature was disabled.",
u.asUser().username + "#" + u.asUser().discriminator
)
}
// not in db, do nothing
return MessageUtil.getEmbed(
EmbedColor.ERROR,
"403: Forbidden",
"The feature is already disabled in this channel.",
u.asUser().username + "#" + u.asUser().discriminator
)
}
}

View file

@ -0,0 +1,64 @@
/*
* lilJudd
* Copyright (C) 2024 moonleay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.moonleay.liljudd.features
import dev.kord.common.entity.Snowflake
import net.moonleay.liljudd.Bot
import net.moonleay.liljudd.data.database.entry.MatchPlanningDataData
import net.moonleay.liljudd.data.database.repository.MatchPlanningDataRepository
import net.moonleay.liljudd.jobs.MatchJob
import net.moonleay.liljudd.jobs.component.JobManager
import net.moonleay.liljudd.util.Logger
object MatchManager {
suspend fun update() {
Logger.out("Updating matches")
val dataList = MatchPlanningDataRepository.getAll()
for (data in dataList) {
Logger.out("Checking match role ${data.id}...")
if (data.timestamp < System.currentTimeMillis()) {
Logger.out("Match role ${data.id} is expired, removing...")
this.removeRoleFromGuild(data.serverID, data.roleID)
MatchPlanningDataRepository.delete(data.id)
continue
}
this.registerJob(data)
}
Logger.out("Finished updating matches")
}
private fun registerJob(data: MatchPlanningDataData) {
JobManager.addJob(
MatchJob(
data.jobString,
data.id,
"fromdb-${data.matchType}_Vs_${data.opponentName}_[${data.id}]-${data.serverID}_${data.channelID}"
)
)
Logger.out("Registered job for match ${data.id}...")
}
private suspend fun removeRoleFromGuild(gid: Long, rid: Long): Boolean {
val guild = Bot.bot.kordRef.getGuildOrNull(Snowflake(gid)) ?: return false
val role = guild.getRoleOrNull(Snowflake(rid)) ?: return false
role.delete()
return true
}
}

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