151 Commits

Author SHA1 Message Date
e05e67785b Build patched version 2023-03-31 12:25:37 +02:00
72d3ccded3 Merge pull request 'Fixed reaction handling #287' (#288) from 1.0.4 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#288
Closes #287
2023-03-31 12:04:09 +02:00
f30bd119df Fixed reaction handling #287 2023-03-31 12:03:07 +02:00
858fc062b3 Merge pull request '1.0.3 #285' (#286) from 1.0.3 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#286
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #285
2023-03-30 16:55:32 +02:00
6d622a70d3 Build patch version 2023-03-30 14:45:37 +02:00
4a0a6a4631 Improved logging to app end 2023-03-30 14:43:21 +02:00
17c2acd77c Improved logging to app end 2023-03-30 14:37:02 +02:00
27363522d3 Fixed xp input #285 2023-03-30 14:29:31 +02:00
1960b18058 Improved level service 2023-03-30 14:23:29 +02:00
91034cee09 Merge pull request '1.0.2 #283' (#284) from 1.0.2 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#284
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #283
2023-03-29 23:06:51 +02:00
a4d3cffa93 Removed test logs 2023-03-29 23:05:41 +02:00
809c6d4cb9 Build patch version 2023-03-29 22:59:40 +02:00
2fecbf2c31 Added cache service to cache server 2023-03-29 22:58:32 +02:00
c439d5925f Merge pull request '1.0.1' (#278) from 1.0.1 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#278
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-03-29 21:00:02 +02:00
1777a32899 Merge pull request '#281' (#282) from #281 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#282
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #281
2023-03-29 19:45:10 +02:00
3e5301b2d8 Merge branch '1.0.1' into #281 2023-03-29 19:39:04 +02:00
653562b908 idk #281 2023-03-29 19:38:42 +02:00
8025c31339 Set xp by level only when incoming level is different from user level #281 2023-03-29 19:38:25 +02:00
ccf41bec79 Retry select after half a second 2023-03-29 15:17:19 +02:00
f75d8f2068 Merge pull request 'Fixed reaction handling #279' (#280) from #279 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#280
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #279
2023-03-29 14:53:49 +02:00
da02aca7e4 Fixed reaction handling #279 2023-03-29 14:52:36 +02:00
3762f16c7e Merge pull request 'Fixed remove warning team notification #270' (#271) from #270 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#271
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #270
2023-03-28 23:39:41 +02:00
b3099121ab Build bot version #270 2023-03-28 23:36:33 +02:00
6a750ee31b Set bot version #270 2023-03-28 23:36:06 +02:00
3c371ec074 Set correct frontend version #270 2023-03-28 23:34:42 +02:00
d818eafb9d Merge branch '1.0.1' into #270 2023-03-28 23:30:32 +02:00
b4a5fdb258 Merge pull request 'Fixed unnecessary voice states #274' (#275) from #274 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#275
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #274
2023-03-28 23:29:47 +02:00
cf69436168 Merge pull request 'Fixed can_user_see_element #272' (#273) from #272 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#273
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #272
2023-03-28 23:29:35 +02:00
ccf171e876 Merge pull request 'Fixed id access #266' (#267) from #266 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#267
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #266
2023-03-28 23:29:22 +02:00
5a312bf660 Merge pull request 'Als Admin möchte ich, dass bei Erstellung einer AutoRollen Regel die Reaktion automatisch hinzugefügt wird #259' (#263) from #259 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#263
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #259
2023-03-28 23:29:05 +02:00
0003255d7c Merge branch '1.0.1' into #274 2023-03-28 18:24:21 +02:00
27a4c140e4 Fixed unnecessary voice states #274 2023-03-28 18:23:45 +02:00
3183461195 Merge branch '1.0.1' into #272 2023-03-28 15:46:14 +02:00
cb4f8d870c Fixed can_user_see_element #272 2023-03-28 15:45:38 +02:00
7c447bb0f2 Set frontend version for patch version #270 2023-03-28 15:04:20 +02:00
4debe4e2ba Fixed remove warning team notification #270 2023-03-28 15:01:35 +02:00
3cd3df3e5f Merge branch '1.0.1' into #266 2023-03-27 19:46:51 +02:00
b4a631d4e4 Fixed id access #266 2023-03-27 19:46:10 +02:00
7ba0247519 Merge pull request 'Fixed dropdown color #260' (#262) from #260 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#262
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #260
2023-03-27 19:35:30 +02:00
209e75fdcc Merge pull request 'Disabled add button for mods in level list #264' (#265) from #264 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#265
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #264
2023-03-27 19:35:04 +02:00
3bca3f86eb Disabled add button for mods in level list #264 2023-03-27 19:33:22 +02:00
657a8fa586 Added comment #259 2023-03-27 10:17:56 +02:00
3c8a092f40 Added logic to add reaction after creating auto role rule in WI #259 2023-03-27 10:17:55 +02:00
61bf508cea Fixed dropdown color #260 2023-03-27 10:04:18 +02:00
75ad07477a Merge pull request '1.0.0' (#253) from 1.0.0 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#253
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-03-27 09:30:49 +02:00
132d41f0a2 Fixed some stuff 2023-03-26 22:58:56 +02:00
707a835672 Updated docker & config 2023-03-26 20:08:04 +02:00
f56dbf8e2a Merge pull request 'Fixed permission handling for member data #256' (#258) from #256 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#258
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
#Closes #256
2023-03-25 18:01:57 +01:00
c311e534d7 Merge pull request 'Fixed profile navigation #255' (#257) from #255 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#257
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #255
2023-03-25 18:01:41 +01:00
87b277515c Fixed permission handling for member data #256 2023-03-24 14:23:13 +01:00
e6c614dfdc Fixed profile navigation #255 2023-03-24 14:15:21 +01:00
24d5bbf4d8 Made version in presence optional 2023-03-24 14:14:49 +01:00
52035af0cc Fixed jwt handling 2023-03-21 19:14:39 +01:00
fdc9a118c8 Fixed jwt handling 2023-03-20 16:30:07 +01:00
ba1f4ee955 Merge pull request '1.0.0-fix' (#254) from 1.0.0-fix into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#254
2023-03-20 14:41:33 +01:00
35d161c080 Removed obsolete fix 2023-03-20 14:40:56 +01:00
818163cbed Formatted tools 2023-03-20 14:39:23 +01:00
468ebb5f79 Merge branch 'master' into 1.0.0-fix
# Conflicts:
#	kdb-bot/src/bot/__init__.py
#	kdb-bot/src/bot/bot.json
#	kdb-bot/src/bot/config
#	kdb-bot/src/bot/extension/__init__.py
#	kdb-bot/src/bot_api/__init__.py
#	kdb-bot/src/bot_api/abc/__init__.py
#	kdb-bot/src/bot_api/bot-api.json
#	kdb-bot/src/bot_api/configuration/__init__.py
#	kdb-bot/src/bot_api/controller/__init__.py
#	kdb-bot/src/bot_api/event/__init__.py
#	kdb-bot/src/bot_api/exception/__init__.py
#	kdb-bot/src/bot_api/filter/__init__.py
#	kdb-bot/src/bot_api/filter/discord/__init__.py
#	kdb-bot/src/bot_api/logging/__init__.py
#	kdb-bot/src/bot_api/model/__init__.py
#	kdb-bot/src/bot_api/model/discord/__init__.py
#	kdb-bot/src/bot_api/route/__init__.py
#	kdb-bot/src/bot_api/service/__init__.py
#	kdb-bot/src/bot_api/transformer/__init__.py
#	kdb-bot/src/bot_core/__init__.py
#	kdb-bot/src/bot_core/abc/__init__.py
#	kdb-bot/src/bot_core/bot-core.json
#	kdb-bot/src/bot_core/configuration/__init__.py
#	kdb-bot/src/bot_core/core_extension/__init__.py
#	kdb-bot/src/bot_core/events/__init__.py
#	kdb-bot/src/bot_core/exception/__init__.py
#	kdb-bot/src/bot_core/helper/__init__.py
#	kdb-bot/src/bot_core/logging/__init__.py
#	kdb-bot/src/bot_core/pipes/__init__.py
#	kdb-bot/src/bot_core/service/__init__.py
#	kdb-bot/src/bot_data/__init__.py
#	kdb-bot/src/bot_data/abc/__init__.py
#	kdb-bot/src/bot_data/bot-data.json
#	kdb-bot/src/bot_data/migration/__init__.py
#	kdb-bot/src/bot_data/model/__init__.py
#	kdb-bot/src/bot_data/service/__init__.py
#	kdb-bot/src/bot_graphql/__init__.py
#	kdb-bot/src/bot_graphql/abc/__init__.py
#	kdb-bot/src/bot_graphql/filter/__init__.py
#	kdb-bot/src/bot_graphql/mutations/__init__.py
#	kdb-bot/src/modules/auto_role/__init__.py
#	kdb-bot/src/modules/auto_role/auto-role.json
#	kdb-bot/src/modules/auto_role/command/__init__.py
#	kdb-bot/src/modules/auto_role/events/__init__.py
#	kdb-bot/src/modules/auto_role/helper/__init__.py
#	kdb-bot/src/modules/base/__init__.py
#	kdb-bot/src/modules/base/abc/__init__.py
#	kdb-bot/src/modules/base/base.json
#	kdb-bot/src/modules/base/command/__init__.py
#	kdb-bot/src/modules/base/configuration/__init__.py
#	kdb-bot/src/modules/base/events/__init__.py
#	kdb-bot/src/modules/base/events/base_on_voice_state_update_event.py
#	kdb-bot/src/modules/base/helper/__init__.py
#	kdb-bot/src/modules/base/model/__init__.py
#	kdb-bot/src/modules/base/service/__init__.py
#	kdb-bot/src/modules/base/thread/__init__.py
#	kdb-bot/src/modules/boot_log/__init__.py
#	kdb-bot/src/modules/boot_log/boot-log.json
#	kdb-bot/src/modules/boot_log/configuration/__init__.py
#	kdb-bot/src/modules/database/__init__.py
#	kdb-bot/src/modules/database/database.json
#	kdb-bot/src/modules/level/__init__.py
#	kdb-bot/src/modules/level/command/__init__.py
#	kdb-bot/src/modules/level/configuration/__init__.py
#	kdb-bot/src/modules/level/events/__init__.py
#	kdb-bot/src/modules/level/level.json
#	kdb-bot/src/modules/level/service/__init__.py
#	kdb-bot/src/modules/permission/__init__.py
#	kdb-bot/src/modules/permission/abc/__init__.py
#	kdb-bot/src/modules/permission/configuration/__init__.py
#	kdb-bot/src/modules/permission/events/__init__.py
#	kdb-bot/src/modules/permission/permission.json
#	kdb-bot/src/modules/permission/service/__init__.py
#	kdb-bot/src/modules/stats/service/__init__.py
#	kdb-bot/src/modules/stats/stats.json
#	kdb-bot/src/modules/technician/__init__.py
#	kdb-bot/src/modules/technician/command/__init__.py
#	kdb-bot/src/modules/technician/technician.json
#	kdb-bot/tools/get_version/get-version.json
#	kdb-bot/tools/post_build/post-build.json
#	kdb-bot/tools/set_version/set-version.json
2023-03-20 14:39:18 +01:00
085726bf60 Updated config 2023-03-20 14:32:44 +01:00
223abbe66f Fixed user mutation 2023-03-20 14:11:02 +01:00
4c5a8baed5 Build release 2023-03-20 14:01:08 +01:00
59162408e5 Merge pull request 'Datenschutz und Impressum angeben #251' (#252) from #251 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#252
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #251
2023-03-20 13:42:23 +01:00
634b81d23b Merge branch '1.0.0' into #251 2023-03-20 13:40:17 +01:00
c0cd5bb70e Merge pull request '1.0.0.rc2' (#250) from 1.0.0.rc2 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#250
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-03-20 13:40:00 +01:00
cc0a0a5c69 Added logic to confirm privacy before registration #251 2023-03-17 14:43:16 +01:00
4420c0e11c Added imprint & privacy to auth and improved getting url #251 2023-03-17 13:48:48 +01:00
7be40ed236 Added imprint and privacy urls 2023-03-17 13:18:33 +01:00
ff415c354d Merge branch '1.0.0' into 1.0.0.rc2 2023-03-14 18:43:35 +01:00
283eaabef6 Merge pull request 'Als Nutzer möchte ich Datenänderungen nach verfolgen können #246' (#248) from #246 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#248
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: Jonas <joni.drescher@web.de>
2023-03-14 18:31:36 +01:00
b7e72888f7 Fixed translation #246 2023-03-14 17:00:52 +01:00
b29227e8d5 Fixed translation 2023-03-14 17:00:34 +01:00
9f57182fc1 Fixed collection sorting & paging order 2023-03-14 15:32:26 +01:00
699377be54 Added type hints #246 2023-03-14 15:32:00 +01:00
efba1a4ce8 Added type hints #246 2023-03-12 18:46:39 +01:00
68fa1b8c2d Fixed translation 2023-03-12 05:04:26 +01:00
8b79d69e41 Build 1.0.0.rc2 2023-03-12 04:55:42 +01:00
c1b75dff78 Set frontent version 1.0.0.rc2 2023-03-12 04:55:42 +01:00
5f284597aa Build 1.0.0.rc2 2023-03-12 04:55:42 +01:00
e1b1a68b07 Set version for rc2 2023-03-12 04:55:42 +01:00
b1a0115e8b Fixed db set date & show only changed fields in history view #246 2023-03-12 04:55:04 +01:00
ad00dce5d9 Fixed mysql scripts #246 2023-03-11 03:09:27 +01:00
e3c47ce5b1 Fixed mysql scripts #246 2023-03-11 03:09:18 +01:00
68026e4b47 Improved history component #246 2023-03-11 03:08:47 +01:00
ee503f76f2 Order history tables #246 2023-03-11 01:19:06 +01:00
a1f7b8b2dc Added en and fixed de translation #246 2023-03-11 01:19:06 +01:00
b8e4146b33 Added history to all data tables #246 2023-03-11 01:19:06 +01:00
51f0ee5744 Improved history component #246 2023-03-11 01:19:06 +01:00
69ce659328 Added history tables to graphql #246 2023-03-11 01:18:35 +01:00
325a17b5a8 Added level history to graphql #246 2023-03-11 01:18:35 +01:00
5df0501505 Added last migration parts #246 2023-03-11 01:18:35 +01:00
c3ef7a746f [WIP] Added last tables #246 2023-03-11 01:18:35 +01:00
bca33c6e56 [WIP] Added more tables #246 2023-03-11 01:18:35 +01:00
d24d3fa4de [WIP] Added more tables #246 2023-03-11 01:18:35 +01:00
1755efb5d9 [WIP] Added migration and basics for history logic #246 2023-03-11 01:18:35 +01:00
54b0086a14 Merge pull request 'Unbekannte Benutzer führen zu einem Fehler mit tracking id statt einer fehlermeldung #247' (#249) from #247 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#249
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #247
2023-03-11 01:17:15 +01:00
f404287cc1 Merge branch '1.0.0' into #247 2023-03-11 01:14:47 +01:00
7966ca16e5 Merge pull request '1.0.0.rc1' (#244) from 1.0.0.rc1 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#244
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-03-11 01:12:31 +01:00
c0e5f0d4b0 Updated config 2023-03-09 19:41:10 +01:00
80769a1bf0 Fixed permission service 2023-03-09 19:27:56 +01:00
bc92dc4536 Fixed icon buttons #247 2023-03-09 11:22:10 +01:00
16ef29999c Fixed _is_email_valid method #247 2023-03-09 11:15:28 +01:00
33279b7053 Fixed collection count field #247 2023-03-09 11:12:48 +01:00
04fcfddbd9 Code cleanup #247 2023-03-09 11:10:53 +01:00
21f0f32322 Retranslate sidebar on lang change 2023-03-06 10:54:58 +01:00
d1420d18c0 Put boot log send message in loop task #243 2023-03-06 10:54:58 +01:00
22d26bf032 Reload levelsystem after mutate levels #245 2023-03-06 10:54:58 +01:00
a701807831 Fixed frontend permissions 2023-03-06 10:54:58 +01:00
3324cf3ac3 Fixed time calculation for user joined gs/vs 2023-03-06 10:54:58 +01:00
1664c67763 Fixed time calculation for user joined gs/vs 2023-03-06 10:54:58 +01:00
bddcd3929a Updated docker compose 2023-03-06 10:54:58 +01:00
23e17c1f38 Fixed auto-role error 2023-03-06 08:42:48 +01:00
883811d156 Removed minecraft_id 2023-03-06 08:42:48 +01:00
4d0e8898fe Build frontend 2023-03-06 08:42:48 +01:00
505c87b996 Build version 2023-03-06 08:42:48 +01:00
18fe6ecb86 Set version for rc 2023-03-06 08:42:48 +01:00
f02268c1a1 Merge pull request '#238' (#242) from #238 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#242
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #238
2023-03-06 08:42:21 +01:00
1b328dc20e Fixed translation #238 2023-03-06 08:05:30 +01:00
34c362a391 Improved game server handling for ontime #238 2023-03-06 08:05:08 +01:00
15dfc3f47c Added GameServer & ApiKey logic #238 2023-03-06 08:05:08 +01:00
91b2cf7546 Added GameServer handling & commands #238 2023-03-06 08:05:08 +01:00
a8dad6b223 Added GameServer data model #238 2023-03-06 08:05:08 +01:00
124209c371 Merge pull request '#240' (#241) from #240 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#241
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #240
2023-03-05 21:55:39 +01:00
d24c8e40de Merge branch '1.0.0' into #240 2023-03-05 21:47:53 +01:00
54004d10a5 Merge pull request 'Übersetzungen in Front und Backend aufräumen #232' (#237) from #232 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#237
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #232
2023-03-05 21:47:38 +01:00
a510cf731f Fixed german translation #232 2023-03-05 21:42:51 +01:00
23b7e4f59c Fixed english translation #232 2023-03-05 21:33:30 +01:00
24f90657e1 Fixed german translation #232 2023-03-05 21:22:22 +01:00
454fabb3e3 Added migration only mode #240 2023-03-04 18:57:51 +01:00
a588f8bf72 Merge pull request 'Verwarnungssystem #35' (#235) from #35 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#235
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #35
2023-02-24 08:49:08 +01:00
d75503569e Refactored translations #232 2023-02-23 10:58:08 +01:00
5b265488df Refactored translations #232 2023-02-23 10:56:07 +01:00
2d995544c3 Code refactoring #35 2023-02-23 08:58:04 +01:00
e5fb9fd504 Merge branch '1.0.0' into #35 2023-02-23 08:46:52 +01:00
a80bbc33cf Merge pull request 'Fixed table loading #220' (#236) from #220 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#236
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #220
2023-02-23 08:46:04 +01:00
6915515932 Fixed table loading #220 2023-02-22 21:02:49 +01:00
42b71525bd Merge pull request '#133' (#224) from #133 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#224
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Jonas <joni.drescher@web.de>
2023-02-22 19:29:16 +01:00
2674af64e9 Added warning commands #35 2023-02-22 08:44:08 +01:00
1eb625fe7a Improved warning handling #35 2023-02-22 08:39:50 +01:00
19f47a01e5 Added warnings service #35 2023-02-22 08:39:50 +01:00
8ff21debf0 Added user warning repository #35 2023-02-22 08:39:50 +01:00
89bcb655d2 Added user warning model #35 2023-02-22 08:39:50 +01:00
b9d33c5fd0 Merge branch '1.0.0' into #133 2023-02-21 22:45:30 +01:00
9ea1b14852 Optimized code #133 2023-02-21 22:44:42 +01:00
23ee963d65 Fixed formattings #133 2023-02-21 17:29:08 +01:00
f3024d2ea5 Fixed changes of rebase #133 2023-02-21 17:24:18 +01:00
Jonas Drescher
e463b19a73 added level table 2023-02-21 17:11:56 +01:00
15214b1c99 Fixed user filter #133 2023-02-21 17:10:34 +01:00
Jonas Drescher
dfcd958965 WIP: levels table 2023-02-21 17:10:32 +01:00
e1c89814da Fixed voice state update (ontime) handling 2023-01-19 20:02:56 +01:00
53cdaf3fa0 Added get_ontime_overlaps script 2023-01-19 19:34:03 +01:00
b11ce18ac9 Fixed switch channel handling 2023-01-19 18:35:49 +01:00
303 changed files with 11769 additions and 10965 deletions

View File

@@ -14,6 +14,7 @@
"level": "src/modules/level/level.json",
"permission": "src/modules/permission/permission.json",
"technician": "src/modules/technician/technician.json",
"checks": "tools/checks/checks.json",
"get-version": "tools/get_version/get-version.json",
"post-build": "tools/post_build/post-build.json",
"set-version": "tools/set_version/set-version.json"

View File

@@ -15,4 +15,7 @@ RUN apk add nano
RUN pip install -r requirements.txt --extra-index-url https://pip.sh-edraft.de
RUN pip install flask[async]
# RUN pip install dnspython==2.2.1 # https://stackoverflow.com/questions/75137717/eventlet-dns-python-attribute-error-module-dns-rdtypes-has-no-attribute-any
# ^ probably fixed py package updates
CMD [ "bash", "/app/bot/bot"]

View File

@@ -15,7 +15,7 @@ __title__ = "bot"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -52,7 +52,7 @@ class Application(DiscordBotApplicationABC):
self._api.join()
return
self._logger.trace(__name__, f"Try to start {DiscordBotService.__name__}")
self._logger.info(__name__, f"Try to start {DiscordBotService.__name__}")
await self._bot.start_async()
await self._bot.stop_async()
except Exception as e:
@@ -64,9 +64,9 @@ class Application(DiscordBotApplicationABC):
self._is_stopping = True
try:
self._logger.trace(__name__, f"Try to stop {DiscordBotService.__name__}")
self._logger.info(__name__, f"Try to stop {DiscordBotService.__name__}")
await self._bot.close()
self._logger.trace(__name__, f"Stopped {DiscordBotService.__name__}")
self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}")
except Exception as e:
self._logger.error(__name__, "stop failed", e)

View File

@@ -4,7 +4,7 @@
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "dev130"
"Micro": "4"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",
@@ -18,7 +18,8 @@
"Dependencies": [
"cpl-core==2022.12.1.post3",
"cpl-translation==2022.12.1",
"cpl-query==2022.12.2.post1",
"cpl-query==2022.12.2.post2",
"cpl-discord==2022.12.2.post1",
"Flask==2.2.2",
"Flask-Classful==0.14.2",
"Flask-Cors==3.0.10",
@@ -28,8 +29,7 @@
"eventlet==0.33.3",
"requests-oauthlib==1.3.1",
"icmplib==3.0.3",
"ariadne==0.17.1",
"cpl-discord==2022.12.2"
"ariadne==0.17.1"
],
"DevDependencies": [
"cpl-cli==2022.12.1.post3",

View File

@@ -15,7 +15,7 @@ __title__ = "bot.extension"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -39,6 +39,7 @@ class Program:
)
self.app: Application = await app_builder.build_async()
await self.app.run_async()
Console.write_line(f"[ INFO ] [ {__name__} ]: Finished app.run_async")
async def stop(self):
if self.app is None:

View File

@@ -8,6 +8,7 @@ from bot_data.migration.api_key_migration import ApiKeyMigration
from bot_data.migration.api_migration import ApiMigration
from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration
from bot_data.migration.auto_role_migration import AutoRoleMigration
from bot_data.migration.db_history_migration import DBHistoryMigration
from bot_data.migration.initial_migration import InitialMigration
from bot_data.migration.level_migration import LevelMigration
from bot_data.migration.remove_stats_migration import RemoveStatsMigration
@@ -16,6 +17,7 @@ from bot_data.migration.user_joined_game_server_migration import UserJoinedGameS
from bot_data.migration.user_message_count_per_hour_migration import (
UserMessageCountPerHourMigration,
)
from bot_data.migration.user_warning_migration import UserWarningMigration
from bot_data.service.migration_service import MigrationService
@@ -38,3 +40,5 @@ class StartupMigrationExtension(StartupExtensionABC):
services.add_transient(MigrationABC, ApiKeyMigration) # 09.02.2023 #162 - 1.0.0
services.add_transient(MigrationABC, UserJoinedGameServerMigration) # 12.02.2023 #181 - 1.0.0
services.add_transient(MigrationABC, RemoveStatsMigration) # 19.02.2023 #190 - 1.0.0
services.add_transient(MigrationABC, UserWarningMigration) # 21.02.2023 #35 - 1.0.0
services.add_transient(MigrationABC, DBHistoryMigration) # 06.03.2023 #246 - 1.0.0

View File

@@ -1,51 +1,27 @@
{
"api": {
"api": {
"test_mail": {
"message": "Dies ist eine Test-Mail vom Krümelmonster Web Interface\nGesendet von {}-{}",
"subject": "Krümelmonster Web Interface Test-Mail"
}
},
"auth": {
"confirmation": {
"message": "Öffne den Link, um die E-Mail zu bestätigen:\n{}auth/register/{}",
"subject": "E-Mail für {} {} bestätigen"
},
"forgot_password": {
"message": "Öffne den Link, um das Passwort zu ändern:\n{}auth/forgot-password/{}",
"subject": "Passwort für {} {} zurücksetzen"
}
},
"mail": {
"automatic_mail": "\n\nDies ist eine automatische E-Mail.\nGesendet von {}-{}@{}"
}
},
"common": {
"hello_world": "Hallo Welt",
"bot_has_no_permission_message": "Ey!!!\nWas soll das?\nIch habe keine Berechtigungen :(\nScheiß System...",
"no_permission_message": "Nein!\nIch höre nicht auf dich ¯\\_(ツ)_/¯",
"not_implemented_yet": "Ey Alter, das kann ich noch nicht...",
"presence": {
"booting": "{} Ich fahre gerade hoch...",
"running": "{} Ich esse Kekse :D",
"restart": "{} Muss neue Kekse holen...",
"shutdown": "{} Ich werde bestimmt wieder kommen..."
},
"errors": {
"error": "Es gab einen Fehler. Meld dich bitte bei einem Admin.",
"command_error": "Es gab einen Fehler beim bearbeiten des Befehls. Meld dich bitte bei einem Admin.",
"missing_required_argument": "Fehler: Ein benötigter Parameter fehlt!",
"argument_parsing_error": "Fehler: Parameter konnte nicht gelesen werden!",
"unexpected_quote_error": "Fehler: Unerwarteter Zitat Fehler!",
"invalid_end_of_quoted_string_error": "Fehler: Ungültiges Zitatende!",
"expected_closing_quote_error": "Fehler: Erwarte Zitatende!",
"bad_argument": "Fehler: Ungültiger Parameter!",
"bad_union_argument": "Fehler: Ungültiger Union Parameter!",
"private_message_only": "Fehler: Nur private Nachrichten sind erlaubt!",
"no_private_message": "Fehler: Private Nachrichten sind nicht erlaubt!",
"check_failure": "Fehler: Du hast nicht die benötigte Berechtigung!",
"check_any_failure": "Fehler: Alle checks sind Fehlgeschlagen!",
"command_not_found": "Fehler: Befehl konnte nicht gefunden werden!",
"disabled_command": "Fehler: Befehl wurde deaktiviert!",
"command_invoke_error": "Fehler: Befehl konnte nicht aufgerufen werden!",
"too_many_arguments": "Fehler: Zu viele Parameter!",
"user_input_error": "Fehler: Eingabefehler!",
"command_on_cooldown": "Fehler: Befehl befindet sich im cooldown!",
"max_concurrency_reached": "Fehler: Maximale Parallelität erreicht!",
"not_owner": "Fehler: Du bist nicht mein besitzer!",
"missing_permissions": "Fehler: Berechtigungen fehlen!",
"bot_missing_permissions": "Fehler: Mir fehlen Berechtigungen!",
"missing_role": "Fehler: Benötigte Rolle fehlt!",
"bot_missing_role": "Fehler: Mir fehlt eine benötigte Rolle!",
"missing_any_role": "Fehler: Alle benötigten Rollen fehlen!",
"bot_missing_any_role": "Fehler: Mir fehlen alle benötigten Rollen!",
"nsfw_channel_required": "Fehler: NSFW Kanal benötigt!",
"extension_error": "Fehler: Erweiterungsfehler!",
"extension_already_loaded": "Fehler: Erweiterung wurde bereits geladen!",
"extension_not_loaded": "Fehler: Erweiterung wurde nicht geladen!",
"no_entry_point_error": "Fehler: Kein Eintrittspunkt!",
"extension_failed": "Fehler: Erweiterung ist fehlgeschlagen!",
"bot_not_ready_yet": "Ey Alter! Gedulde dich doch mal! ..."
},
"colors": {
"blue": "Blau",
"dark_blue": "Dunkelblau",
@@ -69,235 +45,296 @@
"red": "Rot",
"teal": "Blaugrün",
"yellow": "Gelb"
},
"errors": {
"argument_parsing_error": "Fehler: Parameter konnte nicht gelesen werden!",
"bad_argument": "Fehler: Ungültiger Parameter!",
"bad_union_argument": "Fehler: Ungültiger Union Parameter!",
"bot_missing_any_role": "Fehler: Mir fehlen alle benötigten Rollen!",
"bot_missing_permissions": "Fehler: Mir fehlen Berechtigungen!",
"bot_missing_role": "Fehler: Mir fehlt eine benötigte Rolle!",
"bot_not_ready_yet": "Ey Alter! Gedulde dich doch mal! ...",
"check_any_failure": "Fehler: Alle Checks sind Fehlgeschlagen!",
"check_failure": "Fehler: Du hast nicht die benötigte Berechtigung!",
"command_error": "Es gab einen Fehler beim Bearbeiten des Befehls. Melde dich bitte bei einem Admin.",
"command_invoke_error": "Fehler: Befehl konnte nicht aufgerufen werden!",
"command_not_found": "Fehler: Befehl konnte nicht gefunden werden!",
"command_on_cooldown": "Fehler: Befehl befindet sich im Cooldown!",
"disabled_command": "Fehler: Befehl wurde deaktiviert!",
"error": "Es gab einen Fehler. Melde dich bitte bei einem Admin.",
"expected_closing_quote_error": "Fehler: Erwarte Zitatende!",
"extension_already_loaded": "Fehler: Erweiterung wurde bereits geladen!",
"extension_error": "Fehler: Erweiterungsfehler!",
"extension_failed": "Fehler: Erweiterung ist fehlgeschlagen!",
"extension_not_loaded": "Fehler: Erweiterung wurde nicht geladen!",
"invalid_end_of_quoted_string_error": "Fehler: Ungültiges Zitatende!",
"max_concurrency_reached": "Fehler: Maximale Parallelität erreicht!",
"missing_any_role": "Fehler: Alle benötigten Rollen fehlen!",
"missing_permissions": "Fehler: Berechtigungen fehlen!",
"missing_required_argument": "Fehler: Ein benötigter Parameter fehlt!",
"missing_role": "Fehler: Benötigte Rolle fehlt!",
"no_entry_point_error": "Fehler: Kein Eintrittspunkt!",
"no_private_message": "Fehler: Private Nachrichten sind nicht erlaubt!",
"not_owner": "Fehler: Du bist nicht mein besitzer!",
"nsfw_channel_required": "Fehler: NSFW Kanal benötigt!",
"private_message_only": "Fehler: Nur private Nachrichten sind erlaubt!",
"too_many_arguments": "Fehler: Zu viele Parameter!",
"unexpected_quote_error": "Fehler: Unerwarteter Fehler beim Anführungszeichen!",
"user_input_error": "Fehler: Eingabefehler!"
},
"hello_world": "Hallo Welt",
"no_permission_message": "Nein!\nIch höre nicht auf dich ¯\\_(ツ)_/¯",
"not_implemented_yet": "Ey Alter, das kann ich noch nicht...",
"presence": {
"booting": "Ich fahre gerade hoch...",
"restart": "Muss neue Kekse holen...",
"running": "Ich esse Kekse :D",
"shutdown": "Ich werde bestimmt wieder kommen..."
}
},
"modules": {
"auto_role": {
"list": {
"title": "Beobachtete Nachrichten:",
"description": "Von auto-role beobachtete Nachrichten:",
"auto_role_id": "auto-role Id",
"message_id": "Nachricht-Id"
},
"add": {
"success": "auto-role für die Nachricht {} wurde hinzugefügt :D",
"error": {
"not_found": "Nachricht {} in {} nicht gefunden!",
"already_exists": "auto-role für die Nachricht {} existiert bereits!"
}
},
"remove": {
"success": "auto-role {} wurde entfernt :D",
"error": {
"not_found": "auto-role {} nicht gefunden!"
}
"already_exists": "auto-role für die Nachricht {} existiert bereits!",
"not_found": "Nachricht {} in {} nicht gefunden!"
},
"success": "auto-role für die Nachricht {} wurde hinzugefügt :D"
},
"error": {
"nothing_found": "Keine auto-role Einträge gefunden."
},
"list": {
"auto_role_id": "auto-role Id",
"description": "Von auto-role beobachtete Nachrichten:",
"message_id": "Nachricht-Id",
"title": "Beobachtete Nachrichten:"
},
"remove": {
"error": {
"not_found": "auto-role {} nicht gefunden!"
},
"success": "auto-role {} wurde entfernt :D"
},
"rule": {
"list": {
"title": "auto-role Regeln:",
"description": "Von auto-role angewendete Regeln:",
"auto_role_rule_id": "auto-role Regel Id",
"emoji": "Emoji",
"role": "Rolle"
},
"add": {
"success": "Regel {} -> {} für auto-role {} wurde hinzugefügt :D",
"error": {
"not_found": "Regel für auto-role {} nicht gefunden!",
"already_exists": "Regel für auto-role {} existiert bereits!",
"emoji_not_found": "Emoji {} für auto-role Regel {} nicht gefunden!",
"role_not_found": "Rolle {} für auto-role Regel {} nicht gefunden!",
"already_exists": "Regel für auto-role {} existiert bereits!"
}
},
"remove": {
"success": "Regel für auto-role {} wurde entfernt :D",
"error": {
"not_found": "Regel für auto-role {} nicht gefunden!"
}
"not_found": "Regel für auto-role {} nicht gefunden!",
"role_not_found": "Rolle {} für auto-role Regel {} nicht gefunden!"
},
"success": "Regel {} -> {} für auto-role {} wurde hinzugefügt :D"
},
"error": {
"id_not_found": "Kein auto-role Eintrag mit der Id gefunden!"
},
"list": {
"auto_role_rule_id": "auto-role Regel Id",
"description": "Von auto-role angewendete Regeln:",
"emoji": "Emoji",
"role": "Rolle",
"title": "auto-role Regeln:"
},
"remove": {
"error": {
"not_found": "Regel für auto-role {} nicht gefunden!"
},
"success": "Regel für auto-role {} wurde entfernt :D"
}
}
},
"moderator": {
"purge_message": "Na gut..., ich lösche alle Nachrichten wenns sein muss."
},
"base": {
"technician_error_message": "Es gab ein Fehler mit dem Event: {}\nDatum und Zeit: {}\nSchau bitte ins log für Details.\nUUID: {}",
"technician_command_error_message": "Es gab ein Fehler mit dem Befehl: {} ausgelöst von {} -> {}\nDatum und Zeit: {}\nSchau bitte ins log für Details.\nUUID: {}",
"welcome_message": "Hello There!\nIch heiße dich bei {} herzlichst Willkommen!",
"welcome_message_for_team": "{} hat gerade das Irrenhaus betreten.",
"goodbye_message": "Schade, dass du uns so schnell verlässt :(",
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
"afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
"member_joined_help_voice_channel": "{} braucht hilfe, bitte kümmer dich drum :D",
"pong": "Pong",
"game_server": {
"error": {
"nothing_found": "Keine Gameserver gefunden."
},
"list": {
"title": "Gameserver",
"description": "Konfigurierte Gameserver:",
"name": "Name",
"api_key": "API Key"
},
"add": {
"success": "Gameserver {} wurde hinzugefügt :)"
},
"remove": {
"success": "Gameserver wurde entfernt :D"
}
},
"goodbye_message": "Schade, dass du uns so schnell verlässt :(",
"info": {
"title": "Krümmelmonster",
"description": "Informationen über mich",
"fields": {
"version": "Version",
"ontime": "Ontime",
"sent_message_count": "Gesendete Nachrichten",
"received_message_count": "Empfangene Nachrichten",
"deleted_message_count": "Gelöschte Nachrichten",
"received_command_count": "Empfangene Befehle",
"modules": "Module",
"moved_users_count": "Verschobene Benutzer",
"modules": "Module"
"ontime": "Ontime",
"received_command_count": "Empfangene Befehle",
"received_message_count": "Empfangene Nachrichten",
"sent_message_count": "Gesendete Nachrichten",
"version": "Version"
},
"footer": ""
"footer": "",
"title": "Krümelmonster"
},
"mass_move": {
"moved": "Alle Personen aus {} wurden nach {} verschoben.",
"channel_from_error": "Du musst dich in einem Voicechannel befinden oder die Option \"channel_from\" mit angeben."
"channel_from_error": "Du musst dich in einem Voicechannel befinden oder die Option \"channel_from\" mit angeben.",
"moved": "Alle Personen aus {} wurden nach {} verschoben."
},
"member_joined_help_voice_channel": "{} braucht Hilfe, bitte kümmere dich drum :D",
"pong": "Pong",
"presence": {
"changed": "Presence wurde geändert.",
"removed": "Presence wurde entfernt.",
"max_char_count_exceeded": "Der Text darf nicht mehr als 128 Zeichen lang sein!"
"max_char_count_exceeded": "Der Text darf nicht mehr als 128 Zeichen lang sein!",
"removed": "Presence wurde entfernt."
},
"register": {
"not_found": "Benutzer konnte nicht gefunden werden!",
"success": "Spieler wurde mit dem Mitglied verlinkt :D"
},
"technician_command_error_message": "Es gab ein Fehler mit dem Befehl: {} ausgelöst von {} -> {}\nDatum und Zeit: {}\nSchau bitte ins Log für Details.\nUUID: {}",
"technician_error_message": "Es gab ein Fehler mit dem Event: {}\nDatum und Zeit: {}\nSchau bitte ins Log für Details.\nUUID: {}",
"unregister": {
"success": "Verlinkung wurde entfernt :D"
},
"user": {
"add": {
"xp": "Die {} von {} wurden um {} erhöht"
},
"atr": {
"id": "Id",
"name": "Name",
"discord_join": "Discord beigetreten am",
"id": "Id",
"joins": "Beitritte",
"last_join": "Server beigetreten am",
"xp": "XP",
"lefts": "Abgänge",
"name": "Name",
"ontime": "Ontime",
"roles": "Rollen",
"joins": "Beitritte",
"lefts": "Abgänge",
"warnings": "Verwarnungen"
"warnings": "Verwarnungen",
"xp": "XP"
},
"error": {
"atr_not_found": "Das Attribut {} konnte nicht gefunden werden :("
},
"get": {
"ontime": "{} war insgesamt {} Stunden aktiv in einem Sprachkanal",
"xp": "{} hat {} xp"
},
"info": {
"footer": ""
},
"get": {
"xp": "{} hat {} xp",
"ontime": "{} war insgesamt {} Stunden aktiv in einem Sprachkanal"
},
"set": {
"xp": "{} hat nun {} xp",
"error": {
"value_type_not_numeric": "Der angegebende Wert ist keine Ganzzahl! :(",
"type_error": "Der angegebene Wert ist keine Zahl! :("
}
},
"add": {
"xp": "Die {} von {} wurden um {} erhöht"
},
"remove": {
"xp": "Die {} von {} wurden um {} verringert"
},
"reset": {
"xp": "Die {} von {} wurden entfernt",
"ontime": "Die {} von {} wurden entfernt"
"ontime": "Die {} von {} wurden entfernt",
"xp": "Die {} von {} wurden entfernt"
},
"error": {
"atr_not_found": "Das Attribut {} konnte nicht gefunden werden :("
"set": {
"error": {
"type_error": "Der angegebene Wert ist keine Zahl! :(",
"value_type_not_numeric": "Der angegebende Wert ist keine Ganzzahl! :("
},
"xp": "{} hat nun {} xp"
}
},
"register": {
"success": "Spieler wurde mit dem Mitglied verlinkt :D",
"not_found": "Benutzer nicht gefunden!"
"warnings": {
"add": {
"failed": "Verwarnung konnte nicht hinzugefügt werden :(",
"success": "Verwarnung wurde hinzugefügt :)"
},
"first": "Bei der nächsten Verwarnung wirst du auf das vorherige Level zurückgesetzt!",
"kick": "Ich musste {} aufgrund zu vieler Verwarnungen kicken",
"remove": {
"failed": "Verwarnung konnte nicht entfernt werden :(",
"success": "Verwarnung wurde entfernt :)"
},
"removed": "Die Verwarnung '{}' wurde entfernt.",
"second": "Bei der nächsten verwarnung wirst du auf das erste Level zurückgesetzt!",
"show": {
"description": "Beschreibung",
"id": "Id"
},
"team_removed": "Die Verwarnung '{}' an {} wurde entfernt.",
"team_warned": "{} wurde verwarnt. Der Grund ist: {}",
"third": "Bei der nächsten verwarnung wirst du gekickt und zurückgesetzt!",
"warned": "Du wurdest verwarnt. Der Grund ist: {}"
},
"unregister": {
"success": "Verlinkung wurde entfernt :D"
}
"welcome_message": "Hello There!\nIch heiße dich bei {} herzlichst Willkommen!",
"welcome_message_for_team": "{} hat gerade das Irrenhaus betreten."
},
"boot_log": {
"login_message": "Ich bin on the line :D\nDer Scheiß hat {} Sekunden gedauert"
},
"level": {
"new_level_message": "{} ist nun Level {}",
"seeding_started": "Levelsystem wird neu geladen...",
"seeding_failed": "Levelsystem konnte nicht neu geladen werden :(",
"seeding_finished": "Levelsystem wurde Erfolgreich neu geladen :)",
"error": {
"nothing_found": "Keine Level Einträge gefunden.",
"level_with_name_already_exists": "Ein Level mit dem Namen {} existiert bereits!",
"level_with_xp_already_exists": "Das Level {} hat bereits die Mindest-XP {}!"
},
"list": {
"title": "Level:",
"description": "Konfigurierte Level:",
"name": "Name",
"min_xp": "Mindest-XP",
"permission_int": "Berechtigungen"
},
"create": {
"created": "Level {} mit Berechtigungen {} wurde erstellt :D"
},
"edit": {
"edited": "Level {} wurde bearbeitet :D",
"color_invalid": "Die Farbe {} ist ungültig!",
"permission_invalid": "Der Berechtigungswert {} ist ungültig!",
"not_found": "Level {} nicht gefunden!"
},
"remove": {
"success": "Level {} wurde entfernt :D",
"error": {
"not_found": "Level {} nicht gefunden!"
}
},
"down": {
"already_first": "{} hat bereits das erste Level.",
"success": "{} wurde auf Level {} runtergesetzt :)",
"failed": "{} konnte nicht runtergesetzt werden :("
"failed": "{} konnte nicht runtergesetzt werden :(",
"success": "{} wurde auf Level {} runtergesetzt :)"
},
"edit": {
"color_invalid": "Die Farbe {} ist ungültig!",
"edited": "Level {} wurde bearbeitet :D",
"not_found": "Level {} nicht gefunden!",
"permission_invalid": "Der Berechtigungswert {} ist ungültig!"
},
"error": {
"level_with_name_already_exists": "Ein Level mit dem Namen {} existiert bereits!",
"level_with_xp_already_exists": "Das Level {} hat bereits die Mindest-XP {}!",
"nothing_found": "Keine Einträge gefunden."
},
"list": {
"description": "Konfigurierte Level:",
"min_xp": "Mindest-XP",
"name": "Name",
"permission_int": "Berechtigungen",
"title": "Level:"
},
"new_level_message": "{} ist nun Level {}",
"remove": {
"error": {
"not_found": "Level {} nicht gefunden!"
},
"success": "Level {} wurde entfernt :D"
},
"seeding_failed": "Levelsystem konnte nicht neu geladen werden :(",
"seeding_finished": "Levelsystem wurde erfolgreich neu geladen :)",
"seeding_started": "Levelsystem wird neu geladen...",
"set": {
"already_level": "{} hat bereits das Level {} :/",
"failed": "Das Level von {} konnte nicht auf {} gesetzt werden :(",
"not_found": "Das Level {} konnte nicht gefunden werden :(",
"success": "{} ist nun Level {} :)"
},
"up": {
"already_last": "{} hat bereits das höchste Level.",
"success": "{} wurde auf Level {} hochgesetzt :)",
"failed": "{} konnte nicht hochgesetzt werden :("
},
"set": {
"already_level": "{} hat bereits das Level {} :/",
"success": "{} ist nun Level {} :)",
"failed": "Das Level von {} konnte nicht auf {} gesetzt werden :(",
"not_found": "Das Level {} konnte nicht gefunden werden :("
"failed": "{} konnte nicht hochgesetzt werden :(",
"success": "{} wurde auf Level {} hochgesetzt :)"
}
},
"database": {},
"permission": {},
"moderator": {
"purge_message": "Na gut..., ich lösche alle Nachrichten wenns sein muss."
},
"technician": {
"restart_message": "Bin gleich wieder da :D",
"shutdown_message": "Trauert nicht um mich, es war eine logische Entscheidung. Das Wohl von Vielen, es wiegt schwerer als das Wohl von Wenigen oder eines Einzelnen. Ich war es und ich werde es immer sein, Euer Freund. Lebt lange und in Frieden :)",
"log_message": "Hier sind deine Logdateien! :)",
"api_key": {
"get": "API-Schlüssel für {}: {}",
"add": {
"success": "API-Schlüssel für {} wurde erstellt: {}"
},
"get": "API-Schlüssel für {}: {}",
"remove": {
"not_found": "API-Schlüssel konnte nicht gefunden werden!",
"success": "API-Schlüssel wurde entfernt :D"
}
}
}
},
"api": {
"mail": {
"automatic_mail": "\n\nDies ist eine automatische E-Mail.\nGesendet von {}-{}@{}"
},
"api": {
"test_mail": {
"subject": "Krümmelmonster Web Interface Test-Mail",
"message": "Dies ist eine Test-Mail vom Krümmelmonster Web Interface\nGesendet von {}-{}"
}
},
"auth": {
"confirmation": {
"subject": "E-Mail für {} {} bestätigen",
"message": "Öffne den Link um die E-Mail zu bestätigen:\n{}auth/register/{}"
},
"forgot_password": {
"subject": "Passwort für {} {} zurücksetzen",
"message": "Öffne den Link um das Passwort zu ändern:\n{}auth/forgot-password/{}"
}
"log_message": "Hier sind deine Logdateien! :)",
"restart_message": "Bin gleich wieder da :D",
"shutdown_message": "Trauert nicht um mich, es war eine logische Entscheidung. Das Wohl von Vielen, es wiegt schwerer als das Wohl von Wenigen oder eines Einzelnen. Ich war es und ich werde es immer sein, euer Freund. Lebt lange und in Frieden :)"
}
}
}

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -4,7 +4,7 @@
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "dev130"
"Micro": "4"
},
"Author": "",
"AuthorEmail": "",

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.configuration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.controller"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -71,7 +71,7 @@ class AuthController:
@Route.post(f"{BasePath}/register")
async def register(self):
dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True))
await self._auth_service.add_auth_user(dto)
self._auth_service.add_auth_user(dto)
return "", 200
@Route.post(f"{BasePath}/register-by-id/<id>")
@@ -129,7 +129,6 @@ class AuthController:
return "", 200
@Route.post(f"{BasePath}/refresh")
@Route.authorize
async def refresh(self) -> Response:
dto: TokenDTO = JSONProcessor.process(TokenDTO, request.get_json(force=True, silent=True))
result = await self._auth_service.refresh_async(dto)

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.event"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.exception"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.filter"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.filter.discord"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.logging"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.model"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.model.discord"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -10,7 +10,6 @@ class UserDTO(DtoABC):
id: int = None,
dc_id: int = None,
xp: int = None,
minecraft_id: Optional[str] = None,
server: Optional[Server] = None,
is_technician: Optional[bool] = None,
is_admin: Optional[bool] = None,
@@ -21,7 +20,6 @@ class UserDTO(DtoABC):
self._user_id = id
self._discord_id = dc_id
self._xp = xp
self._minecraft_id = minecraft_id
self._server = server
self._is_technician = is_technician
@@ -44,14 +42,6 @@ class UserDTO(DtoABC):
def xp(self, value: int):
self._xp = value
@property
def minecraft_id(self) -> Optional[str]:
return self._minecraft_id
@minecraft_id.setter
def minecraft_id(self, value: str):
self._minecraft_id = value
@property
def server(self) -> Optional[Server]:
return self._server
@@ -72,7 +62,6 @@ class UserDTO(DtoABC):
self._user_id = values["id"]
self._discord_id = values["dcId"]
self._xp = values["xp"]
self._minecraft_id = values["minecraftId"]
self._server = values["server"]
def to_dict(self) -> dict:
@@ -80,7 +69,6 @@ class UserDTO(DtoABC):
"id": self._user_id,
"dcId": self._discord_id,
"xp": self._xp,
"minecraftId": self._minecraft_id,
"server": self._server.id,
"isTechnician": self.is_technician,
"isAdmin": self.is_admin,

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.route"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.service"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -80,6 +80,9 @@ class AuthService(AuthServiceABC):
@staticmethod
def _is_email_valid(email: str) -> bool:
if email is None:
raise False
if re.fullmatch(_email_regex, email) is not None:
return True
@@ -480,18 +483,19 @@ class AuthService(AuthServiceABC):
if user_dto is None:
raise ServiceException(ServiceErrorCode.InvalidData, "User not set")
members = self._users.get_users_by_discord_id(dc_id)
if members.count() == 0:
raise ServiceException(ServiceErrorCode.InvalidUser, f"Member not found")
added_user = False
db_user = self._auth_users.find_auth_user_by_email(user_dto.email)
if db_user is None:
self.add_auth_user(user_dto)
added_user = True
# raise ServiceException(ServiceErrorCode.InvalidUser, f'User not found')
db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
if db_user.users.count() == 0:
self._users.get_users_by_discord_id(dc_id).for_each(
lambda x: self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, x))
)
members.for_each(lambda x: self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, x)))
if db_user.confirmation_id is not None and not added_user:
raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.transformer"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -69,7 +69,6 @@ class AuthUserTransformer(TransformerABC):
u.id,
u.discord_id,
u.xp,
u.minecraft_id,
u.server,
cls._is_technician(u),
cls._is_admin(u),

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -2,9 +2,11 @@ from abc import ABC, abstractmethod
from datetime import datetime
from typing import Callable
import discord
from cpl_query.extension import List
from discord.ext.commands import Context
from bot_data.model.auto_role_rule import AutoRoleRule
from bot_data.model.user import User
from modules.base.configuration.base_server_settings import BaseServerSettings
@@ -59,3 +61,9 @@ class ClientUtilsABC(ABC):
@abstractmethod
def get_ontime_for_user(self, user: User) -> float:
pass
@abstractmethod
async def react_to_message_by_auto_role_rule(
self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild
):
pass

View File

@@ -25,7 +25,9 @@ class MessageServiceABC(ABC):
self,
channel: discord.TextChannel,
message: Union[str, discord.Embed],
without_tracking=True,
is_persistent: bool = False,
wait_before_delete: int = None,
without_tracking=False,
):
pass

View File

@@ -4,7 +4,7 @@
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "dev130"
"Micro": "4"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.configuration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -10,11 +10,12 @@ class FeatureFlagsEnum(Enum):
boot_log_module = "BootLogModule"
core_module = "CoreModule"
core_extension_module = "CoreExtensionModule"
data_module = ("DataModule",)
database_module = ("DatabaseModule",)
data_module = "DataModule"
database_module = "DatabaseModule"
level_module = "LevelModule"
moderator_module = "ModeratorModule"
permission_module = "PermissionModule"
# features
api_only = "ApiOnly"
presence = "Presence"
version_in_presence = "VersionInPresence"

View File

@@ -1,5 +1,4 @@
import traceback
from typing import Optional, Callable
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
@@ -27,6 +26,7 @@ class FeatureFlagsSettings(ConfigurationModelABC):
# features
FeatureFlagsEnum.api_only.value: False, # 13.10.2022 #70
FeatureFlagsEnum.presence.value: True, # 03.10.2022 #56
FeatureFlagsEnum.version_in_presence.value: False, # 21.03.2023 #253
}
def get_flag(self, key: FeatureFlagsEnum) -> bool:

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.core_extension"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.events"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.exception"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.helper"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.logging"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.pipes"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.service"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -9,6 +9,7 @@ from cpl_core.time import TimeFormatSettings
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from cpl_translation import TranslatePipe
from discord import Guild
from discord.ext.commands import Context
from bot_core.abc.client_utils_abc import ClientUtilsABC
@@ -23,6 +24,7 @@ from bot_data.abc.user_joined_voice_channel_repository_abc import (
from bot_data.abc.user_message_count_per_hour_repository_abc import (
UserMessageCountPerHourRepositoryABC,
)
from bot_data.model.auto_role_rule import AutoRoleRule
from bot_data.model.user import User
from bot_data.model.user_message_count_per_hour import UserMessageCountPerHour
from modules.base.configuration.base_server_settings import BaseServerSettings
@@ -111,7 +113,11 @@ class ClientUtilsService(ClientUtilsABC):
import bot
name = self._t.transform(t_key).format(bot.__version__)
if self._feature_flags.get_flag(FeatureFlagsEnum.version_in_presence):
name = f"{bot.__version__} {self._t.transform(t_key)}"
else:
name = self._t.transform(t_key)
await self._bot.change_presence(activity=discord.Game(name=name))
self._logger.info(__name__, f"Set presence {name}")
@@ -188,3 +194,27 @@ class ClientUtilsService(ClientUtilsABC):
.sum(lambda join: (join.leaved_on - join.joined_on).total_seconds() / 3600),
2,
)
async def react_to_message_by_auto_role_rule(
self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild
):
try:
guild: Guild = self._bot.guilds.where(lambda g: g == guild).single()
channel = guild.get_channel(discord_channel_id)
message = await channel.fetch_message(discord_message_id)
emoji = List(discord.Emoji, guild.emojis).where(lambda x: x.name == rule.emoji_name).single()
if emoji is None:
self._logger.debug(__name__, f"Emoji {rule.emoji_name} not found")
return
await message.add_reaction(emoji)
self._logger.debug(
__name__,
f"Added reaction {rule.emoji_name} to message: {discord_message_id}",
)
except Exception as e:
self._logger.error(
__name__,
f"Cannot add reaction {rule.emoji_name} to message: {discord_message_id}",
e,
)

View File

@@ -15,7 +15,7 @@ __title__ = "bot_data"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_data.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -18,6 +18,10 @@ class ApiKeyRepositoryABC(ABC):
def get_api_key(self, identifier: str, key: str) -> ApiKey:
pass
@abstractmethod
def get_api_key_by_id(self, id: int) -> ApiKey:
pass
@abstractmethod
def get_api_key_by_key(self, key: str) -> ApiKey:
pass

View File

@@ -0,0 +1,39 @@
from abc import ABC, abstractmethod
from cpl_query.extension import List
from bot_data.model.game_server import GameServer
class GameServerRepositoryABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def get_game_servers(self) -> List[GameServer]:
pass
@abstractmethod
def get_game_server_by_id(self, id: int) -> GameServer:
pass
@abstractmethod
def get_game_servers_by_server_id(self, id: int) -> List[GameServer]:
pass
@abstractmethod
def get_game_server_by_api_key_id(self, id: int) -> GameServer:
pass
@abstractmethod
def add_game_server(self, game_server: GameServer):
pass
@abstractmethod
def update_game_server(self, game_server: GameServer):
pass
@abstractmethod
def delete_game_server(self, game_server: GameServer):
pass

View File

@@ -0,0 +1,27 @@
from abc import ABC, abstractmethod
from datetime import datetime
class HistoryTableABC(ABC):
@abstractmethod
def __init__(self):
self._id = 0
self._deleted = False
self._date_from = datetime.now().isoformat()
self._date_to = datetime.now().isoformat()
@property
def id(self) -> int:
return self._id
@property
def deleted(self) -> bool:
return self._deleted
@property
def date_from(self) -> str:
return self._date_from
@property
def date_to(self) -> str:
return self._date_to

View File

@@ -3,6 +3,7 @@ from abc import ABC, abstractmethod
class MigrationABC(ABC):
name = None
prio = 0
@abstractmethod
def __init__(self):

View File

@@ -0,0 +1,15 @@
from abc import abstractmethod
from cpl_core.database import TableABC
class TableWithIdABC(TableABC):
@abstractmethod
def __init__(self):
self.__init__()
self._id = 0
@property
def id(self) -> int:
return self._id

View File

@@ -0,0 +1,47 @@
from abc import ABC, abstractmethod
from cpl_query.extension import List
from bot_data.model.user_game_ident import UserGameIdent
class UserGameIdentRepositoryABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def get_user_game_idents(self) -> List[UserGameIdent]:
pass
@abstractmethod
def get_user_game_ident_by_id(self, id: int) -> UserGameIdent:
pass
@abstractmethod
def get_user_game_ident_by_ident(self, ident: str) -> UserGameIdent:
pass
@abstractmethod
def find_user_game_ident_by_ident(self, ident: str) -> UserGameIdent:
pass
@abstractmethod
def get_user_game_idents_by_user_id(self, user_id: int) -> List[UserGameIdent]:
pass
@abstractmethod
def add_user_game_ident(self, user_game_ident: UserGameIdent):
pass
@abstractmethod
def update_user_game_ident(self, user_game_ident: UserGameIdent):
pass
@abstractmethod
def delete_user_game_ident(self, user_game_ident: UserGameIdent):
pass
@abstractmethod
def delete_user_game_ident_by_user_id(self, user_id: int):
pass

View File

@@ -0,0 +1,35 @@
from abc import ABC, abstractmethod
from cpl_query.extension import List
from bot_data.model.user_warnings import UserWarnings
class UserWarningsRepositoryABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def get_user_warnings(self) -> List[UserWarnings]:
pass
@abstractmethod
def get_user_warnings_by_id(self, id: int) -> UserWarnings:
pass
@abstractmethod
def get_user_warnings_by_user_id(self, user_id: int) -> List[UserWarnings]:
pass
@abstractmethod
def add_user_warnings(self, user_warnings: UserWarnings):
pass
@abstractmethod
def update_user_warnings(self, user_warnings: UserWarnings):
pass
@abstractmethod
def delete_user_warnings(self, user_warnings: UserWarnings):
pass

View File

@@ -4,7 +4,7 @@
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "dev130"
"Micro": "4"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -9,9 +9,11 @@ from bot_data.abc.api_key_repository_abc import ApiKeyRepositoryABC
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.abc.client_repository_abc import ClientRepositoryABC
from bot_data.abc.game_server_repository_abc import GameServerRepositoryABC
from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
from bot_data.abc.level_repository_abc import LevelRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC
from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
from bot_data.abc.user_joined_voice_channel_repository_abc import (
@@ -21,14 +23,18 @@ from bot_data.abc.user_message_count_per_hour_repository_abc import (
UserMessageCountPerHourRepositoryABC,
)
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.abc.user_warnings_repository_abc import UserWarningsRepositoryABC
from bot_data.service.api_key_repository_service import ApiKeyRepositoryService
from bot_data.service.auth_user_repository_service import AuthUserRepositoryService
from bot_data.service.auto_role_repository_service import AutoRoleRepositoryService
from bot_data.service.cache_service import CacheService
from bot_data.service.client_repository_service import ClientRepositoryService
from bot_data.service.game_server_repository_service import GameServerRepositoryService
from bot_data.service.known_user_repository_service import KnownUserRepositoryService
from bot_data.service.level_repository_service import LevelRepositoryService
from bot_data.service.seeder_service import SeederService
from bot_data.service.server_repository_service import ServerRepositoryService
from bot_data.service.user_game_ident_repository_service import UserGameIdentRepositoryService
from bot_data.service.user_joined_game_server_repository_service import UserJoinedGameServerRepositoryService
from bot_data.service.user_joined_server_repository_service import (
UserJoinedServerRepositoryService,
@@ -40,6 +46,7 @@ from bot_data.service.user_message_count_per_hour_repository_service import (
UserMessageCountPerHourRepositoryService,
)
from bot_data.service.user_repository_service import UserRepositoryService
from bot_data.service.user_warnings_repository_service import UserWarningsRepositoryService
class DataModule(ModuleABC):
@@ -50,6 +57,8 @@ class DataModule(ModuleABC):
pass
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_singleton(CacheService)
services.add_transient(ApiKeyRepositoryABC, ApiKeyRepositoryService)
services.add_transient(AuthUserRepositoryABC, AuthUserRepositoryService)
services.add_transient(ServerRepositoryABC, ServerRepositoryService)
@@ -61,9 +70,12 @@ class DataModule(ModuleABC):
services.add_transient(UserJoinedGameServerRepositoryABC, UserJoinedGameServerRepositoryService)
services.add_transient(AutoRoleRepositoryABC, AutoRoleRepositoryService)
services.add_transient(LevelRepositoryABC, LevelRepositoryService)
services.add_transient(UserWarningsRepositoryABC, UserWarningsRepositoryService)
services.add_transient(
UserMessageCountPerHourRepositoryABC,
UserMessageCountPerHourRepositoryService,
)
services.add_transient(GameServerRepositoryABC, GameServerRepositoryService)
services.add_transient(UserGameIdentRepositoryABC, UserGameIdentRepositoryService)
services.add_transient(SeederService)

View File

@@ -1,3 +1,5 @@
import time
from cpl_core.database import DatabaseSettings
from cpl_core.database.context import DatabaseContext
@@ -31,4 +33,9 @@ class DBContext(DatabaseContext):
return super(DBContext, self).select(statement)
except Exception as e:
self._logger.error(__name__, f"Database error caused by {statement}", e)
try:
time.sleep(0.5)
return self.select(statement)
except Exception as e:
pass
return []

View File

@@ -15,7 +15,7 @@ __title__ = "bot_data.migration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -4,7 +4,7 @@ from bot_data.db_context import DBContext
class ApiKeyMigration(MigrationABC):
name = "1.0_ApiKeyMigration"
name = "1.0.0_ApiKeyMigration"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)

View File

@@ -0,0 +1,65 @@
import os
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class DBHistoryMigration(MigrationABC):
name = "1.0.0_DBHistoryMigration"
prio = 1
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)
self._logger = logger
self._db = db
self._cursor = db.cursor
def _exec(self, file: str):
path = f"{os.path.dirname(os.path.realpath(__file__))}/db_history_scripts"
sql = open(f"{path}/{file}").read()
for statement in sql.split("\n\n"):
self._cursor.execute(statement + ";")
def upgrade(self):
self._logger.debug(__name__, "Running upgrade")
self._exec("api_keys.sql")
self._exec("auth_users.sql")
self._exec("auth_user_users_relation.sql")
self._exec("auto_role_rules.sql")
self._exec("auto_roles.sql")
self._exec("clients.sql")
self._exec("game_servers.sql")
self._exec("known_users.sql")
self._exec("levels.sql")
self._exec("servers.sql")
self._exec("user_game_idents.sql")
self._exec("user_joined_game_servers.sql")
self._exec("user_joined_servers.sql")
self._exec("user_joined_voice_channel.sql")
self._exec("user_message_count_per_hour.sql")
self._exec("users.sql")
self._exec("user_warnings.sql")
self._logger.debug(__name__, "Finished history upgrade")
def downgrade(self):
self._cursor.execute("DROP TABLE `ApiKeysHistory`;")
self._cursor.execute("DROP TABLE `AuthUsersHistory`;")
self._cursor.execute("DROP TABLE `AuthUserUsersRelationsHistory`;")
self._cursor.execute("DROP TABLE `AutoRoleRulesHistory`;")
self._cursor.execute("DROP TABLE `AutoRolesHistory`;")
self._cursor.execute("DROP TABLE `ClientsHistory`;")
self._cursor.execute("DROP TABLE `GameServersHistory`;")
self._cursor.execute("DROP TABLE `KnownUsersHistory`;")
self._cursor.execute("DROP TABLE `LevelsHistory`;")
self._cursor.execute("DROP TABLE `ServersHistory`;")
self._cursor.execute("DROP TABLE `UserGameIdentsHistory`;")
self._cursor.execute("DROP TABLE `UserJoinedGameServerHistory`;")
self._cursor.execute("DROP TABLE `UserJoinedServersHistory`;")
self._cursor.execute("DROP TABLE `UserJoinedVoiceChannelHistory`;")
self._cursor.execute("DROP TABLE `UserMessageCountPerHourHistory`;")
self._cursor.execute("DROP TABLE `UsersHistory`;")
self._cursor.execute("DROP TABLE `UserWarningsHistory`;")

View File

@@ -0,0 +1,46 @@
ALTER TABLE `ApiKeys`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `ApiKeys`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `ApiKeysHistory`
(
`Id` BIGINT(20) NOT NULL,
`Identifier` VARCHAR(255) NOT NULL,
`Key` VARCHAR(255) NOT NULL,
`CreatorId` BIGINT(20) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_ApiKeysUpdate`;
CREATE TRIGGER `TR_ApiKeysUpdate`
AFTER UPDATE
ON `ApiKeys`
FOR EACH ROW
BEGIN
INSERT INTO `ApiKeysHistory` (
`Id`, `Identifier`, `Key`, `CreatorId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Identifier, OLD.Key, OLD.CreatorId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_ApiKeysDelete`;
CREATE TRIGGER `TR_ApiKeysDelete`
AFTER DELETE
ON `ApiKeys`
FOR EACH ROW
BEGIN
INSERT INTO `ApiKeysHistory` (
`Id`, `Identifier`, `Key`, `CreatorId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Identifier, OLD.Key, OLD.CreatorId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,46 @@
ALTER TABLE `AuthUserUsersRelations`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `AuthUserUsersRelations`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `AuthUserUsersRelationsHistory`
(
`Id` BIGINT(20) NOT NULL,
`AuthUserId` BIGINT(20) DEFAULT NULL,
`UserId` BIGINT(20) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_AuthUserUsersRelationsUpdate`;
CREATE TRIGGER `TR_AuthUserUsersRelationsUpdate`
AFTER UPDATE
ON `AuthUserUsersRelations`
FOR EACH ROW
BEGIN
INSERT INTO `AuthUserUsersRelationsHistory` (
`Id`, `AuthUserId`, `UserId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.AuthUserId, OLD.UserId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_AuthUserUsersRelationsDelete`;
CREATE TRIGGER `TR_AuthUserUsersRelationsDelete`
AFTER DELETE
ON `AuthUserUsersRelations`
FOR EACH ROW
BEGIN
INSERT INTO `AuthUserUsersRelationsHistory` (
`Id`, `AuthUserId`, `UserId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.AuthUserId, OLD.UserId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,62 @@
ALTER TABLE `AuthUsers`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `AuthUsers`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `AuthUsersHistory`
(
`Id` BIGINT(20) NOT NULL,
`FirstName` VARCHAR(255) DEFAULT NULL,
`LastName` VARCHAR(255) DEFAULT NULL,
`EMail` VARCHAR(255) DEFAULT NULL,
`Password` VARCHAR(255) DEFAULT NULL,
`PasswordSalt` VARCHAR(255) DEFAULT NULL,
`RefreshToken` VARCHAR(255) DEFAULT NULL,
`ConfirmationId` VARCHAR(255) DEFAULT NULL,
`ForgotPasswordId` VARCHAR(255) DEFAULT NULL,
`OAuthId` VARCHAR(255) DEFAULT NULL,
`RefreshTokenExpiryTime` DATETIME(6) NOT NULL,
`AuthRole` BIGINT(11) NOT NULL DEFAULT 0,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_AuthUsersUpdate`;
CREATE TRIGGER `TR_AuthUsersUpdate`
AFTER UPDATE
ON `AuthUsers`
FOR EACH ROW
BEGIN
INSERT INTO `AuthUsersHistory` (
`Id`, `FirstName`, `LastName`, `EMail`, `Password`, `PasswordSalt`,
`RefreshToken`, `ConfirmationId`, `ForgotPasswordId`, `OAuthId`,
`RefreshTokenExpiryTime`, `AuthRole`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.FirstName, OLD.LastName, OLD.EMail, OLD.Password, OLD.PasswordSalt, OLD.RefreshToken,
OLD.ConfirmationId, OLD.ForgotPasswordId, OLD.OAuthId, OLD.RefreshTokenExpiryTime, OLD.AuthRole,
OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_AuthUsersDelete`;
CREATE TRIGGER `TR_AuthUsersDelete`
AFTER DELETE
ON `AuthUsers`
FOR EACH ROW
BEGIN
INSERT INTO `AuthUsersHistory` (
`Id`, `FirstName`, `LastName`, `EMail`, `Password`, `PasswordSalt`, `RefreshToken`,
`ConfirmationId`, `ForgotPasswordId`, `OAuthId`, `RefreshTokenExpiryTime`,
`AuthRole`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.FirstName, OLD.LastName, OLD.EMail, OLD.Password, OLD.PasswordSalt, OLD.RefreshToken,
OLD.ConfirmationId, OLD.ForgotPasswordId, OLD.OAuthId, OLD.RefreshTokenExpiryTime, OLD.AuthRole, TRUE,
OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,46 @@
ALTER TABLE `AutoRoleRules`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `AutoRoleRules`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `AutoRoleRulesHistory`
(
`Id` BIGINT(20) NOT NULL,
`AutoRoleId` BIGINT(20) DEFAULT NULL,
`DiscordEmojiName` VARCHAR(64) DEFAULT NULL,
`DiscordRoleId` BIGINT(20) NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_AutoRoleRulesUpdate`;
CREATE TRIGGER `TR_AutoRoleRulesUpdate`
AFTER UPDATE
ON `AutoRoleRules`
FOR EACH ROW
BEGIN
INSERT INTO `AutoRoleRulesHistory` (
`Id`, `AutoRoleId`, `DiscordEmojiName`, `DiscordRoleId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.AutoRoleRuleId, OLD.AutoRoleId, OLD.DiscordEmojiName, OLD.DiscordRoleId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_AutoRoleRulesDelete`;
CREATE TRIGGER `TR_AutoRoleRulesDelete`
AFTER DELETE
ON `AutoRoleRules`
FOR EACH ROW
BEGIN
INSERT INTO `AutoRoleRulesHistory` (
`Id`, `AutoRoleId`, `DiscordEmojiName`, `DiscordRoleId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.AutoRoleRuleId, OLD.AutoRoleId, OLD.DiscordEmojiName, OLD.DiscordRoleId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,48 @@
ALTER TABLE `AutoRoles`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `AutoRoles`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `AutoRolesHistory`
(
`Id` BIGINT(20) NOT NULL,
`ServerId` BIGINT(20) DEFAULT NULL,
`DiscordChannelId` BIGINT(20) NOT NULL,
`DiscordMessageId` BIGINT(20) NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_AutoRolesUpdate`;
CREATE TRIGGER `TR_AutoRolesUpdate`
AFTER UPDATE
ON `AutoRoles`
FOR EACH ROW
BEGIN
INSERT INTO `AutoRolesHistory` (
`Id`, `ServerId`, `DiscordChannelId`, `DiscordMessageId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.AutoRoleId, OLD.ServerId, OLD.DiscordChannelId, OLD.DiscordMessageId, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_AutoRolesDelete`;
CREATE TRIGGER `TR_AutoRolesDelete`
AFTER DELETE
ON `AutoRoles`
FOR EACH ROW
BEGIN
INSERT INTO `AutoRolesHistory` (
`Id`, `ServerId`, `DiscordChannelId`, `DiscordMessageId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.AutoRoleId, OLD.ServerId, OLD.DiscordChannelId, OLD.DiscordMessageId, TRUE, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,54 @@
ALTER TABLE `Clients`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `Clients`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `ClientsHistory`
(
`Id` BIGINT(20) NOT NULL,
`DiscordId` BIGINT(20) NOT NULL,
`SentMessageCount` BIGINT(20) NOT NULL DEFAULT 0,
`ReceivedMessageCount` BIGINT(20) NOT NULL DEFAULT 0,
`DeletedMessageCount` BIGINT(20) NOT NULL DEFAULT 0,
`ReceivedCommandsCount` BIGINT(20) NOT NULL DEFAULT 0,
`MovedUsersCount` BIGINT(20) NOT NULL DEFAULT 0,
`ServerId` BIGINT(20) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_ClientsUpdate`;
CREATE TRIGGER `TR_ClientsUpdate`
AFTER UPDATE
ON `Clients`
FOR EACH ROW
BEGIN
INSERT INTO `ClientsHistory` (
`Id`, `DiscordId`, `SentMessageCount`, `ReceivedMessageCount`, `DeletedMessageCount`,
`ReceivedCommandsCount`, `MovedUsersCount`, `ServerId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.ClientId, OLD.DiscordClientId, OLD.SentMessageCount, OLD.ReceivedMessageCount, OLD.DeletedMessageCount,
OLD.ReceivedCommandsCount, OLD.MovedUsersCount, OLD.ServerId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_ClientsDelete`;
CREATE TRIGGER `TR_ClientsDelete`
AFTER DELETE
ON `Clients`
FOR EACH ROW
BEGIN
INSERT INTO `ClientsHistory` (
`Id`, `DiscordId`, `SentMessageCount`, `ReceivedMessageCount`, `DeletedMessageCount`,
`ReceivedCommandsCount`, `MovedUsersCount`, `ServerId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.ClientId, OLD.DiscordClientId, OLD.SentMessageCount, OLD.ReceivedMessageCount, OLD.DeletedMessageCount,
OLD.ReceivedCommandsCount, OLD.MovedUsersCount, OLD.ServerId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,46 @@
ALTER TABLE `GameServers`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `GameServers`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `GameServersHistory`
(
`Id` BIGINT(20) NOT NULL,
`Name` VARCHAR(255) NOT NULL,
`ServerId` BIGINT(20) NOT NULL,
`ApiKeyId` BIGINT(20) NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_GameServersUpdate`;
CREATE TRIGGER `TR_GameServersUpdate`
AFTER UPDATE
ON `GameServers`
FOR EACH ROW
BEGIN
INSERT INTO `GameServersHistory` (
`Id`, `Name`, `ServerId`, `ApiKeyId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Name, OLD.ServerId, OLD.ApiKeyId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_GameServersDelete`;
CREATE TRIGGER `TR_GameServersDelete`
AFTER DELETE
ON `GameServers`
FOR EACH ROW
BEGIN
INSERT INTO `GameServersHistory` (
`Id`, `Name`, `ServerId`, `ApiKeyId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Name, OLD.ServerId, OLD.ApiKeyId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,44 @@
ALTER TABLE `KnownUsers`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `KnownUsers`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `KnownUsersHistory`
(
`Id` BIGINT(20) NOT NULL,
`DiscordId` BIGINT(20) NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_KnownUsersUpdate`;
CREATE TRIGGER `TR_KnownUsersUpdate`
AFTER UPDATE
ON `KnownUsers`
FOR EACH ROW
BEGIN
INSERT INTO `KnownUsersHistory` (
`Id`, `DiscordId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.KnownUserId, OLD.DiscordId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_KnownUsersDelete`;
CREATE TRIGGER `TR_KnownUsersDelete`
AFTER DELETE
ON `KnownUsers`
FOR EACH ROW
BEGIN
INSERT INTO `KnownUsersHistory` (
`Id`, `DiscordId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.KnownUserId, OLD.DiscordId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,50 @@
ALTER TABLE `Levels`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `Levels`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `LevelsHistory`
(
`Id` BIGINT(20) NOT NULL,
`Name` VARCHAR(255) NOT NULL,
`Color` VARCHAR(8) NOT NULL,
`MinXp` BIGINT(20) NOT NULL,
`PermissionInt` BIGINT(20) NOT NULL,
`ServerId` BIGINT(20) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_LevelsUpdate`;
CREATE TRIGGER `TR_LevelsUpdate`
AFTER UPDATE
ON `Levels`
FOR EACH ROW
BEGIN
INSERT INTO `LevelsHistory` (
`Id`, `Name`, `Color`, `MinXp`, `PermissionInt`, `ServerId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Name, OLD.Color, OLD.MinXp, OLD.PermissionInt, OLD.ServerId, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_LevelsDelete`;
CREATE TRIGGER `TR_LevelsDelete`
AFTER DELETE
ON `Levels`
FOR EACH ROW
BEGIN
INSERT INTO `LevelsHistory` (
`Id`, `Name`, `Color`, `MinXp`, `PermissionInt`, `ServerId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Name, OLD.Color, OLD.MinXp, OLD.PermissionInt, OLD.ServerId, TRUE, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,44 @@
ALTER TABLE `Servers`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `Servers`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `ServersHistory`
(
`Id` BIGINT(20) NOT NULL,
`DiscordId` BIGINT(20) NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_ServersUpdate`;
CREATE TRIGGER `TR_ServersUpdate`
AFTER UPDATE
ON `Servers`
FOR EACH ROW
BEGIN
INSERT INTO `ServersHistory` (
`Id`, `DiscordId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.ServerId, OLD.DiscordServerId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_ServersDelete`;
CREATE TRIGGER `TR_ServersDelete`
AFTER DELETE
ON `Servers`
FOR EACH ROW
BEGIN
INSERT INTO `ServersHistory` (
`Id`, `DiscordId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.ServerId, OLD.DiscordServerId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,46 @@
ALTER TABLE `UserGameIdents`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `UserGameIdents`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `UserGameIdentsHistory`
(
`Id` BIGINT(20) NOT NULL,
`UserId` BIGINT(20) NOT NULL,
`GameServerId` BIGINT(20) NOT NULL,
`Ident` VARCHAR(255) NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_UserGameIdentsUpdate`;
CREATE TRIGGER `TR_UserGameIdentsUpdate`
AFTER UPDATE
ON `UserGameIdents`
FOR EACH ROW
BEGIN
INSERT INTO `UserGameIdentsHistory` (
`Id`, `UserId`, `GameServerId`, `Ident`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.UserId, OLD.GameServerId, OLD.Ident, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_UserGameIdentsDelete`;
CREATE TRIGGER `TR_UserGameIdentsDelete`
AFTER DELETE
ON `UserGameIdents`
FOR EACH ROW
BEGIN
INSERT INTO `UserGameIdentsHistory` (
`Id`, `UserId`, `GameServerId`, `Ident`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.UserId, OLD.GameServerId, OLD.Ident, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,47 @@
ALTER TABLE `UserJoinedGameServer`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `UserJoinedGameServer`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `UserJoinedGameServerHistory`
(
`Id` BIGINT(20) NOT NULL,
`UserId` BIGINT(20) NOT NULL,
`GameServerId` BIGINT(20) NOT NULL,
`JoinedOn` DATETIME(6) NOT NULL,
`LeavedOn` DATETIME(6) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_UserJoinedGameServerUpdate`;
CREATE TRIGGER `TR_UserJoinedGameServerUpdate`
AFTER UPDATE
ON `UserJoinedGameServer`
FOR EACH ROW
BEGIN
INSERT INTO `UserJoinedGameServerHistory` (
`Id`, `UserId`, `GameServerId`, `JoinedOn`, `LeavedOn`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.UserId, OLD.GameServerId, OLD.JoinedOn, OLD.LeavedOn, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_UserJoinedGameServerDelete`;
CREATE TRIGGER `TR_UserJoinedGameServerDelete`
AFTER DELETE
ON `UserJoinedGameServer`
FOR EACH ROW
BEGIN
INSERT INTO `UserJoinedGameServerHistory` (
`Id`, `UserId`, `GameServerId`, `JoinedOn`, `LeavedOn`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.UserId, OLD.GameServerId, OLD.JoinedOn, OLD.LeavedOn, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,46 @@
ALTER TABLE `UserJoinedServers`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `UserJoinedServers`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `UserJoinedServersHistory`
(
`Id` BIGINT(20) NOT NULL,
`UserId` BIGINT(20) NOT NULL,
`JoinedOn` DATETIME(6) NOT NULL,
`LeavedOn` DATETIME(6) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_UserJoinedServersUpdate`;
CREATE TRIGGER `TR_UserJoinedServersUpdate`
AFTER UPDATE
ON `UserJoinedServers`
FOR EACH ROW
BEGIN
INSERT INTO `UserJoinedServersHistory` (
`Id`, `UserId`, `JoinedOn`, `LeavedOn`, `DateFrom`, `DateTo`
)
VALUES (
OLD.JoinId, OLD.UserId, OLD.JoinedOn, OLD.LeavedOn, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_UserJoinedServersDelete`;
CREATE TRIGGER `TR_UserJoinedServersDelete`
AFTER DELETE
ON `UserJoinedServers`
FOR EACH ROW
BEGIN
INSERT INTO `UserJoinedServersHistory` (
`Id`, `UserId`, `JoinedOn`, `LeavedOn`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.JoinId, OLD.UserId, OLD.JoinedOn, OLD.LeavedOn, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,49 @@
ALTER TABLE `UserJoinedVoiceChannel`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `UserJoinedVoiceChannel`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `UserJoinedVoiceChannelHistory`
(
`Id` BIGINT(20) NOT NULL,
`UserId` BIGINT(20) NOT NULL,
`DiscordChannelId` BIGINT(20) NOT NULL,
`JoinedOn` DATETIME(6) NOT NULL,
`LeavedOn` DATETIME(6) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_UserJoinedVoiceChannelUpdate`;
CREATE TRIGGER `TR_UserJoinedVoiceChannelUpdate`
AFTER UPDATE
ON `UserJoinedVoiceChannel`
FOR EACH ROW
BEGIN
INSERT INTO `UserJoinedVoiceChannelHistory` (
`Id`, `UserId`, `DiscordChannelId`, `JoinedOn`, `LeavedOn`, `DateFrom`, `DateTo`
)
VALUES (
OLD.JoinId, OLD.UserId, OLD.DiscordChannelId, OLD.JoinedOn, OLD.LeavedOn, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_UserJoinedVoiceChannelDelete`;
CREATE TRIGGER `TR_UserJoinedVoiceChannelDelete`
AFTER DELETE
ON `UserJoinedVoiceChannel`
FOR EACH ROW
BEGIN
INSERT INTO `UserJoinedVoiceChannelHistory` (
`Id`, `UserId`, `DiscordChannelId`, `JoinedOn`, `LeavedOn`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.JoinId, OLD.UserId, OLD.DiscordChannelId, OLD.JoinedOn, OLD.LeavedOn, TRUE, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,47 @@
ALTER TABLE `UserMessageCountPerHour`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `UserMessageCountPerHour`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `UserMessageCountPerHourHistory`
(
`Id` BIGINT(20) NOT NULL,
`Date` DATETIME(6) NOT NULL,
`Hour` BIGINT(20) DEFAULT NULL,
`XPCount` BIGINT(20) DEFAULT NULL,
`UserId` BIGINT(20) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_UserMessageCountPerHourUpdate`;
CREATE TRIGGER `TR_UserMessageCountPerHourUpdate`
AFTER UPDATE
ON `UserMessageCountPerHour`
FOR EACH ROW
BEGIN
INSERT INTO `UserMessageCountPerHourHistory` (
`Id`, `UserId`, `Date`, `Hour`, `XPCount`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.UserId, OLD.Date, OLD.Hour, OLD.XPCount, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_UserMessageCountPerHourDelete`;
CREATE TRIGGER `TR_UserMessageCountPerHourDelete`
AFTER DELETE
ON `UserMessageCountPerHour`
FOR EACH ROW
BEGIN
INSERT INTO `UserMessageCountPerHourHistory` (
`Id`, `UserId`, `Date`, `Hour`, `XPCount`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.UserId, OLD.Date, OLD.Hour, OLD.XPCount, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,46 @@
ALTER TABLE `UserWarnings`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `UserWarnings`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `UserWarningsHistory`
(
`Id` BIGINT(20) NOT NULL,
`Description` VARCHAR(255) NOT NULL,
`UserId` BIGINT(20) NOT NULL,
`Author` BIGINT(20) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_UserWarningsUpdate`;
CREATE TRIGGER `TR_UserWarningsUpdate`
AFTER UPDATE
ON `UserWarnings`
FOR EACH ROW
BEGIN
INSERT INTO `UserWarningsHistory` (
`Id`, `Description`, `UserId`, `Author`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Description, OLD.UserId, OLD.Author, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_UserWarningsDelete`;
CREATE TRIGGER `TR_UserWarningsDelete`
AFTER DELETE
ON `UserWarnings`
FOR EACH ROW
BEGIN
INSERT INTO `UserWarningsHistory` (
`Id`, `Description`, `UserId`, `Author`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Description, OLD.UserId, OLD.Author, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -0,0 +1,46 @@
ALTER TABLE `Users`
CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6);
ALTER TABLE `Users`
CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
CREATE TABLE IF NOT EXISTS `UsersHistory`
(
`Id` BIGINT(20) NOT NULL,
`DiscordId` BIGINT(20) NOT NULL,
`XP` BIGINT(20) NOT NULL DEFAULT 0,
`ServerId` BIGINT(20) DEFAULT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_UsersUpdate`;
CREATE TRIGGER `TR_UsersUpdate`
AFTER UPDATE
ON `Users`
FOR EACH ROW
BEGIN
INSERT INTO `UsersHistory` (
`Id`, `DiscordId`, `XP`, `ServerId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.UserId, OLD.DiscordId, OLD.XP, OLD.ServerId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_UsersDelete`;
CREATE TRIGGER `TR_UsersDelete`
AFTER DELETE
ON `Users`
FOR EACH ROW
BEGIN
INSERT INTO `UsersHistory` (
`Id`, `DiscordId`, `XP`, `ServerId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.UserId, OLD.DiscordId, OLD.XP, OLD.ServerId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -4,7 +4,7 @@ from bot_data.db_context import DBContext
class RemoveStatsMigration(MigrationABC):
name = "1.0_RemoveStatsMigration"
name = "1.0.0_RemoveStatsMigration"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)

View File

@@ -4,7 +4,7 @@ from bot_data.db_context import DBContext
class UserJoinedGameServerMigration(MigrationABC):
name = "1.0_UserJoinedGameServerMigration"
name = "1.0.0_UserJoinedGameServerMigration"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)
@@ -18,15 +18,15 @@ class UserJoinedGameServerMigration(MigrationABC):
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `UserJoinedGameServer` (
CREATE TABLE IF NOT EXISTS `GameServers` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`UserId` BIGINT NOT NULL,
`GameServer` VARCHAR(255) NOT NULL,
`JoinedOn` DATETIME(6) NOT NULL,
`LeavedOn` DATETIME(6),
`Name` VARCHAR(255) NOT NULL,
`ServerId` BIGINT NOT NULL,
`ApiKeyId` BIGINT NOT NULL,
`CreatedAt` DATETIME(6),
`LastModifiedAt` DATETIME(6),
FOREIGN KEY (`UserId`) REFERENCES Users(`UserId`),
FOREIGN KEY (`ServerId`) REFERENCES Servers(`ServerId`),
FOREIGN KEY (`ApiKeyId`) REFERENCES ApiKeys(`Id`),
PRIMARY KEY(`Id`)
);
"""
@@ -36,17 +36,42 @@ class UserJoinedGameServerMigration(MigrationABC):
self._cursor.execute(
str(
f"""
ALTER TABLE Users ADD MinecraftId VARCHAR(255) NULL AFTER XP;
CREATE TABLE IF NOT EXISTS `UserJoinedGameServer` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`UserId` BIGINT NOT NULL,
`GameServerId` BIGINT NOT NULL,
`JoinedOn` DATETIME(6) NOT NULL,
`LeavedOn` DATETIME(6),
`CreatedAt` DATETIME(6),
`LastModifiedAt` DATETIME(6),
FOREIGN KEY (`UserId`) REFERENCES Users(`UserId`),
FOREIGN KEY (`GameServerId`) REFERENCES GameServers(`Id`),
PRIMARY KEY(`Id`)
);
"""
)
)
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `UserGameIdents` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`UserId` BIGINT NOT NULL,
`GameServerId` BIGINT NOT NULL,
`Ident` VARCHAR(255) NOT NULL,
`CreatedAt` DATETIME(6),
`LastModifiedAt` DATETIME(6),
FOREIGN KEY (`UserId`) REFERENCES Users(`UserId`),
FOREIGN KEY (`GameServerId`) REFERENCES GameServers(`Id`),
CONSTRAINT UC_UserGameIdent UNIQUE (`GameServerId`,`Ident`),
PRIMARY KEY(`Id`)
);
"""
)
)
def downgrade(self):
self._cursor.execute("DROP TABLE `GameServers`;")
self._cursor.execute("DROP TABLE `UserJoinedGameServer`;")
self._cursor.execute(
str(
f"""
ALTER TABLE Users DROP COLUMN MinecraftId;
"""
)
)
self._cursor.execute("DROP TABLE `UserGameIdents`;")

View File

@@ -0,0 +1,37 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class UserWarningMigration(MigrationABC):
name = "1.0.0_UserWarningMigration"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)
self._logger = logger
self._db = db
self._cursor = db.cursor
def upgrade(self):
self._logger.debug(__name__, "Running upgrade")
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `UserWarnings` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`Description` VARCHAR(255) NOT NULL,
`UserId` BIGINT NOT NULL,
`Author` BIGINT NULL,
`CreatedAt` DATETIME(6),
`LastModifiedAt` DATETIME(6),
PRIMARY KEY(`Id`),
FOREIGN KEY (`UserId`) REFERENCES `Users`(`UserId`),
FOREIGN KEY (`Author`) REFERENCES `Users`(`UserId`)
);
"""
)
)
def downgrade(self):
self._cursor.execute("DROP TABLE `UserWarnings`;")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_data.model"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.dev130"
__version__ = "1.0.4"
from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="0", micro="dev130")
version_info = VersionInfo(major="1", minor="0", micro="4")

View File

@@ -25,6 +25,10 @@ class ApiKey(TableABC):
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def identifier(self) -> str:
return self._identifier
@@ -55,6 +59,15 @@ class ApiKey(TableABC):
"""
)
@staticmethod
def get_select_by_id(id: int) -> str:
return str(
f"""
SELECT * FROM `ApiKeys`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_key(key: str) -> str:
return str(
@@ -69,13 +82,11 @@ class ApiKey(TableABC):
return str(
f"""
INSERT INTO `ApiKeys` (
`Identifier`, `Key`, {"" if self._creator is None else "`CreatorId`,"} `CreatedAt`, `LastModifiedAt`
`Identifier`, `Key`, `CreatorId`
) VALUES (
'{self._identifier}',
'{self._key}',
{"" if self._creator is None else f"{self._creator.id},"}
'{self._created_at}',
'{self._modified_at}'
{"NULL" if self._creator is None else f"'{self._creator.id}'"}
);
"""
)
@@ -87,8 +98,7 @@ class ApiKey(TableABC):
UPDATE `ApiKeys`
SET `Identifier` = '{self._identifier}',
`Key` = '{self._key}',
{"" if self._creator is None else f"`CreatorId` = {self._creator.id},"}
`LastModifiedAt` = '{self._modified_at}'
`CreatorId` = {"NULL" if self._creator is None else f"'{self._creator.id}'"}
WHERE `Id` = {self._id};
"""
)

View File

@@ -215,14 +215,12 @@ class AuthUser(TableABC):
`EMail`,
`Password`,
`PasswordSalt`,
{"" if self._refresh_token is None else f"`RefreshToken`,"}
{"" if self._confirmation_id is None else f"`ConfirmationId`,"}
{"" if self._forgot_password_id is None else f"`ForgotPasswordId`,"}
{"" if self._oauth_id is None else f"`OAuthId`,"}
`RefreshToken`,
`ConfirmationId`,
`ForgotPasswordId`,
`OAuthId`,
`RefreshTokenExpiryTime`,
`AuthRole`,
`CreatedAt`,
`LastModifiedAt`
`AuthRole`
) VALUES (
{self._auth_user_id},
'{self._first_name}',
@@ -230,14 +228,12 @@ class AuthUser(TableABC):
'{self._email}',
'{self._password}',
'{self._password_salt}',
{"" if self._refresh_token is None else f"'{self._refresh_token}',"}
{"" if self._confirmation_id is None else f"'{self._confirmation_id}',"}
{"" if self._forgot_password_id is None else f"'{self._forgot_password_id}',"}
{"" if self._oauth_id is None else f"'{self._oauth_id}',"}
{"NULL" if self._refresh_token is None else f"'{self._refresh_token}'"},
{"NULL" if self._confirmation_id is None else f"'{self._confirmation_id}'"},
{"NULL" if self._forgot_password_id is None else f"'{self._forgot_password_id}'"},
{"NULL" if self._oauth_id is None else f"'{self._oauth_id}'"},
'{self._refresh_token_expire_time.isoformat()}',
{self._auth_role_id.value},
'{self._created_at}',
'{self._modified_at}'
{self._auth_role_id.value}
)
"""
)
@@ -252,13 +248,12 @@ class AuthUser(TableABC):
`EMail` = '{self._email}',
`Password` = '{self._password}',
`PasswordSalt` = '{self._password_salt}',
{'' if self._refresh_token is None else f"`RefreshToken` = '{self._refresh_token}',"}
{'' if self._confirmation_id is None else f"'`ConfirmationId` = '{self._confirmation_id}',"}
{'' if self._forgot_password_id is None else f"`ForgotPasswordId` = '{self._forgot_password_id}',"}
{'' if self._oauth_id is None else f"`OAuthId` = '{self._oauth_id}',"}
`RefreshToken` = {"NULL" if self._refresh_token is None else f"'{self._refresh_token}'"},
`ConfirmationId` = {"NULL" if self._confirmation_id is None else f"'{self._confirmation_id}'"},
`ForgotPasswordId` = {"NULL" if self._forgot_password_id is None else f"'{self._forgot_password_id}'"},
`OAuthId` = {"NULL" if self._oauth_id is None else f"'{self._oauth_id}'"},
`RefreshTokenExpiryTime` = '{self._refresh_token_expire_time.isoformat()}',
`AuthRole` = {self._auth_role_id.value},
`LastModifiedAt` = '{self._modified_at}'
`AuthRole` = {self._auth_role_id.value}
WHERE `AuthUsers`.`Id` = {self._auth_user_id};
"""
)

View File

@@ -68,12 +68,10 @@ class AuthUserUsersRelation(TableABC):
return str(
f"""
INSERT INTO `AuthUserUsersRelations` (
`AuthUserId`, `UserId`, `CreatedAt`, `LastModifiedAt`
`AuthUserId`, `UserId`
) VALUES (
{self._auth_user.id},
{self._user.id},
'{self._created_at}',
'{self._modified_at}'
{self._user.id}
);
"""
)
@@ -83,9 +81,8 @@ class AuthUserUsersRelation(TableABC):
return str(
f"""
UPDATE `AuthUserUsersRelations`
SET `AuthUserId` = '{self._auth_user.id}',,
SET `AuthUserId` = '{self._auth_user.id}',
`UserId` = '{self._user.id}'
`LastModifiedAt` = '{self._modified_at}'
WHERE `AuthUserId` = {self._auth_user.id}
AND `UserId` = {self._user.id};
"""

View File

@@ -97,13 +97,11 @@ class AutoRole(TableABC):
return str(
f"""
INSERT INTO `AutoRoles` (
`ServerId`, `DiscordChannelId`, `DiscordMessageId`, `CreatedAt`, `LastModifiedAt`
`ServerId`, `DiscordChannelId`, `DiscordMessageId`
) VALUES (
{self._server.id},
{self._discord_channel_id},
{self._discord_message_id},
'{self._created_at}',
'{self._modified_at}'
{self._discord_message_id}
);
"""
)
@@ -115,8 +113,7 @@ class AutoRole(TableABC):
UPDATE `AutoRoles`
SET `ServerId` = {self._server.id},
`DiscordChannelId` = {self._discord_channel_id},
`DiscordMessageId` = {self._discord_message_id},
`LastModifiedAt` = '{self._modified_at}'
`DiscordMessageId` = {self._discord_message_id}
WHERE `AutoRoleId` = {self._auto_role_id};
"""
)

View File

@@ -0,0 +1,49 @@
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.abc.history_table_abc import HistoryTableABC
class AutoRoleHistory(HistoryTableABC):
def __init__(
self,
server: int,
channel_id: int,
dc_message_id: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._auto_role_id = id
self._server = server
self._discord_channel_id = channel_id
self._discord_message_id = dc_message_id
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def id(self) -> int:
return self._auto_role_id
@property
def server(self) -> int:
return self._server
@property
def discord_channel_id(self) -> int:
return self._discord_channel_id
@property
@ServiceProviderABC.inject
def discord_channel_name(self, bot: DiscordBotServiceABC) -> str:
channel = bot.get_channel(self.discord_channel_id)
return None if channel is None else channel.name
@property
def discord_message_id(self) -> int:
return self._discord_message_id

View File

@@ -87,13 +87,11 @@ class AutoRoleRule(TableABC):
return str(
f"""
INSERT INTO `AutoRoleRules` (
`AutoRoleId`, `DiscordEmojiName`, `DiscordRoleId`, `CreatedAt`, `LastModifiedAt`
`AutoRoleId`, `DiscordEmojiName`, `DiscordRoleId`
) VALUES (
{self._auto_role.id},
'{self._discord_emoji_name}',
{self._discord_role_id},
'{self._created_at}',
'{self._modified_at}'
{self._discord_role_id}
);
"""
)
@@ -105,8 +103,7 @@ class AutoRoleRule(TableABC):
UPDATE `AutoRoleRules`
SET `AutoRoleId` = {self._auto_role.id},
`DiscordEmojiName` = '{self._discord_emoji_name}',
`DiscordRoleId` = {self._discord_role_id},
`LastModifiedAt` = '{self._modified_at}'
`DiscordRoleId` = {self._discord_role_id}
WHERE `AutoRoleRuleId` = {self._auto_role_rule_id};
"""
)

View File

@@ -0,0 +1,48 @@
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.abc.history_table_abc import HistoryTableABC
class AutoRoleRuleHistory(HistoryTableABC):
def __init__(
self,
auto_role: int,
discord_emoji_name: str,
discord_role_id: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._auto_role_rule_id = id
self._auto_role = auto_role
self._discord_emoji_name = discord_emoji_name
self._discord_role_id = discord_role_id
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def id(self) -> int:
return self._auto_role_rule_id
@property
def auto_role(self) -> int:
return self._auto_role
@property
def emoji_name(self) -> str:
return self._discord_emoji_name
@property
def role_id(self) -> int:
return self._discord_role_id
@property
@ServiceProviderABC.inject
def role_name(self, bot: DiscordBotServiceABC) -> str:
guild = bot.get_guild(self.auto_role.server.discord_id)
return guild.get_role(self.role_id).name

View File

@@ -53,7 +53,6 @@ class Client(TableABC):
@sent_message_count.setter
def sent_message_count(self, value: int):
self._modified_at = datetime.now().isoformat()
self._sent_message_count = value
@property
@@ -62,7 +61,6 @@ class Client(TableABC):
@received_message_count.setter
def received_message_count(self, value: int):
self._modified_at = datetime.now().isoformat()
self._received_message_count = value
@property
@@ -71,7 +69,6 @@ class Client(TableABC):
@deleted_message_count.setter
def deleted_message_count(self, value: int):
self._modified_at = datetime.now().isoformat()
self._deleted_message_count = value
@property
@@ -80,7 +77,6 @@ class Client(TableABC):
@received_command_count.setter
def received_command_count(self, value: int):
self._modified_at = datetime.now().isoformat()
self._received_command_count = value
@property
@@ -89,7 +85,6 @@ class Client(TableABC):
@moved_users_count.setter
def moved_users_count(self, value: int):
self._modified_at = datetime.now().isoformat()
self._moved_users_count = value
@property
@@ -152,9 +147,7 @@ class Client(TableABC):
`DeletedMessageCount`,
`ReceivedCommandsCount`,
`MovedUsersCount`,
`ServerId`,
`CreatedAt`,
`LastModifiedAt`
`ServerId`
) VALUES (
{self._discord_client_id},
{self._sent_message_count},
@@ -162,9 +155,7 @@ class Client(TableABC):
{self._deleted_message_count},
{self._received_message_count},
{self._moved_users_count},
{self._server.id},
'{self._created_at}',
'{self._modified_at}'
{self._server.id}
);
"""
)
@@ -178,8 +169,7 @@ class Client(TableABC):
`ReceivedMessageCount` = {self._received_message_count},
`DeletedMessageCount` = {self._deleted_message_count},
`ReceivedCommandsCount` = {self._received_command_count},
`MovedUsersCount` = {self._moved_users_count},
`LastModifiedAt` = '{self._modified_at}'
`MovedUsersCount` = {self._moved_users_count}
WHERE `ClientId` = {self._client_id};
"""
)

View File

@@ -0,0 +1,72 @@
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.abc.history_table_abc import HistoryTableABC
class ClientHistory(HistoryTableABC):
def __init__(
self,
dc_id: int,
smc: int,
rmc: int,
dmc: int,
rcc: int,
muc: int,
server: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._client_id = id
self._discord_client_id = dc_id
self._sent_message_count = smc
self._received_message_count = rmc
self._deleted_message_count = dmc
self._received_command_count = rcc
self._moved_users_count = muc
self._server = server
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def id(self) -> int:
return self._client_id
@property
def discord_id(self) -> int:
return self._discord_client_id
@property
@ServiceProviderABC.inject
def name(self, bot: DiscordBotServiceABC) -> str:
return bot.user.name
@property
def sent_message_count(self) -> int:
return self._sent_message_count
@property
def received_message_count(self) -> int:
return self._received_message_count
@property
def deleted_message_count(self) -> int:
return self._deleted_message_count
@property
def received_command_count(self) -> int:
return self._received_command_count
@property
def moved_users_count(self) -> int:
return self._moved_users_count
@property
def server(self) -> int:
return self._server

View File

@@ -0,0 +1,140 @@
from datetime import datetime
from cpl_core.database import TableABC
from bot_data.model.api_key import ApiKey
from bot_data.model.server import Server
class GameServer(TableABC):
def __init__(
self,
name: str,
server: Server,
api_key: ApiKey,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._name = name
self._server = server
self._api_key = api_key
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def name(self) -> str:
return self._name
@name.setter
def name(self, value: str):
self._name = value
@property
def server(self) -> Server:
return self._server
@server.setter
def server(self, value: Server):
self._server = value
@property
def api_key(self) -> ApiKey:
return self._api_key
@api_key.setter
def api_key(self, value: ApiKey):
self._api_key = value
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `GameServers`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `GameServers`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_api_key_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `GameServers`
WHERE `ApiKeyId` = {id};
"""
)
@staticmethod
def get_select_by_server_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `GameServers`
WHERE `ServerId` = {id};
"""
)
@staticmethod
def get_select_by_user_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `GameServers`
WHERE `UserId` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `GameServers` (
`Name`, `ServerId`, `ApiKeyId`
) VALUES (
'{self._name}',
{self._server.id},
{self._api_key.id}
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `GameServers`
SET `Name` = '{self._name}'
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `GameServers`
WHERE `Id` = {self._id};
"""
)
@staticmethod
def delete_by_user_id_string(id: int) -> str:
return str(
f"""
DELETE FROM `GameServers`
WHERE `UserId` = {id}
"""
)

View File

@@ -57,11 +57,9 @@ class KnownUser(TableABC):
return str(
f"""
INSERT INTO `KnownUsers` (
`DiscordId`, `CreatedAt`, `LastModifiedAt`
`DiscordId`
) VALUES (
{self._discord_id},
'{self._created_at}',
'{self._modified_at}'
{self._discord_id}
);
"""
)

View File

@@ -0,0 +1,28 @@
from bot_data.abc.history_table_abc import HistoryTableABC
class KnownUserHistory(HistoryTableABC):
def __init__(
self,
dc_id: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._known_user_id = id
self._discord_id = dc_id
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def id(self) -> int:
return self._known_user_id
@property
def discord_id(self) -> int:
return self._discord_id

View File

@@ -39,7 +39,6 @@ class Level(TableABC):
@name.setter
def name(self, value: str):
self._modified_at = datetime.now().isoformat()
self._name = value
@property
@@ -48,7 +47,6 @@ class Level(TableABC):
@color.setter
def color(self, value: str):
self._modified_at = datetime.now().isoformat()
self._color = value
@property
@@ -57,7 +55,6 @@ class Level(TableABC):
@min_xp.setter
def min_xp(self, value: int):
self._modified_at = datetime.now().isoformat()
self._min_xp = value
@property
@@ -66,7 +63,6 @@ class Level(TableABC):
@permissions.setter
def permissions(self, value: int):
self._modified_at = datetime.now().isoformat()
self._permissions = value
@property
@@ -75,7 +71,6 @@ class Level(TableABC):
@server.setter
def server(self, value: Server):
self._modified_at = datetime.now().isoformat()
self._server = value
@staticmethod
@@ -109,15 +104,13 @@ class Level(TableABC):
return str(
f"""
INSERT INTO `Levels` (
`Name`, `Color`, `MinXp`, `PermissionInt`, `ServerId`, `CreatedAt`, `LastModifiedAt`
`Name`, `Color`, `MinXp`, `PermissionInt`, `ServerId`
) VALUES (
'{self._name}',
'{self._color}',
{self._min_xp},
{self._permissions},
{self._server.id},
'{self._created_at}',
'{self._modified_at}'
{self._server.id}
);
"""
)
@@ -130,8 +123,7 @@ class Level(TableABC):
SET `Name` = '{self._name}',
`Color` = '{self._color}',
`MinXp` = {self._min_xp},
`PermissionInt` = {self._permissions},
`LastModifiedAt` = '{self._modified_at}'
`PermissionInt` = {self._permissions}
WHERE `Id` = {self._id};
"""
)

View File

@@ -0,0 +1,55 @@
from typing import Optional
from bot_data.abc.history_table_abc import HistoryTableABC
from bot_data.model.server import Server
class LevelHistory(HistoryTableABC):
def __init__(
self,
name: str,
color: str,
min_xp: int,
permissions: int,
server: Optional[Server],
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._id = id
self._name = name
self._color = color
self._min_xp = min_xp
self._permissions = permissions
self._server = server
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def id(self) -> int:
return self._id
@property
def name(self) -> str:
return self._name
@property
def color(self) -> str:
return self._color
@property
def min_xp(self) -> int:
return self._min_xp
@property
def permissions(self) -> int:
return self._permissions
@property
def server(self) -> Server:
return self._server

View File

@@ -71,11 +71,9 @@ class Server(TableABC):
return str(
f"""
INSERT INTO `Servers` (
`DiscordServerId`, `CreatedAt`, `LastModifiedAt`
`DiscordServerId`
) VALUES (
{self._discord_server_id},
'{self._created_at}',
'{self._modified_at}'
{self._discord_server_id}
);
"""
)
@@ -85,8 +83,7 @@ class Server(TableABC):
return str(
f"""
UPDATE `Servers`
SET `DiscordServerId` = {self._discord_server_id},
`LastModifiedAt` = '{self._modified_at}'
SET `DiscordServerId` = {self._discord_server_id}
WHERE `ServerId` = {self._server_id};
"""
)

View File

@@ -0,0 +1,43 @@
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.abc.history_table_abc import HistoryTableABC
class ServerHistory(HistoryTableABC):
def __init__(
self,
dc_id: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._server_id = id
self._discord_server_id = dc_id
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def id(self) -> int:
return self._server_id
@property
def discord_id(self) -> int:
return self._discord_server_id
@property
@ServiceProviderABC.inject
def name(self, bot: DiscordBotServiceABC) -> str:
guild = bot.get_guild(self.discord_id)
return None if guild is None else guild.name
@property
@ServiceProviderABC.inject
def icon_url(self, bot: DiscordBotServiceABC) -> str:
guild = bot.get_guild(self.discord_id)
return None if guild is None else guild.icon.url

View File

@@ -4,6 +4,7 @@ from typing import Optional
from cpl_core.database import TableABC
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_data.model.level import Level
from bot_data.model.server import Server
@@ -14,7 +15,6 @@ class User(TableABC):
self,
dc_id: int,
xp: int,
minecraft_id: Optional[str],
server: Optional[Server],
created_at: datetime = None,
modified_at: datetime = None,
@@ -23,7 +23,6 @@ class User(TableABC):
self._user_id = id
self._discord_id = dc_id
self._xp = xp
self._minecraft_id = minecraft_id
self._server = server
TableABC.__init__(self)
@@ -58,7 +57,6 @@ class User(TableABC):
@xp.setter
def xp(self, value: int):
self._modified_at = datetime.now().isoformat()
self._xp = value
@property
@@ -77,14 +75,6 @@ class User(TableABC):
levels: LevelService = services.get_service(LevelService)
return levels.get_level(self)
@property
def minecraft_id(self) -> Optional[str]:
return self._minecraft_id
@minecraft_id.setter
def minecraft_id(self, value: str):
self._minecraft_id = value
@property
def server(self) -> Optional[Server]:
return self._server
@@ -100,6 +90,17 @@ class User(TableABC):
ujs: UserJoinedServerRepositoryABC = services.get_service(UserJoinedServerRepositoryABC)
return ujs.find_active_user_joined_server_by_user_id(self.id) is None
@property
@ServiceProviderABC.inject
def game_idents(
self,
services: ServiceProviderABC,
) -> List["UserGameIdent"]:
from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC
game_idents_repo: UserGameIdentRepositoryABC = services.get_service(UserGameIdentRepositoryABC)
return game_idents_repo.get_user_game_idents_by_user_id(self.id)
@staticmethod
def get_select_all_string() -> str:
return str(
@@ -150,14 +151,11 @@ class User(TableABC):
return str(
f"""
INSERT INTO `Users` (
`DiscordId`, `XP`, {"" if self._minecraft_id is None else "`MinecraftId`,"} `ServerId`, `CreatedAt`, `LastModifiedAt`
`DiscordId`, `XP`, `ServerId`
) VALUES (
{self._discord_id},
{self._xp},
{"" if self._minecraft_id is None else f"'{self._minecraft_id}',"}
{self._server.id},
'{self._created_at}',
'{self._modified_at}'
{self._server.id}
);
"""
)
@@ -167,9 +165,7 @@ class User(TableABC):
return str(
f"""
UPDATE `Users`
SET `XP` = {self._xp},
{"" if self._minecraft_id is None else f"`MinecraftId` = '{self._minecraft_id}',"}
`LastModifiedAt` = '{self._modified_at}'
SET `XP` = {self._xp}
WHERE `UserId` = {self._user_id};
"""
)

View File

@@ -0,0 +1,123 @@
from datetime import datetime
from cpl_core.database import TableABC
from bot_data.model.game_server import GameServer
from bot_data.model.user import User
class UserGameIdent(TableABC):
def __init__(
self,
user: User,
game_server: GameServer,
ident: str,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._user = user
self._game_server = game_server
self._ident = ident
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def user(self) -> User:
return self._user
@property
def game_server(self) -> GameServer:
return self._game_server
@property
def ident(self) -> str:
return self._ident
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `UserGameIdents`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `UserGameIdents`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_ident_string(ident: str) -> str:
return str(
f"""
SELECT * FROM `UserGameIdents`
WHERE `Ident` = '{ident}';
"""
)
@staticmethod
def get_select_by_user_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `UserGameIdents`
WHERE `UserId` = {id};
"""
)
@staticmethod
def get_select_active_by_user_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `UserGameIdents`
WHERE `UserId` = {id}
AND `LeavedOn` IS NULL;
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `UserGameIdents` (
`UserId`, `GameServerId`, `Ident`
) VALUES (
{self._user.id},
'{self._game_server.id}',
'{self._ident}'
);
"""
)
@property
def udpate_string(self) -> str:
return ""
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `UserGameIdents`
WHERE `Id` = {self._id};
"""
)
@staticmethod
def delete_by_user_id_string(id: int) -> str:
return str(
f"""
DELETE FROM `UserGameIdents`
WHERE `UserId` = {id}
"""
)

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