211 Commits

Author SHA1 Message Date
eeda0405f3 Merge pull request 'dev' (#400) from dev into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m13s
Reviewed-on: sh-edraft.de/kd_discord_bot#400
2023-10-03 11:09:46 +02:00
0e2b7d03fc Fixed compose
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m17s
2023-10-03 11:04:33 +02:00
c7f5ab0161 Merge pull request '#393' (#399) from #393 into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m25s
Reviewed-on: sh-edraft.de/kd_discord_bot#399
2023-10-03 10:53:35 +02:00
01e8e4256d Build new version #393 2023-10-03 10:52:38 +02:00
75adc2285e Fixed feature flag handling #393 2023-10-03 10:51:40 +02:00
9e12d84ba0 Fixed errors #393 2023-10-03 10:09:10 +02:00
d3b503d3ef Improved permission service #393 2023-10-03 10:04:16 +02:00
dd86c3a657 Moved help message from private to team chat 2023-10-03 09:46:14 +02:00
aba6e48e2b Merge pull request 'dev' (#392) from dev into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m42s
Reviewed-on: sh-edraft.de/kd_discord_bot#392
2023-10-02 09:22:16 +02:00
73848c3141 Merge branch 'master' into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m22s
2023-10-02 09:22:09 +02:00
33d6015088 Fixed compose
Some checks reported warnings
Deploy dev on push / on-push-deploy_sh-edraft (push) Has been cancelled
2023-10-02 09:20:33 +02:00
7e962e05f6 Fixed docker stacks
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m16s
2023-10-02 08:48:25 +02:00
c73c6876b2 Fixed short role name check command
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m49s
2023-10-02 08:36:33 +02:00
8e949c3e1a Set compose versions
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m18s
2023-10-02 08:31:15 +02:00
472a76d563 Build new version #391
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m11s
2023-10-02 08:25:18 +02:00
f5d88ec94c Completed feature #391 2023-10-02 08:24:20 +02:00
2182c021b9 Added highest role setting to gql #391 2023-10-02 08:01:21 +02:00
a9c9880fd4 Added highest role check #391 2023-10-02 07:59:08 +02:00
d91c76467d Added setting to server config #391 2023-10-02 07:52:00 +02:00
2f10ace27f Set version 2023-10-02 07:46:13 +02:00
3b79a61bb6 Improved can see permission for admin and technician 2023-10-02 07:41:15 +02:00
ef0fab1178 Check level in sync command
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m35s
2023-10-02 07:30:14 +02:00
189b6370a9 Moved welcome message for team from private to team chat #390 2023-10-02 07:28:09 +02:00
0ed93c56d0 Merge pull request 'dev' (#389) from dev into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m31s
Reviewed-on: sh-edraft.de/kd_discord_bot#389
2023-10-02 07:22:08 +02:00
4d18dd3845 Added gitea templates
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m50s
2023-10-02 07:14:36 +02:00
7b7cbb20db Fixed formatting 2023-10-02 07:13:21 +02:00
84c2f5c2c4 Fixed workflow for new branch model
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m49s
2023-10-02 07:12:39 +02:00
c85c6df784 Merge pull request 'support' (#388) from support into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m51s
Reviewed-on: sh-edraft.de/kd_discord_bot#388
2023-09-29 19:42:22 +02:00
d5d898fa07 Merge pull request 'Fixed auto-role react' (#387) from 1.1.8 into support
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 33s
Reviewed-on: sh-edraft.de/kd_discord_bot#387
2023-09-29 19:42:09 +02:00
ef5ebabf81 Fixed auto-role react 2023-09-29 19:41:55 +02:00
f89b4c4ef5 Merge pull request 'support' (#386) from support into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m10s
Reviewed-on: sh-edraft.de/kd_discord_bot#386
2023-09-29 19:31:19 +02:00
8b277a2d19 Merge pull request 'Fixed docker compose' (#385) from 1.1.8 into support
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m7s
Reviewed-on: sh-edraft.de/kd_discord_bot#385
2023-09-29 19:27:13 +02:00
a84e77e055 Fixed docker compose 2023-09-29 19:26:40 +02:00
892c983e1e Merge pull request '1.1.8' (#384) from 1.1.8 into support
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m9s
Reviewed-on: sh-edraft.de/kd_discord_bot#384
2023-09-29 19:20:41 +02:00
1d3809c986 Set version 2023-09-29 19:20:04 +02:00
3117f617d9 Fixed auto role add 2023-09-29 19:19:23 +02:00
7e6053768f Added react command 2023-09-29 19:11:06 +02:00
3d9cd0a2fc Merge pull request 'Fixed nick name handling' (#383) from support into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m37s
Reviewed-on: sh-edraft.de/kd_discord_bot#383
2023-09-28 20:59:26 +02:00
8d90768594 Fixed nick name handling
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m2s
2023-09-28 20:54:23 +02:00
7e8a9482d4 Merge pull request 'Added short role name check command' (#382) from support into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m23s
Reviewed-on: sh-edraft.de/kd_discord_bot#382
2023-09-28 20:46:41 +02:00
bf7d29e6ab Fixed auto role group
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m16s
2023-09-28 20:41:27 +02:00
608001e0e1 Added short role name check command
Some checks reported warnings
Deploy dev on push / on-push-deploy_sh-edraft (push) Has been cancelled
2023-09-28 20:37:15 +02:00
0dd9558f33 Merge pull request 'support' (#381) from support into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m12s
Reviewed-on: sh-edraft.de/kd_discord_bot#381
2023-09-28 20:03:31 +02:00
7acd850e68 Set version
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m23s
2023-09-28 19:59:26 +02:00
ecd3ea96b1 Merge pull request 'Fixed mutation' (#380) from 1.1.7 into support
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m10s
Reviewed-on: sh-edraft.de/kd_discord_bot#380
2023-09-28 19:51:23 +02:00
d869bcfd3a Fixed mutation 2023-09-28 19:51:02 +02:00
818e021761 Merge pull request 'Fixed post script' (#379) from 1.1.7 into support
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m6s
Reviewed-on: sh-edraft.de/kd_discord_bot#379
2023-09-28 19:32:36 +02:00
b286322247 Merge branch 'support' into 1.1.7 2023-09-28 19:13:20 +02:00
661b057e85 Fixed workspace 2023-09-28 19:13:10 +02:00
9be4e344f6 Merge pull request '1.1.7 - #376 #375 #374' (#377) from 1.1.7 into support
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m24s
Reviewed-on: sh-edraft.de/kd_discord_bot#377
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #374 #375 #376 #378
2023-09-28 18:12:57 +02:00
ebc782e266 Fixed project description #378 2023-09-28 17:34:49 +02:00
887a46fa7f Build version #378 2023-09-28 17:03:05 +02:00
0cc8d6f2c7 Added discord impl #378 2023-09-28 17:01:33 +02:00
3546d38f75 Added flag check to hide pages #378 2023-09-28 15:14:38 +02:00
376cb76036 Added frontend impl #378 2023-09-28 14:36:45 +02:00
8e8da46a54 Added short role names components #378 2023-09-28 13:17:42 +02:00
94e003312d Fixed migration #378 2023-09-28 11:35:38 +02:00
fe42d46a38 Fixed server config #378 2023-09-28 11:30:58 +02:00
4c0a4bc1ae Added can see check #378 2023-09-28 10:54:04 +02:00
4161d3a38a Added to server query #378 2023-09-28 10:52:51 +02:00
4a763e4e03 Added position query #378 2023-09-28 10:44:09 +02:00
9783424066 Fixed mutation #378 2023-09-28 10:38:08 +02:00
290b5f38a7 Added mutation #378 2023-09-28 10:15:35 +02:00
5bfd04722c Added query #378 2023-09-28 10:00:35 +02:00
12f956f4c3 Added repo #378 2023-09-28 09:39:49 +02:00
0b767fcb68 Improved data model #378 2023-09-28 09:32:18 +02:00
a303108da2 Fixed migration #378 2023-09-28 09:23:21 +02:00
5e9cca5b1d Added fix migration #378 2023-09-28 09:08:52 +02:00
d1c79c95b2 Added short role name migration #378 2023-09-28 08:56:59 +02:00
378d2c3dc9 Added guild join event 2023-09-28 08:03:41 +02:00
a8ea9f5e49 Fixed table add 2023-09-28 07:51:40 +02:00
957a54ccf3 Set new version 2023-09-28 07:40:09 +02:00
0037a30c11 Fixed discord data orders 2023-09-28 07:31:23 +02:00
77e079d91c Fixed config for new servers 2023-09-28 07:16:50 +02:00
25137c6923 Merge pull request 'Fixed action' (#373) from support into master
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m58s
Reviewed-on: sh-edraft.de/kd_discord_bot#373
2023-09-27 20:59:21 +02:00
0a0401dd87 Fixed action
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m43s
2023-09-27 20:59:03 +02:00
74f3ee2f08 Merge pull request 'support into master' (#371) from support into master
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 1m6s
Reviewed-on: sh-edraft.de/kd_discord_bot#371
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-09-27 20:46:54 +02:00
69fc75fc97 Merge pull request 'secrets' (#372) from secrets into support
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m41s
Reviewed-on: sh-edraft.de/kd_discord_bot#372
2023-09-27 20:46:45 +02:00
5a85232374 Added secrets 2023-09-27 20:35:16 +02:00
5892b209d3 Added secrets 2023-09-27 20:33:35 +02:00
6715ecacd6 Install ts-node
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m27s
2023-09-27 17:51:50 +02:00
d72715d51b Fixed action
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 3m16s
2023-09-27 17:33:50 +02:00
a7f9fa5818 Fixed action
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 2m43s
2023-09-27 17:28:45 +02:00
c45916aaee Merge pull request '#369' (#370) from #369 into support
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 2m10s
Reviewed-on: sh-edraft.de/kd_discord_bot#370
2023-09-27 17:24:40 +02:00
8bbd57e82f Fixed deploy #369 2023-09-27 17:22:46 +02:00
987a1a664b Tried to add CI/CD #369 2023-09-27 17:21:11 +02:00
99bfa9874a Renamed image #369 2023-09-27 16:47:57 +02:00
82058bab0e Merge pull request '1.1.6' (#368) from 1.1.6 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#368
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-09-27 16:32:38 +02:00
a566fca01f Fixed typo 2023-09-27 16:24:08 +02:00
e52f5e4186 Merge pull request '#364' (#365) from #364 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#365
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #364
2023-09-27 14:50:37 +02:00
c90ede69dd Check feature active in user joined game server mutation 2023-09-27 13:02:57 +02:00
85ba012b6f Merge pull request '#362' (#363) from #362 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#363
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #362
2023-09-27 12:34:48 +02:00
4cc094576d Fixed auto_complete #367 2023-09-25 22:10:28 +02:00
74ddc238be Added sync commands #367 2023-09-25 22:07:27 +02:00
b53ddb1351 Added logic to list game ident users #366 2023-09-25 20:38:18 +02:00
ca5a6c81b8 Build version #366 2023-09-25 20:38:18 +02:00
7b7bbaea50 Set version #366 2023-09-25 20:38:18 +02:00
d4b40eb52e Build version #364 2023-09-25 18:09:04 +02:00
ed524c2f64 Set version #364 2023-09-25 18:08:15 +02:00
8e3c8459f8 Fixed user joined game server mutation #364 2023-09-25 18:06:58 +02:00
e661ee1489 Merge branch 'support' into #362 2023-09-24 20:33:16 +02:00
9eaeb2df42 Merge pull request '#360' (#361) from #360 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#361
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #360
2023-09-24 20:33:08 +02:00
481c0f881a Build version #362 2023-09-24 19:59:32 +02:00
a065c703eb Set version #362 2023-09-24 19:59:18 +02:00
f72ea68f66 Fixed channel for get channel name can be None #362 2023-09-24 19:57:51 +02:00
9226a1188e Fixed translation #360 2023-09-24 17:13:19 +02:00
c06cb02cd6 Added logic to set default role #360 2023-09-24 17:05:42 +02:00
20747001b0 Added logic to set default role #360 2023-09-24 17:05:35 +02:00
b4be6b4ac2 Set frontend version #360 2023-09-24 16:45:15 +02:00
bd3dd39dbc Build version #360 2023-09-24 16:44:33 +02:00
9e0905d49e Added default role handling #360 2023-09-24 16:43:28 +02:00
3c0719f50e Added default role to backend #360 2023-09-24 16:19:18 +02:00
77d3668a06 Set version #360 2023-09-24 16:11:56 +02:00
e914c7d02b Fixed auth service 2023-09-24 10:39:27 +02:00
b40f521212 Build version 2023-09-24 10:18:54 +02:00
d40ca88cd5 Updated version 2023-09-24 10:17:24 +02:00
1e63baed97 Merge pull request 'Fixed authUser to user link #358' (#359) from #358 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#359
2023-09-24 10:04:41 +02:00
cdfd151851 Fixed authUser to user link #358 2023-09-24 10:04:13 +02:00
12fbc972d9 Fixed mail dev pw 2023-09-19 21:37:31 +02:00
dca939f025 Merge pull request 'Added check with -xp to get_level' (#357) from fix_get_level_with_negative_xp into support
Reviewed-on: sh-edraft.de/kd_discord_bot#357
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-09-10 22:23:33 +02:00
2e0c1babe4 Merge pull request 'support in master' (#356) from support into master
Reviewed-on: sh-edraft.de/kd_discord_bot#356
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-09-10 18:23:38 +02:00
ed9b893c12 Fixed negative xp check 2023-09-10 18:21:30 +02:00
731f80bd5f Fixed negative xp check 2023-09-10 11:14:11 +02:00
85852bf2f0 Added check with -xp to get_level 2023-09-10 11:07:37 +02:00
2c3ef97a14 Updated to swarm 2023-09-03 15:48:40 +02:00
9ec65689ba Merge pull request '1.1.1' (#355) from 1.1.1 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#355
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-08-25 14:15:54 +02:00
44f5de32a5 Merge branch 'support' into 1.1.1 2023-08-25 14:15:38 +02:00
c016d5fc84 Set new version 2023-08-24 17:59:03 +02:00
306ce2664c Build new version 2023-08-24 17:59:03 +02:00
3ce5471ef4 Fixed can user see element for achievements 2023-08-24 17:59:02 +02:00
4cdd6c05bf Merge pull request '1.1.0' (#352) from 1.1.0 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#352
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-08-24 17:50:24 +02:00
d364ea1b4c Fixed achievement voice state #353 2023-08-21 19:00:55 +02:00
6fa08ea828 Fixed minor bugs #1.1.0 2023-08-21 16:25:42 +02:00
296c6e8044 Fixed stuff #1.1.0 2023-08-21 15:51:54 +02:00
0541f3dfde Fixed translations #1.1.0 2023-08-21 15:22:14 +02:00
052e0f976a Build release version #1.1.0 2023-08-21 14:44:11 +02:00
f41dfc9be2 Merge pull request '1.1.0.rc6' (#351) from 1.1.0.rc6 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#351
2023-08-21 14:41:53 +02:00
74437fdc20 Fixed client styling #1.1.0.rc6 2023-08-19 13:06:07 +02:00
df2b660b75 Fixed sidebar to support responsive mode #1.1.0.rc6 2023-08-19 10:04:38 +02:00
12f231aa41 Merge pull request 'Fixed responsive styling #1.1.0.rc5' (#350) from 1.1.0.rc5 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#350
2023-08-18 16:56:11 +02:00
2f3ae229c9 Fixed responsive styling #1.1.0.rc5 2023-08-18 16:50:19 +02:00
5bbed854a4 Merge pull request '1.1.0.rc5' (#349) from 1.1.0.rc5 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#349
2023-08-18 16:34:40 +02:00
2321c12bc9 Fixed auth user table #1.1.0.rc5 2023-08-18 16:33:13 +02:00
1cdfd1291f Fixed add icons #1.1.0.rc5 2023-08-18 16:31:30 +02:00
223946ad76 Fixed auto role rule emoji loading #1.1.0.rc5 2023-08-18 16:10:45 +02:00
4ea1b5b94c Improved table responsive mode #1.1.0.rc5 2023-08-18 16:01:20 +02:00
919970d199 Fixed add new infinity id bug & fixed translations #1.1.0.rc5 2023-08-18 08:26:00 +02:00
19ed164845 Set version correctly #1.1.0.rc5 2023-08-18 08:16:27 +02:00
92001a45be Fixed xp calculation #1.1.0.rc5 2023-08-18 08:09:43 +02:00
78b761a672 Fixed auto role tables #1.1.0.rc5 2023-08-18 08:05:27 +02:00
7bfa39f459 Merge pull request 'Fixed stylings #1.1.0.rc4 style fixes' (#348) from 1.1.0.rc4 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#348
2023-08-18 00:43:56 +02:00
d586cca672 Fixed stylings #1.1.0.rc4 2023-08-18 00:42:58 +02:00
efce172c01 Fixed table responsive mode #1.1.0 2023-08-17 23:50:36 +02:00
0974325148 Reset version #1.1.0 2023-08-17 23:42:41 +02:00
206754919f Merge pull request '1.1.0_responsive' (#347) from 1.1.0_responsive into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#347
2023-08-17 23:38:20 +02:00
b49512e28d Made hole app responsive #1.1.0 2023-08-17 23:36:44 +02:00
fa71759a20 Made dashboard responsive #1.1.0 2023-08-17 22:35:10 +02:00
9338e35504 Merge pull request 'Fixed hidden columns #1.1.0.rc4' (#346) from 1.1.0.rc4 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#346
2023-08-17 21:27:31 +02:00
2956dcb9c2 Fixed hidden columns #1.1.0.rc4 2023-08-17 21:26:18 +02:00
762bebf416 Merge pull request '1.1.0.rc4' (#345) from 1.1.0.rc4 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#345
Closes #344
2023-08-17 21:02:26 +02:00
f3b5cef253 Fixed discord data by guild filter #1.1.0.rc4 2023-08-17 19:58:25 +02:00
6869c5a671 Added coffee command #1.1.0.rc4 2023-08-17 16:18:11 +02:00
352b44be0f Fixed input styling #344 #1.1.0.rc4 2023-08-17 09:56:21 +02:00
5912708d3a Added dropdown to server config input #344 #1.1.0.rc4 2023-08-17 08:52:46 +02:00
45a3127696 Added dropdown to technicianId input #344 #1.1.0.rc4 2023-08-17 08:37:04 +02:00
10c20621a8 Set frontend version #1.1.0.rc4 2023-08-16 22:31:28 +02:00
49e0e44461 Build rc4 version #1.1.0.rc4 2023-08-16 22:30:51 +02:00
ec6b080ba6 Set rc4 version #1.1.0.rc4 2023-08-16 22:30:37 +02:00
28944755ac Fixed achievement events #1.1.0.rc4 2023-08-16 22:30:12 +02:00
7318239b2d Set frontend version #1.1.0 2023-08-16 22:17:26 +02:00
cf66d246a9 Set rc3 version #1.1.0 2023-08-16 22:16:06 +02:00
41fe6faa52 Build rc3 version #1.1.0 2023-08-16 22:15:38 +02:00
685c96bb38 Set rc3 version #1.1.0 2023-08-16 22:15:05 +02:00
2c3e5268e4 Merge pull request '1.1.0.rc3' (#343) from 1.1.0.rc3 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#343
Closes #339
Closes #338
Closes #340
Closes #337
Closes #341
2023-08-16 22:13:42 +02:00
2d5ce58612 Fixed complaint command #341 #1.1.0.rc3 2023-08-16 22:12:40 +02:00
fe3d67eff5 Fixed client data #337 #1.1.0.rc3 2023-08-16 21:23:03 +02:00
4cea31fce5 Added achievement validation triggers #340 #1.1.0.rc3 2023-08-16 21:20:14 +02:00
aa2c80ec12 Added feature flag checks #338 #1.1.0.rc3 2023-08-16 21:08:34 +02:00
e283a18def Added logic to check server view permissions #339 #1.1.0.rc3 2023-08-16 20:55:42 +02:00
f5b2bec356 Merge pull request '1.1.0.rc2' (#342) from 1.1.0.rc2 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#342
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-08-16 19:09:04 +02:00
c2b32996fd Made form transient #1.1.0.rc2 2023-08-16 18:47:13 +02:00
195566a2b6 Fixed restart command #1.1.0.rc2 2023-08-16 18:38:16 +02:00
073c318671 Fixed achievement server filter #1.1.0.rc2 2023-08-16 18:19:21 +02:00
caeec47b7c Fixed shutdown procedure async problems #1.1.0.rc2 2023-08-16 18:04:40 +02:00
44f6b36347 Fixed achievement_service #1.1.0.rc2 2023-08-16 16:55:29 +02:00
4e32414f48 Set frontend rc2 #1.1.0.rc2 2023-08-16 16:39:39 +02:00
573c9c999e Build rc2 #1.1.0.rc2 2023-08-16 16:38:54 +02:00
825fcff82d Set rc2 version #1.1.0.rc2 2023-08-16 16:38:37 +02:00
a95bf7bc6c Fixed reference errors #1.1.0.rc2 2023-08-16 16:37:49 +02:00
0bc3bff58e Merge pull request '1.1.0.rc1' (#336) from 1.1.0.rc1 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#336
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-08-16 16:29:28 +02:00
c3b86fab6b Fixed config #1.1.0.rc1 2023-08-16 09:31:20 +02:00
906602134e Upated config #1.1.0.rc1 2023-08-16 08:59:10 +02:00
30791f7529 Fixed config loading #1.1.0.rc1 2023-08-16 08:47:48 +02:00
456d939b47 Fixed config loading #1.1.0.rc1 2023-08-16 08:30:12 +02:00
1f47636e8d Build rc1 #1.1.0.rc1 2023-08-16 07:55:32 +02:00
f4acc2669d Build rc1 #1.1.0.rc1 2023-08-16 07:43:23 +02:00
46b5757fd1 Merge pull request '#334_feature_flags_in_wi' (#335) from #334_feature_flags_in_wi into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#335
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #334
2023-08-16 00:03:44 +02:00
1cd75cd78f Hide feature flags in server config for non technicians #334 2023-08-16 00:02:04 +02:00
f7f3fea7a7 Improved feature flag defaults #334 2023-08-15 23:44:42 +02:00
5dd2000f10 Improved feature flag for server handling #334 2023-08-15 23:41:45 +02:00
1b2bb85b37 Improved feature flag for server handling #334 2023-08-15 23:24:29 +02:00
113b188a40 Reload config after change #334 2023-08-15 22:16:44 +02:00
e549341196 Secured config endpoints #334 2023-08-15 21:50:37 +02:00
8a0d939147 Added feature flags to server config #334 2023-08-15 20:50:11 +02:00
4b57d7f102 Added feature flags config to technician settings #334 2023-08-15 20:29:44 +02:00
02e0c72a80 Merge pull request '#79_hide_table_columns' (#333) from #79_hide_table_columns into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#333
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #79
2023-08-15 12:50:15 +02:00
bfc9979961 Added option to hide columns to all tables #79 2023-08-15 12:16:24 +02:00
8d76f79732 Hide members columns #79 2023-08-15 08:14:45 +02:00
4add293186 Added base logic to hide columns & added hide columns to levels #79 2023-08-14 23:33:02 +02:00
1fc5ef76a6 Merge pull request 'Added filter to mass_move channel_from #296' (#332) from #296_mass_move_filter into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#332
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #296
2023-08-14 21:01:03 +02:00
e6c9959381 Added filter to mass_move channel_from #296 2023-08-14 20:57:59 +02:00
328 changed files with 6397 additions and 1522 deletions

17
.gitea/issue_template.md Normal file
View File

@@ -0,0 +1,17 @@
#### Beschreibung
Als Produktmanager muss ich nun dieses Ticket ausfüllen.
#### Aktuelles Verhalten
* Was macht die Software aktuell?
#### Gewünschtes Verhalten
* Was soll die Software anders machen?
#### Akzeptanzkriterien
* Was muss erfüllt sein, damit das Ticket als abgeschlossen angesehen werden kann?
#### Anmerkungen

View File

@@ -0,0 +1,7 @@
#### Ticket Referenz:
#1
#### Gibt es etwas beim Review zu beachten?
Nein

View File

@@ -0,0 +1,65 @@
name: Deploy dev on push
run-name: Deploy dev on push
on:
push:
branches:
- dev
jobs:
on-push-deploy_sh-edraft:
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: catthehacker/ubuntu:act-latest
steps:
- name: Setup Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10.12"
- run: python -v
- name: Setup docker
uses: https://github.com/papodaca/install-docker-action@main
- run: docker -v
- name: Clone Repository
uses: https://github.com/actions/checkout@v3
- name: Shutdown stack
run: docker stack rm kdb_staging
- name: Prepare bot build
run: |
cd kdb-bot
pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
cpl i
- name: Build docker bot
run: |
cd kdb-bot
docker image prune -f
cpl docker-build
- name: Setup node
uses: https://github.com/actions/setup-node@v3
- name: Prepare web build
run: |
cd kdb-web
npm install -g ts-node
npm i
- name: Build docker web
run: |
cd kdb-web
docker image prune -f
npm run docker-build
- name: Deploy Stack to sh-edraft.de
uses: https://github.com/kgierke/portainer-stack-deployment@v1
with:
portainer-url: "https://docker.sh-edraft.de"
portainer-username: "gitea_job"
portainer-password: "${{ secrets.docker_job }}"
portainer-endpoint: 2
name: kdb_staging
file: ./docker-compose.staging.yml
variables: '{}'

View File

@@ -0,0 +1,65 @@
name: Deploy dev on push
run-name: Deploy dev on push
on:
push:
branches:
- master
jobs:
on-push-deploy_sh-edraft:
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: catthehacker/ubuntu:act-latest
steps:
- name: Setup Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10.12"
- run: python -v
- name: Setup docker
uses: https://github.com/papodaca/install-docker-action@main
- run: docker -v
- name: Clone Repository
uses: https://github.com/actions/checkout@v3
- name: Shutdown stack
run: docker stack rm kdb_prod
- name: Prepare bot build
run: |
cd kdb-bot
pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
cpl i
- name: Build docker bot
run: |
cd kdb-bot
docker image prune -f
cpl docker-build
- name: Setup node
uses: https://github.com/actions/setup-node@v3
- name: Prepare web build
run: |
cd kdb-web
npm install -g ts-node
npm i
- name: Build docker web
run: |
cd kdb-web
docker image prune -f
npm run docker-build
- name: Deploy Stack to sh-edraft.de
uses: https://github.com/kgierke/portainer-stack-deployment@v1
with:
portainer-url: "https://docker.sh-edraft.de"
portainer-username: "gitea_job"
portainer-password: "${{ secrets.docker_job }}"
portainer-endpoint: 2
name: kdb_prod
file: ./docker-compose.yml
variables: '{}'

View File

@@ -0,0 +1,87 @@
version: "3.9"
volumes:
kdb_db_staging_1:
services:
kdb_bot_staging_1:
image: sh-edraft.de/kdb-bot:1.1.10
restart: unless-stopped
depends_on:
- kdb_db_staging_1
networks:
- kdb_test
- reverse_proxy
volumes:
- /opt/kdb/staging/bot/config:/app/bot/config
- /opt/kdb/staging/bot/api_config:/app/bot_api/config
- /opt/kdb/staging/bot/logs:/app/bot/logs
environment:
KDB_ENVIRONMENT: "staging"
KDB_TOKEN: "OTk4MTU5ODAyMzkzOTY0NTk0.G-csct.b2Y-HxvLz0SfFLl5HpukROv2GaiWhcMABbMzYE"
KDB_PREFIX: "!kt "
command: bash /app/bot/bot -stage
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
reservations:
cpus: "0.5"
memory: 1024M
kdb_web_staging_1:
image: sh-edraft.de/kdb-web:1.1.10
depends_on:
- kdb_bot_staging_1
networks:
- kdb_test
- reverse_proxy
volumes:
- /opt/kdb/staging/web/config.json:/usr/share/nginx/html/assets/config.json
environment:
BOT_CONTAINER_NAME: "kdb_bot_staging_1"
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
limits:
cpus: "0.4"
memory: 400M
reservations:
cpus: "0.1"
memory: 20M
kdb_db_staging_1:
image: mysql:latest
command: mysqld --default-authentication-plugin=mysql_native_password --log_bin_trust_function_creators=1
networks:
- kdb_test
environment:
MYSQL_ROOT_PASSWORD: "kd_kdb"
MYSQL_USER: "kd_kdb"
MYSQL_PASSWORD: "~qELxjvtjJ3r7yg4PZr5!,V}d.{TC4rg"
MYSQL_DATABASE: "kd_kdb"
ports:
- "3308:3306"
volumes:
- kdb_db_staging_1:/var/lib/mysql
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
reservations:
cpus: "0.1"
memory: 150M
networks:
reverse_proxy:
external: true
kdb_test:
driver: overlay
attachable: true

87
docker-compose.yml Normal file
View File

@@ -0,0 +1,87 @@
version: "3.9"
volumes:
kdb_db_prod_1:
services:
kdb_bot_prod_1:
image: sh-edraft.de/kdb-bot:1.1.10
restart: unless-stopped
depends_on:
- kdb_db_prod_1
networks:
- kdb_prod
- reverse_proxy
volumes:
- /opt/kdb/production/bot/config:/app/bot/config
- /opt/kdb/production/bot/api_config:/app/bot_api/config
- /opt/kdb/production/bot/logs:/app/bot/logs
environment:
KDB_ENVIRONMENT: "production"
KDB_TOKEN: "OTk4MTU5NTEyNDYyNzA4Nzg2.Gx0hSB.Ouq2dfRKxLBJvHfEq8OrFBHVUF24AQrVf55coM"
KDB_PREFIX: "!k "
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
reservations:
cpus: "0.5"
memory: 1024M
kdb_web_prod_1:
image: sh-edraft.de/kdb-web:1.1.10
depends_on:
- kdb_bot_prod_1
networks:
- kdb_prod
- reverse_proxy
volumes:
- /opt/kdb/production/web/config.json:/usr/share/nginx/html/assets/config.json
environment:
BOT_CONTAINER_NAME: "kdb_bot_prod_1"
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
limits:
cpus: "0.4"
memory: 400M
reservations:
cpus: "0.1"
memory: 20M
kdb_db_prod_1:
image: mysql:latest
command: mysqld --default-authentication-plugin=mysql_native_password --log_bin_trust_function_creators=1
networks:
- kdb_prod
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "kd_kdb"
MYSQL_USER: "kd_kdb"
MYSQL_PASSWORD: ",2#MzfN4J=7r(q,Tz3npDkCR§>VE&}7T"
MYSQL_DATABASE: "kd_kdb"
ports:
- "3307:3306"
volumes:
- kdb_db_prod_1:/var/lib/mysql
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
reservations:
cpus: "0.1"
memory: 150M
networks:
reverse_proxy:
external: true
kdb_prod:
driver: overlay
attachable: true

View File

@@ -11,11 +11,12 @@
"auto-role": "src/modules/auto_role/auto-role.json",
"base": "src/modules/base/base.json",
"boot-log": "src/modules/boot_log/boot-log.json",
"config": "src/modules/config/modules/config.json",
"config": "src/modules/config/config.json",
"database": "src/modules/database/database.json",
"level": "src/modules/level/level.json",
"permission": "src/modules/permission/permission.json",
"technician": "src/modules/technician/technician.json",
"short-role-name": "src/modules/short_role_name/short-role-name.json",
"checks": "tools/checks/checks.json",
"get-version": "tools/get_version/get-version.json",
"post-build": "tools/post_build/post-build.json",
@@ -35,7 +36,7 @@
"stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;",
"pre-dev": "cpl build",
"dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;",
"docker-build": "cpl build $ARGS; docker build -t kdb-bot/kdb-bot:$(cpl gv) .;",
"docker-build": "cpl build $ARGS; docker build -t sh-edraft.de/kdb-bot:$(cpl gv) .;",
"dc-up": "docker-compose up -d",
"dc-down": "docker-compose down",
"docker": "cpl dc-down; cpl docker-build; cpl dc-up;"

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -71,7 +71,7 @@ class Application(DiscordBotApplicationABC):
self._api.stop()
await self._bot.close()
self._data_integrity.check_data_integrity(is_for_shutdown=True)
await self._data_integrity.check_data_integrity(is_for_shutdown=True)
self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}")
except Exception as e:
self._logger.error(__name__, "stop failed", e)

View File

@@ -3,13 +3,13 @@
"Name": "bot",
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "7"
"Minor": "1",
"Micro": "10"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",
"Description": "Keksdose bot",
"LongDescription": "Discord bot for the Keksdose discord Server",
"Description": "sh-edraft.de Discord bot",
"LongDescription": "Discord bot for customers of sh-edraft.de",
"URL": "https://www.sh-edraft.de",
"CopyrightDate": "2022 - 2023",
"CopyrightName": "sh-edraft.de",
@@ -30,7 +30,8 @@
"requests-oauthlib==1.3.1",
"icmplib==3.0.3",
"ariadne==0.20.1",
"cryptography==41.0.2"
"cryptography==41.0.2",
"discord>=2.3.2"
],
"DevDependencies": [
"cpl-cli==2023.4.0.post3",
@@ -59,12 +60,15 @@
"../bot_core/bot-core.json",
"../bot_data/bot-data.json",
"../bot_graphql/bot-graphql.json",
"../modules/achievements/achievements.json",
"../modules/auto_role/auto-role.json",
"../modules/base/base.json",
"../modules/boot_log/boot-log.json",
"../modules/config/config.json",
"../modules/database/database.json",
"../modules/level/level.json",
"../modules/permission/permission.json",
"../modules/short_role_name/short-role-name.json",
"../modules/technician/technician.json"
]
}

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot.extension"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -31,10 +31,10 @@ class Program:
.use_extension(StartupDiscordExtension)
.use_extension(StartupModuleExtension)
.use_extension(StartupMigrationExtension)
.use_extension(DatabaseExtension)
.use_extension(ConfigExtension)
.use_extension(InitBotExtension)
.use_extension(BootLogExtension)
.use_extension(DatabaseExtension)
.use_extension(AppApiExtension)
.use_extension(CoreExtension)
.use_startup(Startup)

View File

@@ -13,6 +13,7 @@ from modules.config.config_module import ConfigModule
from modules.database.database_module import DatabaseModule
from modules.level.level_module import LevelModule
from modules.permission.permission_module import PermissionModule
from modules.short_role_name.short_role_name_module import ShortRoleNameModule
from modules.technician.technician_module import TechnicianModule
@@ -25,8 +26,8 @@ class ModuleList:
[
CoreModule, # has to be first!
DataModule,
ConfigModule, # has to be before db check
DatabaseModule,
ConfigModule, # has be to after db check
GraphQLModule,
PermissionModule,
AutoRoleModule,
@@ -35,6 +36,7 @@ class ModuleList:
ApiModule,
TechnicianModule,
AchievementsModule,
ShortRoleNameModule,
# has to be last!
BootLogModule,
CoreExtensionModule,

View File

@@ -9,11 +9,16 @@ 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.config_feature_flags_migration import ConfigFeatureFlagsMigration
from bot_data.migration.config_migration import ConfigMigration
from bot_data.migration.db_history_migration import DBHistoryMigration
from bot_data.migration.default_role_migration import DefaultRoleMigration
from bot_data.migration.fix_updates_migration import FixUpdatesMigration
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
from bot_data.migration.short_role_name_migration import ShortRoleNameMigration
from bot_data.migration.short_role_name_only_highest_migration import ShortRoleNameOnlyHighestMigration
from bot_data.migration.stats_migration import StatsMigration
from bot_data.migration.user_joined_game_server_migration import UserJoinedGameServerMigration
from bot_data.migration.user_message_count_per_hour_migration import (
@@ -46,3 +51,8 @@ class StartupMigrationExtension(StartupExtensionABC):
services.add_transient(MigrationABC, DBHistoryMigration) # 06.03.2023 #246 - 1.0.0
services.add_transient(MigrationABC, AchievementsMigration) # 14.06.2023 #268 - 1.1.0
services.add_transient(MigrationABC, ConfigMigration) # 19.07.2023 #127 - 1.1.0
services.add_transient(MigrationABC, ConfigFeatureFlagsMigration) # 15.08.2023 #334 - 1.1.0
services.add_transient(MigrationABC, DefaultRoleMigration) # 24.09.2023 #360 - 1.1.3
services.add_transient(MigrationABC, ShortRoleNameMigration) # 28.09.2023 #378 - 1.1.7
services.add_transient(MigrationABC, FixUpdatesMigration) # 28.09.2023 #378 - 1.1.7
services.add_transient(MigrationABC, ShortRoleNameOnlyHighestMigration) # 02.10.2023 #391 - 1.1.9

View File

@@ -82,6 +82,7 @@
"unexpected_quote_error": "Fehler: Unerwarteter Fehler beim Anführungszeichen!",
"user_input_error": "Fehler: Eingabefehler!"
},
"feature_not_activated": "Diese Funktion ist deaktiviert",
"hello_world": "Hallo Welt",
"no_permission_message": "Nein!\nIch höre nicht auf dich ¯\\_(ツ)_/¯",
"not_implemented_yet": "Ey Alter, das kann ich noch nicht...",
@@ -94,10 +95,10 @@
},
"modules": {
"achievements": {
"got_new_achievement": "{} hat die Errungenschaft {} freigeschaltet :D",
"commands": {
"check": "Alles klar, ich schaue eben nach... nom nom"
}
},
"got_new_achievement": "{} hat die Errungenschaft {} freigeschaltet :D"
},
"auto_role": {
"add": {
@@ -122,6 +123,9 @@
},
"success": "auto-role {} wurde entfernt :D"
},
"react": {
"success": "Alle Reaktionen wurden hinzugefügt"
},
"rule": {
"add": {
"error": {
@@ -151,33 +155,37 @@
}
},
"base": {
"member_left_message": "{} hat uns leider verlassen :(",
"complaints": {
"title": "Beschwerde einreichen",
"label": "Beschwerde",
"message": "{} hat eine Beschwerde eingereicht:\n{}",
"response": "Danke für deine Beschwerde"
},
"bug": {
"title": "Bug melden",
"label": "Bug",
"message": "{} meldet einen Bug:\n{}",
"response": "Danke für dein Feedback :D"
},
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
"afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
"bug": {
"label": "Bug",
"message": "{} meldet einen Bug:\n{}",
"response": "Danke für dein Feedback :D",
"title": "Bug melden"
},
"complaints": {
"label": "Beschwerde",
"message": "{} hat eine Beschwerde eingereicht:\n{}",
"response": "Danke für deine Beschwerde",
"title": "Beschwerde einreichen"
},
"game_server": {
"add": {
"success": "Gameserver {} wurde hinzugefügt :)"
},
"error": {
"nothing_found": "Keine Gameserver gefunden."
},
"list": {
"title": "Gameserver",
"api_key": "API Key",
"description": "Konfigurierte Gameserver:",
"name": "Name",
"api_key": "API Key"
"title": "Gameserver"
},
"add": {
"success": "Gameserver {} wurde hinzugefügt :)"
"list_members": {
"description": "Konfigurierte Mitglieder:",
"title": "Mitglieder",
"users": "Mitglieder"
},
"remove": {
"success": "Gameserver wurde entfernt :D"
@@ -204,6 +212,7 @@
"moved": "Alle Personen aus {} wurden nach {} verschoben."
},
"member_joined_help_voice_channel": "{} braucht Hilfe, bitte kümmere dich drum :D",
"member_left_message": "{} hat uns leider verlassen :(",
"pong": "Pong",
"presence": {
"changed": "Presence wurde geändert.",
@@ -340,6 +349,9 @@
"moderator": {
"purge_message": "Na gut..., ich lösche alle Nachrichten wenns sein muss."
},
"short_role_name": {
"checked_message": "Die Rollen Kürzel wurden überprüft"
},
"technician": {
"api_key": {
"add": {
@@ -353,7 +365,8 @@
},
"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 :)"
"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 :)",
"synced_message": "Der Sync wurde abgeschlossen."
}
}
}

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -3,8 +3,8 @@
"Name": "bot-api",
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "7"
"Minor": "1",
"Micro": "10"
},
"Author": "",
"AuthorEmail": "",

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.configuration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.controller"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.event"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.exception"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.filter"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -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.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.logging"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.model"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -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.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.route"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.service"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -494,8 +494,13 @@ class AuthService(AuthServiceABC):
added_user = True
db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
if db_user.users.count() == 0:
members.for_each(lambda x: self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, x)))
user_ids = db_user.users.select(lambda x: x.id)
for user in self._users.get_users_by_discord_id(dc_id):
if user.id in user_ids:
continue
self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, user))
if db_user.confirmation_id is not None and not added_user:
raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.transformer"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,6 +1,6 @@
from abc import ABC, abstractmethod
from datetime import datetime
from typing import Callable
from typing import Callable, Union
import discord
from cpl_query.extension import List
@@ -67,3 +67,7 @@ class ClientUtilsABC(ABC):
self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild
):
pass
@abstractmethod
async def check_default_role(self, member: Union[discord.User, discord.Member]):
pass

View File

@@ -3,8 +3,8 @@
"Name": "bot-core",
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "7"
"Minor": "1",
"Micro": "10"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.configuration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -5,19 +5,23 @@ class FeatureFlagsEnum(Enum):
# modules
achievements_module = "AchievementsModule"
api_module = "ApiModule"
admin_module = "AdminModule"
auto_role_module = "AutoRoleModule"
base_module = "BaseModule"
boot_log_module = "BootLogModule"
core_module = "CoreModule"
core_extension_module = "CoreExtensionModule"
config_module = "ConfigModule"
data_module = "DataModule"
database_module = "DatabaseModule"
level_module = "LevelModule"
moderator_module = "ModeratorModule"
permission_module = "PermissionModule"
config_module = "ConfigModule"
short_role_name_module = "ShortRoleNameModule"
# features
api_only = "ApiOnly"
presence = "Presence"
version_in_presence = "VersionInPresence"
game_server = "GameServer"
sync_xp = "SyncXp"
short_role_name = "ShortRoleName"
technician_full_access = "TechnicianFullAccess"

View File

@@ -8,8 +8,7 @@ class FeatureFlagsSettings(ConfigurationModelABC):
# modules
FeatureFlagsEnum.achievements_module.value: False, # 14.06.2023 #268
FeatureFlagsEnum.api_module.value: False, # 13.10.2022 #70
FeatureFlagsEnum.admin_module.value: False, # 02.10.2022 #48
FeatureFlagsEnum.auto_role_module.value: True, # 03.10.2022 #54
FeatureFlagsEnum.auto_role_module.value: False, # 03.10.2022 #54
FeatureFlagsEnum.base_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.boot_log_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.core_module.value: True, # 03.10.2022 #56
@@ -19,10 +18,15 @@ class FeatureFlagsSettings(ConfigurationModelABC):
FeatureFlagsEnum.moderator_module.value: False, # 02.10.2022 #48
FeatureFlagsEnum.permission_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.config_module.value: True, # 19.07.2023 #127
FeatureFlagsEnum.short_role_name_module.value: True, # 28.09.2023 #378
# 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
FeatureFlagsEnum.game_server.value: False, # 25.09.2023 #366
FeatureFlagsEnum.sync_xp.value: False, # 25.09.2023 #366
FeatureFlagsEnum.short_role_name.value: False, # 28.09.2023 #378
FeatureFlagsEnum.technician_full_access.value: False, # 03.10.2023 #393
}
def __init__(self, **kwargs: dict):
@@ -34,6 +38,17 @@ class FeatureFlagsSettings(ConfigurationModelABC):
for flag in [f.value for f in FeatureFlagsEnum]:
self._load_flag(kwargs, FeatureFlagsEnum(flag))
@classmethod
def get_flag_from_dict(cls, flags: dict, key: FeatureFlagsEnum) -> bool:
def get_flag():
if key.value not in cls._flags:
return False
return cls._flags[key.value]
if key.value not in flags:
return get_flag()
return flags[key.value]
def get_flag(self, key: FeatureFlagsEnum) -> bool:
if key.value not in self._flags:
return False

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -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.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -11,6 +11,7 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.events.core_on_ready_event import CoreOnReadyEvent
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
from bot_core.service.client_utils_service import ClientUtilsService
from bot_core.service.config_service import ConfigService
from bot_core.service.data_integrity_service import DataIntegrityService
from bot_core.service.message_service import MessageService
@@ -23,6 +24,7 @@ class CoreModule(ModuleABC):
pass
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(ConfigService)
services.add_transient(MessageServiceABC, MessageService)
services.add_transient(ClientUtilsABC, ClientUtilsService)
services.add_transient(DataIntegrityService)

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.events"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.exception"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.helper"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.logging"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.pipes"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.service"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import Callable
from typing import Callable, Union
import discord
from cpl_core.configuration import ConfigurationABC
@@ -218,3 +218,20 @@ class ClientUtilsService(ClientUtilsABC):
f"Cannot add reaction {rule.emoji_name} to message: {discord_message_id}",
e,
)
async def check_default_role(self, member: Union[discord.User, discord.Member]):
try:
server = self._servers.get_server_by_discord_id(member.guild.id)
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{server.discord_id}")
if settings.default_role_id is None:
return
default_role = member.guild.get_role(settings.default_role_id)
if default_role is None or default_role in member.roles:
return
await member.add_roles(default_role)
except Exception as e:
self._logger.error(__name__, f"Cannot check for default role for member {member.id}", e)

View File

@@ -0,0 +1,40 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
from bot_data.model.server import Server
from bot_data.model.technician_config import TechnicianConfig
from bot_data.service.server_config_seeder import ServerConfigSeeder
class ConfigService:
def __init__(
self,
config: ConfigurationABC,
services: ServiceProviderABC,
technician_config_repo: TechnicianConfigRepositoryABC,
server_config_repo: ServerConfigRepositoryABC,
server_seeder: ServerConfigSeeder,
):
self._config = config
self._services = services
self._technician_config_repo = technician_config_repo
self._server_config_repo = server_config_repo
self._server_seeder = server_seeder
def reload_technician_config(self):
technician_config = self._technician_config_repo.get_technician_config()
self._config.add_configuration(TechnicianConfig, technician_config)
self._config.add_configuration(FeatureFlagsSettings, FeatureFlagsSettings(**technician_config.feature_flags))
async def reload_server_config(self, server: Server):
if not self._server_config_repo.does_server_config_exists(server.id):
await self._server_seeder.seed()
server_config = self._server_config_repo.get_server_config_by_server(server.id)
self._config.add_configuration(
f"{type(server_config).__name__}_{server_config.server.discord_id}", server_config
)

View File

@@ -6,6 +6,7 @@ from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC
from cpl_discord.service import DiscordBotServiceABC
from bot_core.abc.client_utils_abc import ClientUtilsABC
from bot_core.logging.database_logger import DatabaseLogger
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
from bot_data.abc.client_repository_abc import ClientRepositoryABC
@@ -23,7 +24,6 @@ from bot_data.model.server_config import ServerConfig
from bot_data.model.user import User
from bot_data.model.user_joined_server import UserJoinedServer
from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel
from bot_data.service.seeder_service import SeederService
from bot_data.service.user_repository_service import ServerRepositoryABC
from modules.achievements.achievement_service import AchievementService
@@ -33,7 +33,6 @@ class DataIntegrityService:
self,
config: ConfigurationABC,
logger: DatabaseLogger,
seeder: SeederService,
bot: DiscordBotServiceABC,
db_context: DatabaseContextABC,
server_repo: ServerRepositoryABC,
@@ -44,12 +43,12 @@ class DataIntegrityService:
user_joins_vc: UserJoinedVoiceChannelRepositoryABC,
user_joined_gs: UserJoinedGameServerRepositoryABC,
achievement_service: AchievementService,
client_utils: ClientUtilsABC,
dtp: DateTimeOffsetPipe,
):
self._config = config
self._logger = logger
self._seeder = seeder
self._bot = bot
self._db_context = db_context
self._servers = server_repo
@@ -60,6 +59,7 @@ class DataIntegrityService:
self._user_joins_vc = user_joins_vc
self._user_joined_gs = user_joined_gs
self._achievements = achievement_service
self._client_utils = client_utils
self._dtp = dtp
self._is_for_shutdown = False
@@ -291,7 +291,7 @@ class DataIntegrityService:
self._user_joins_vc.update_user_joined_voice_channel(join)
if self._is_for_shutdown:
user.xp = round(join.time * settings.xp_per_ontime_hour)
user.xp += round(join.time * settings.xp_per_ontime_hour)
self._users.update_user(user)
self._db_context.save_changes()
@@ -356,14 +356,14 @@ class DataIntegrityService:
self._user_joined_gs.update_user_joined_game_server(join)
if self._is_for_shutdown:
user.xp = round(join.time * settings.xp_per_ontime_hour)
user.xp += round(join.time * settings.xp_per_ontime_hour)
self._users.update_user(user)
self._db_context.save_changes()
except Exception as e:
self._logger.error(__name__, f"Cannot get UserJoinedGameServer", e)
def _check_for_user_achievements(self):
async def _check_for_user_achievements(self):
self._logger.debug(__name__, f"Start checking UserGotAchievement table")
for guild in self._bot.guilds:
@@ -380,12 +380,18 @@ class DataIntegrityService:
if user is None:
self._logger.fatal(__name__, f"User not found in database: {member.id}")
self._bot.loop.create_task(self._achievements.validate_achievements_for_user(user))
await self._achievements.validate_achievements_for_user(user)
def check_data_integrity(self, is_for_shutdown=False):
async def _check_default_role(self):
for guild in self._bot.guilds:
for member in guild.members:
await self._client_utils.check_default_role(member)
async def check_data_integrity(self, is_for_shutdown=False):
if is_for_shutdown != self._is_for_shutdown:
self._is_for_shutdown = is_for_shutdown
await self._check_default_role()
self._check_known_users()
self._check_servers()
self._check_clients()
@@ -393,4 +399,4 @@ class DataIntegrityService:
self._check_user_joins()
self._check_user_joins_vc()
self._check_user_joined_gs()
self._check_for_user_achievements()
await self._check_for_user_achievements()

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -14,6 +14,10 @@ class AuthUserRepositoryABC(ABC):
def __init__(self):
pass
@abstractmethod
def get_auth_user_relation_ids(self, auth_user: AuthUser) -> List[int]:
pass
@abstractmethod
def get_all_auth_users(self) -> List[AuthUser]:
pass

View File

@@ -23,7 +23,7 @@ class GameServerRepositoryABC(ABC):
pass
@abstractmethod
def get_game_server_by_api_key_id(self, id: int) -> GameServer:
def get_game_servers_by_api_key_id(self, id: int) -> List[GameServer]:
pass
@abstractmethod

View File

@@ -1,13 +1,20 @@
import os
from abc import ABC, abstractmethod
from cpl_core.dependency_injection import ServiceProviderABC
from mysql.connector.cursor import MySQLCursorBuffered
from bot_data.db_context import DBContext
class MigrationABC(ABC):
name = None
prio = 0
@abstractmethod
def __init__(self):
pass
@ServiceProviderABC.inject
def __init__(self, db: DBContext):
self._cursor: MySQLCursorBuffered = db.cursor
@abstractmethod
def upgrade(self):
@@ -16,3 +23,10 @@ class MigrationABC(ABC):
@abstractmethod
def downgrade(self):
pass
def _exec(self, self_file: str, file: str):
path = f"{os.path.dirname(os.path.realpath(self_file))}/db_history_scripts"
sql = open(f"{path}/{file}").read()
for statement in sql.split("\n\n"):
self._cursor.execute(statement + ";")

View File

@@ -0,0 +1,39 @@
from abc import ABC, abstractmethod
from cpl_query.extension import List
from bot_data.model.short_role_name import ShortRoleName
class ShortRoleNameRepositoryABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def get_short_role_names(self) -> List[ShortRoleName]:
pass
@abstractmethod
def get_short_role_name_by_id(self, id: int) -> ShortRoleName:
pass
@abstractmethod
def find_short_role_names_by_role_id(self, role_id: int) -> List[ShortRoleName]:
pass
@abstractmethod
def get_short_role_names_by_server_id(self, id: int) -> List[ShortRoleName]:
pass
@abstractmethod
def add_short_role_name(self, short_role_name: ShortRoleName):
pass
@abstractmethod
def update_short_role_name(self, short_role_name: ShortRoleName):
pass
@abstractmethod
def delete_short_role_name(self, short_role_name: ShortRoleName):
pass

View File

@@ -14,6 +14,10 @@ class UserGameIdentRepositoryABC(ABC):
def get_user_game_idents(self) -> List[UserGameIdent]:
pass
@abstractmethod
def get_user_game_idents_by_game_server_id(self, id: int) -> List[UserGameIdent]:
pass
@abstractmethod
def get_user_game_ident_by_id(self, id: int) -> UserGameIdent:
pass

View File

@@ -3,8 +3,8 @@
"Name": "bot-data",
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "7"
"Minor": "1",
"Micro": "10"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -16,6 +16,7 @@ from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
from bot_data.abc.level_repository_abc import LevelRepositoryABC
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.short_role_name_repository_abc import ShortRoleNameRepositoryABC
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC
from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC
@@ -41,6 +42,7 @@ from bot_data.service.seeder_service import SeederService
from bot_data.service.server_config_repository_service import ServerConfigRepositoryService
from bot_data.service.server_config_seeder import ServerConfigSeeder
from bot_data.service.server_repository_service import ServerRepositoryService
from bot_data.service.short_role_name_repository_service import ShortRoleNameRepositoryService
from bot_data.service.technician_config_repository_service import TechnicianConfigRepositoryService
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
from bot_data.service.user_game_ident_repository_service import UserGameIdentRepositoryService
@@ -89,6 +91,7 @@ class DataModule(ModuleABC):
services.add_transient(AchievementRepositoryABC, AchievementRepositoryService)
services.add_transient(TechnicianConfigRepositoryABC, TechnicianConfigRepositoryService)
services.add_transient(ServerConfigRepositoryABC, ServerConfigRepositoryService)
services.add_transient(ShortRoleNameRepositoryABC, ShortRoleNameRepositoryService)
services.add_transient(SeederService)
services.add_transient(DataSeederABC, TechnicianConfigSeeder)

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data.migration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -0,0 +1,29 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class ConfigFeatureFlagsMigration(MigrationABC):
name = "1.1.0_ConfigFeatureFlagsMigration"
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("""ALTER TABLE CFG_Technician ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER CacheMaxMessages;""")
)
self._cursor.execute(
str("""ALTER TABLE CFG_Server ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER LoginMessageChannelId;""")
)
def downgrade(self):
self._logger.debug(__name__, "Running downgrade")
self._cursor.execute("ALTER TABLE CFG_Technician DROP COLUMN FeatureFlags;")
self._cursor.execute("ALTER TABLE CFG_Server DROP COLUMN FeatureFlags;")

View File

@@ -1,5 +1,3 @@
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
@@ -12,26 +10,18 @@ class ConfigMigration(MigrationABC):
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._server_upgrade()
self._technician_upgrade()
self._exec("config/server.sql")
self._exec("config/server_afk_channels.sql")
self._exec("config/server_team_roles.sql")
self._exec("config/technician.sql")
self._exec("config/technician_ids.sql")
self._exec("config/technician_ping_urls.sql")
self._exec(__file__, "config/server.sql")
self._exec(__file__, "config/server_afk_channels.sql")
self._exec(__file__, "config/server_team_roles.sql")
self._exec(__file__, "config/technician.sql")
self._exec(__file__, "config/technician_ids.sql")
self._exec(__file__, "config/technician_ping_urls.sql")
def _server_upgrade(self):
self._cursor.execute(
@@ -143,6 +133,8 @@ class ConfigMigration(MigrationABC):
def downgrade(self):
self._logger.debug(__name__, "Running downgrade")
self._server_downgrade()
self._technician_downgrade()
def _server_downgrade(self):
self._cursor.execute("DROP TABLE `CFG_Server`;")

View File

@@ -1,5 +1,3 @@
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
@@ -15,33 +13,26 @@ class DBHistoryMigration(MigrationABC):
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._exec(__file__, "api_keys.sql")
self._exec(__file__, "auth_users.sql")
self._exec(__file__, "auth_user_users_relation.sql")
self._exec(__file__, "auto_role_rules.sql")
self._exec(__file__, "auto_roles.sql")
self._exec(__file__, "clients.sql")
self._exec(__file__, "game_servers.sql")
self._exec(__file__, "known_users.sql")
self._exec(__file__, "levels.sql")
self._exec(__file__, "servers.sql")
self._exec(__file__, "user_game_idents.sql")
self._exec(__file__, "user_joined_game_servers.sql")
self._exec(__file__, "user_joined_servers.sql")
self._exec(__file__, "user_joined_voice_channel.sql")
self._exec(__file__, "user_message_count_per_hour.sql")
self._exec(__file__, "users.sql")
self._exec(__file__, "user_warnings.sql")
self._logger.debug(__name__, "Finished history upgrade")

View File

@@ -1,23 +1,26 @@
CREATE TABLE IF NOT EXISTS `CFG_ServerHistory`
(
`Id` BIGINT(20) NOT NULL,
`MessageDeleteTimer` BIGINT NOT NULL DEFAULT 6,
`NotificationChatId` BIGINT NOT NULL,
`MaxVoiceStateHours` BIGINT NOT NULL DEFAULT 6,
`XpPerMessage` BIGINT NOT NULL DEFAULT 1,
`XpPerReaction` BIGINT NOT NULL DEFAULT 1,
`MaxMessageXpPerHour` BIGINT NOT NULL DEFAULT 20,
`XpPerOntimeHour` BIGINT NOT NULL DEFAULT 10,
`XpPerEventParticipation` BIGINT NOT NULL DEFAULT 10,
`XpPerAchievement` BIGINT NOT NULL DEFAULT 10,
`AFKCommandChannelId` BIGINT NOT NULL,
`HelpVoiceChannelId` BIGINT NOT NULL,
`TeamChannelId` BIGINT NOT NULL,
`LoginMessageChannelId` BIGINT NOT NULL,
`ServerId` BIGINT NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
`Id` BIGINT(20) NOT NULL,
`MessageDeleteTimer` BIGINT NOT NULL DEFAULT 6,
`NotificationChatId` BIGINT NOT NULL,
`MaxVoiceStateHours` BIGINT NOT NULL DEFAULT 6,
`XpPerMessage` BIGINT NOT NULL DEFAULT 1,
`XpPerReaction` BIGINT NOT NULL DEFAULT 1,
`MaxMessageXpPerHour` BIGINT NOT NULL DEFAULT 20,
`XpPerOntimeHour` BIGINT NOT NULL DEFAULT 10,
`XpPerEventParticipation` BIGINT NOT NULL DEFAULT 10,
`XpPerAchievement` BIGINT NOT NULL DEFAULT 10,
`AFKCommandChannelId` BIGINT NOT NULL,
`HelpVoiceChannelId` BIGINT NOT NULL,
`TeamChannelId` BIGINT NOT NULL,
`LoginMessageChannelId` BIGINT NOT NULL,
`DefaultRoleId` BIGINT NULL,
`ShortRoleNameSetOnlyHighest` BOOLEAN NOT NULL DEFAULT FALSE,
`FeatureFlags` JSON NULL DEFAULT ('{}'),
`ServerId` BIGINT NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_CFG_ServerUpdate`;
@@ -27,44 +30,46 @@ CREATE TRIGGER `TR_CFG_ServerUpdate`
ON `CFG_Server`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_ServerHistory` (
`Id`,
`MessageDeleteTimer`,
`NotificationChatId`,
`MaxVoiceStateHours`,
`XpPerMessage`,
`XpPerReaction`,
`MaxMessageXpPerHour`,
`XpPerOntimeHour`,
`XpPerEventParticipation`,
`XpPerAchievement`,
`AFKCommandChannelId`,
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`ServerId`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.MessageDeleteTimer,
OLD.NotificationChatId,
OLD.MaxVoiceStateHours,
OLD.XpPerMessage,
OLD.XpPerReaction,
OLD.MaxMessageXpPerHour,
OLD.XpPerOntimeHour,
OLD.XpPerEventParticipation,
OLD.XpPerAchievement,
OLD.AFKCommandChannelId,
OLD.HelpVoiceChannelId,
OLD.TeamChannelId,
OLD.LoginMessageChannelId,
OLD.ServerId,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
INSERT INTO `CFG_ServerHistory` (`Id`,
`MessageDeleteTimer`,
`NotificationChatId`,
`MaxVoiceStateHours`,
`XpPerMessage`,
`XpPerReaction`,
`MaxMessageXpPerHour`,
`XpPerOntimeHour`,
`XpPerEventParticipation`,
`XpPerAchievement`,
`AFKCommandChannelId`,
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`DefaultRoleId`,
`ShortRoleNameSetOnlyHighest`,
`FeatureFlags`,
`ServerId`,
`DateFrom`,
`DateTo`)
VALUES (OLD.Id,
OLD.MessageDeleteTimer,
OLD.NotificationChatId,
OLD.MaxVoiceStateHours,
OLD.XpPerMessage,
OLD.XpPerReaction,
OLD.MaxMessageXpPerHour,
OLD.XpPerOntimeHour,
OLD.XpPerEventParticipation,
OLD.XpPerAchievement,
OLD.AFKCommandChannelId,
OLD.HelpVoiceChannelId,
OLD.TeamChannelId,
OLD.LoginMessageChannelId,
OLD.DefaultRoleId,
OLD.ShortRoleNameSetOnlyHighest,
OLD.FeatureFlags,
OLD.ServerId,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END;
DROP TRIGGER IF EXISTS `TR_CFG_ServerDelete`;
@@ -74,44 +79,46 @@ CREATE TRIGGER `TR_CFG_ServerDelete`
ON `CFG_Server`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_ServerHistory` (
`Id`,
`MessageDeleteTimer`,
`NotificationChatId`,
`MaxVoiceStateHours`,
`XpPerMessage`,
`XpPerReaction`,
`MaxMessageXpPerHour`,
`XpPerOntimeHour`,
`XpPerEventParticipation`,
`XpPerAchievement`,
`AFKCommandChannelId`,
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`ServerId`,
`Deleted`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.MessageDeleteTimer,
OLD.NotificationChatId,
OLD.MaxVoiceStateHours,
OLD.XpPerMessage,
OLD.XpPerReaction,
OLD.MaxMessageXpPerHour,
OLD.XpPerOntimeHour,
OLD.XpPerEventParticipation,
OLD.XpPerAchievement,
OLD.AFKCommandChannelId,
OLD.HelpVoiceChannelId,
OLD.TeamChannelId,
OLD.LoginMessageChannelId,
OLD.ServerId,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
INSERT INTO `CFG_ServerHistory` (`Id`,
`MessageDeleteTimer`,
`NotificationChatId`,
`MaxVoiceStateHours`,
`XpPerMessage`,
`XpPerReaction`,
`MaxMessageXpPerHour`,
`XpPerOntimeHour`,
`XpPerEventParticipation`,
`XpPerAchievement`,
`AFKCommandChannelId`,
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`DefaultRoleId`,
`ShortRoleNameSetOnlyHighest`,
`ServerId`,
`FeatureFlags`,
`Deleted`,
`DateFrom`,
`DateTo`)
VALUES (OLD.Id,
OLD.MessageDeleteTimer,
OLD.NotificationChatId,
OLD.MaxVoiceStateHours,
OLD.XpPerMessage,
OLD.XpPerReaction,
OLD.MaxMessageXpPerHour,
OLD.XpPerOntimeHour,
OLD.XpPerEventParticipation,
OLD.XpPerAchievement,
OLD.AFKCommandChannelId,
OLD.HelpVoiceChannelId,
OLD.TeamChannelId,
OLD.LoginMessageChannelId,
OLD.DefaultRoleId,
OLD.ShortRoleNameSetOnlyHighest,
OLD.FeatureFlags,
OLD.ServerId,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END;

View File

@@ -1,13 +1,14 @@
CREATE TABLE IF NOT EXISTS `CFG_TechnicianHistory`
(
`Id` BIGINT(20) NOT NULL,
`Id` BIGINT(20) NOT NULL,
`HelpCommandReferenceUrl` VARCHAR(255) NOT NULL,
`WaitForRestart` BIGINT NOT NULL DEFAULT 8,
`WaitForShutdown` BIGINT NOT NULL DEFAULT 8,
`CacheMaxMessages` BIGINT NOT NULL DEFAULT 1000000,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
`WaitForRestart` BIGINT NOT NULL DEFAULT 8,
`WaitForShutdown` BIGINT NOT NULL DEFAULT 8,
`CacheMaxMessages` BIGINT NOT NULL DEFAULT 1000000,
`FeatureFlags` JSON NULL DEFAULT ('{}'),
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianUpdate`;
@@ -17,24 +18,22 @@ CREATE TRIGGER `TR_CFG_TechnicianUpdate`
ON `CFG_Technician`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_TechnicianHistory` (
`Id`,
`HelpCommandReferenceUrl`,
`WaitForRestart`,
`WaitForShutdown`,
`CacheMaxMessages`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.HelpCommandReferenceUrl,
OLD.WaitForRestart,
OLD.WaitForShutdown,
OLD.CacheMaxMessages,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
INSERT INTO `CFG_TechnicianHistory` (`Id`,
`HelpCommandReferenceUrl`,
`WaitForRestart`,
`WaitForShutdown`,
`CacheMaxMessages`,
`FeatureFlags`,
`DateFrom`,
`DateTo`)
VALUES (OLD.Id,
OLD.HelpCommandReferenceUrl,
OLD.WaitForRestart,
OLD.WaitForShutdown,
OLD.CacheMaxMessages,
OLD.FeatureFlags,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END;
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianDelete`;
@@ -44,24 +43,22 @@ CREATE TRIGGER `TR_CFG_TechnicianDelete`
ON `CFG_Technician`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_TechnicianHistory` (
`Id`,
`HelpCommandReferenceUrl`,
`WaitForRestart`,
`WaitForShutdown`,
`CacheMaxMessages`,
`Deleted`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.HelpCommandReferenceUrl,
OLD.WaitForRestart,
OLD.WaitForShutdown,
OLD.CacheMaxMessages,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
INSERT INTO `CFG_TechnicianHistory` (`Id`,
`HelpCommandReferenceUrl`,
`WaitForRestart`,
`WaitForShutdown`,
`CacheMaxMessages`,
`FeatureFlags`,
`Deleted`,
`DateFrom`,
`DateTo`)
VALUES (OLD.Id,
OLD.HelpCommandReferenceUrl,
OLD.WaitForRestart,
OLD.WaitForShutdown,
OLD.CacheMaxMessages,
OLD.FeatureFlags,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END;

View File

@@ -0,0 +1,38 @@
CREATE TABLE IF NOT EXISTS `ShortRoleNamesHistory`
(
`Id` BIGINT(20) NOT NULL,
`ShortName` VARCHAR(64) DEFAULT NULL,
`DiscordRoleId` BIGINT(20) NOT NULL,
`Position` ENUM ('Before', 'After') 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_ShortRoleNamesUpdate`;
CREATE TRIGGER `TR_ShortRoleNamesUpdate`
AFTER UPDATE
ON `ShortRoleNames`
FOR EACH ROW
BEGIN
INSERT INTO `ShortRoleNamesHistory` (`Id`, `ShortName`, `DiscordRoleId`, `Position`, `ServerId`, `DateFrom`,
`DateTo`)
VALUES (OLD.Id, OLD.ShortName, OLD.DiscordRoleId, OLD.Position, OLD.ServerId, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END;
DROP TRIGGER IF EXISTS `TR_ShortRoleNamesDelete`;
CREATE TRIGGER `TR_ShortRoleNamesDelete`
AFTER DELETE
ON `ShortRoleNames`
FOR EACH ROW
BEGIN
INSERT INTO `ShortRoleNamesHistory` (`Id`, `ShortName`, `DiscordRoleId`, `Position`, `ServerId`, `Deleted`,
`DateFrom`,
`DateTo`)
VALUES (OLD.Id, OLD.ShortName, OLD.DiscordRoleId, OLD.Position, OLD.ServerId, TRUE, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END;

View File

@@ -0,0 +1,34 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class DefaultRoleMigration(MigrationABC):
name = "1.1.3_DefaultRoleMigration"
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"""
ALTER TABLE CFG_Server
ADD DefaultRoleId BIGINT NULL AFTER LoginMessageChannelId;
"""
)
)
def downgrade(self):
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_Server DROP COLUMN DefaultRoleId;
"""
)
)

View File

@@ -0,0 +1,51 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class FixUpdatesMigration(MigrationABC):
name = "1.1.7_FixUpdatesMigration"
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"""
ALTER TABLE CFG_ServerHistory
ADD DefaultRoleId BIGINT NULL AFTER LoginMessageChannelId;
"""
)
)
self._cursor.execute(
str(
"""ALTER TABLE CFG_TechnicianHistory ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER CacheMaxMessages;"""
)
)
self._cursor.execute(
str(
"""ALTER TABLE CFG_ServerHistory ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER LoginMessageChannelId;"""
)
)
self._exec(__file__, "config/server.sql")
self._exec(__file__, "config/technician.sql")
def downgrade(self):
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_ServerHistory DROP COLUMN DefaultRoleId;
"""
)
)
self._cursor.execute("ALTER TABLE CFG_TechnicianHistory DROP COLUMN FeatureFlags;")
self._cursor.execute("ALTER TABLE CFG_ServerHistory DROP COLUMN FeatureFlags;")

View File

@@ -0,0 +1,40 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class ShortRoleNameMigration(MigrationABC):
name = "1.1.7_ShortRoleNameMigration"
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 `ShortRoleNames` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`ShortName` VARCHAR(255) NOT NULL,
`DiscordRoleId` BIGINT NOT NULL,
`Position` ENUM('before', 'after') NOT NULL,
`ServerId` BIGINT,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`),
FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
);
"""
)
)
self._exec(__file__, "short_rule_names.sql")
def downgrade(self):
self._cursor.execute("DROP TABLE `ShortRoleNames`;")
self._cursor.execute("DROP TABLE `ShortRoleNamesHistory`;")

View File

@@ -0,0 +1,51 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class ShortRoleNameOnlyHighestMigration(MigrationABC):
name = "1.1.9_ShortRoleNameOnlyHighestMigration"
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"""
ALTER TABLE CFG_Server
ADD ShortRoleNameSetOnlyHighest BOOLEAN NOT NULL DEFAULT FALSE AFTER DefaultRoleId;
"""
)
)
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_ServerHistory
ADD ShortRoleNameSetOnlyHighest BOOLEAN NOT NULL DEFAULT FALSE AFTER DefaultRoleId;
"""
)
)
self._exec(__file__, "config/server.sql")
def downgrade(self):
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_Server DROP COLUMN ShortRoleNameSetOnlyHighest;
"""
)
)
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_ServerHistory DROP COLUMN ShortRoleNameSetOnlyHighest;
"""
)
)

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data.model"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -108,6 +108,15 @@ class Achievement(TableABC):
"""
)
@staticmethod
def get_select_by_server_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `Achievements`
WHERE `ServerId` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(

View File

@@ -1,9 +1,13 @@
import json
from datetime import datetime
from typing import Optional
from cpl_core.configuration import ConfigurationModelABC
from cpl_core.database import TableABC
from cpl_query.extension import List
from discord import Guild
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_data.model.server import Server
from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
@@ -24,6 +28,9 @@ class ServerConfig(TableABC, ConfigurationModelABC):
help_voice_channel_id: int,
team_channel_id: int,
login_message_channel_id: int,
default_role_id: Optional[int],
short_role_name_only_set_highest_role: bool,
feature_flags: dict[FeatureFlagsEnum],
server: Server,
afk_channel_ids: List[int],
team_role_ids: List[ServerTeamRoleIdsConfig],
@@ -45,6 +52,10 @@ class ServerConfig(TableABC, ConfigurationModelABC):
self._help_voice_channel_id = help_voice_channel_id
self._team_channel_id = team_channel_id
self._login_message_channel_id = login_message_channel_id
self._default_role_id = default_role_id
self._short_role_name_only_set_highest_role = short_role_name_only_set_highest_role
self._feature_flags = feature_flags
self._server = server
self._afk_channel_ids = afk_channel_ids
self._team_role_ids = team_role_ids
@@ -53,6 +64,30 @@ class ServerConfig(TableABC, ConfigurationModelABC):
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
@staticmethod
def new(guild: Guild, server: Server) -> "ServerConfig":
return ServerConfig(
6,
guild.system_channel.id,
6,
1,
1,
20,
10,
10,
10,
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
None,
False,
{},
server,
List(int),
List(int),
)
@property
def id(self) -> int:
return self._id
@@ -161,6 +196,30 @@ class ServerConfig(TableABC, ConfigurationModelABC):
def login_message_channel_id(self, value: int):
self._login_message_channel_id = value
@property
def default_role_id(self) -> int:
return self._default_role_id
@default_role_id.setter
def default_role_id(self, value: int):
self._default_role_id = value
@property
def short_role_name_only_set_highest_role(self) -> bool:
return self._short_role_name_only_set_highest_role
@short_role_name_only_set_highest_role.setter
def short_role_name_only_set_highest_role(self, value: bool):
self._short_role_name_only_set_highest_role = value
@property
def feature_flags(self) -> dict[FeatureFlagsEnum]:
return self._feature_flags
@feature_flags.setter
def feature_flags(self, value: dict[FeatureFlagsEnum]):
self._feature_flags = value
@property
def afk_channel_ids(self) -> List[int]:
return self._afk_channel_ids
@@ -225,6 +284,9 @@ class ServerConfig(TableABC, ConfigurationModelABC):
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`DefaultRoleId`,
`ShortRoleNameSetOnlyHighest`,
`FeatureFlags`,
`ServerId`
) VALUES (
{self._message_delete_timer},
@@ -240,6 +302,9 @@ class ServerConfig(TableABC, ConfigurationModelABC):
{self._help_voice_channel_id},
{self._team_channel_id},
{self._login_message_channel_id},
{"NULL" if self._default_role_id is None else self._default_role_id},
{self._short_role_name_only_set_highest_role},
'{json.dumps(self._feature_flags)}',
{self._server.id}
);
"""
@@ -263,6 +328,9 @@ class ServerConfig(TableABC, ConfigurationModelABC):
`HelpVoiceChannelId` = {self._help_voice_channel_id},
`TeamChannelId` = {self._team_channel_id},
`LoginMessageChannelId` = {self._login_message_channel_id},
`DefaultRoleId` = {"NULL" if self._default_role_id is None else self._default_role_id},
`ShortRoleNameSetOnlyHighest` = {self._short_role_name_only_set_highest_role},
`FeatureFlags` = '{json.dumps(self._feature_flags)}',
`ServerId` = {self._server.id}
WHERE `Id` = {self._id};
"""

View File

@@ -17,6 +17,9 @@ class ServerConfigHistory(HistoryTableABC):
help_voice_channel_id: int,
team_channel_id: int,
login_message_channel_id: int,
default_role_id: int,
short_role_name_only_set_highest_role: bool,
feature_flags: dict[str],
server_id: int,
deleted: bool,
date_from: str,
@@ -39,6 +42,10 @@ class ServerConfigHistory(HistoryTableABC):
self._help_voice_channel_id = help_voice_channel_id
self._team_channel_id = team_channel_id
self._login_message_channel_id = login_message_channel_id
self._default_role_id = default_role_id
self._short_role_name_only_set_highest_role = short_role_name_only_set_highest_role
self._feature_flags = feature_flags
self._server_id = server_id
self._deleted = deleted
@@ -97,6 +104,18 @@ class ServerConfigHistory(HistoryTableABC):
def login_message_channel_id(self) -> int:
return self._login_message_channel_id
@property
def default_role_id(self) -> int:
return self._default_role_id
@property
def short_role_name_only_set_highest_role(self) -> bool:
return self._short_role_name_only_set_highest_role
@property
def feature_flags(self) -> dict[str]:
return self._feature_flags
@property
def server_id(self) -> int:
return self._server_id

View File

@@ -0,0 +1,140 @@
from datetime import datetime
from cpl_core.database import TableABC
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.model.server import Server
from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum
class ShortRoleName(TableABC):
def __init__(
self,
short_name: str,
discord_role_id: int,
position: ShortRoleNamePositionEnum,
server: Server,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._short_name = short_name
self._discord_role_id = discord_role_id
self._position = position
self._server = server
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 short_name(self) -> str:
return self._short_name
@short_name.setter
def short_name(self, value: str):
self._short_name = value
@property
def role_id(self) -> int:
return self._discord_role_id
@role_id.setter
def role_id(self, value: int):
self._discord_role_id = value
@property
@ServiceProviderABC.inject
def role_name(self, bot: DiscordBotServiceABC) -> str:
guild = bot.get_guild(self._server.discord_id)
return guild.get_role(self.role_id).name
@property
def position(self) -> ShortRoleNamePositionEnum:
return self._position
@position.setter
def position(self, value: ShortRoleNamePositionEnum):
self._position = value
@property
def server(self) -> Server:
return self._server
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `ShortRoleNames`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `ShortRoleNames`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_role_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `ShortRoleNames`
WHERE `DiscordRoleId` = {id};
"""
)
@staticmethod
def get_select_by_server_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `ShortRoleNames`
WHERE `ServerId` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `ShortRoleNames` (
`ShortName`, `DiscordRoleId`, `Position`, `ServerId`
) VALUES (
'{self._short_name}',
{self._discord_role_id},
'{self._position}',
{self._server.id}
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `ShortRoleNames`
SET `ShortName` = '{self._short_name}',
`DiscordRoleId` = {self._discord_role_id},
`Position` = '{self._position}',
`ServerId` = {self._server.id}
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `ShortRoleNames`
WHERE `Id` = {self._id};
"""
)

View File

@@ -0,0 +1,56 @@
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.abc.history_table_abc import HistoryTableABC
class ShortRoleNameHistory(HistoryTableABC):
def __init__(
self,
name: str,
discord_role_id: int,
server: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._id = id
self._name = name
self._discord_role_id = discord_role_id
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
@name.setter
def name(self, value: str):
self._name = value
@property
def role_id(self) -> int:
return self._discord_role_id
@role_id.setter
def role_id(self, value: int):
self._discord_role_id = value
@property
@ServiceProviderABC.inject
def role_name(self, bot: DiscordBotServiceABC) -> str:
guild = bot.get_guild(self._server.discord_id)
return guild.get_role(self.role_id).name
@property
def server(self) -> int:
return self._server

View File

@@ -0,0 +1,6 @@
from enum import Enum
class ShortRoleNamePositionEnum(Enum):
before = "before"
after = "after"

View File

@@ -1,9 +1,12 @@
import json
from datetime import datetime
from cpl_core.configuration import ConfigurationModelABC
from cpl_core.database import TableABC
from cpl_query.extension import List
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
class TechnicianConfig(TableABC, ConfigurationModelABC):
def __init__(
@@ -12,6 +15,7 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
wait_for_restart: int,
wait_for_shutdown: int,
cache_max_messages: int,
feature_flags: dict[FeatureFlagsEnum],
technician_ids: List[int],
ping_urls: List[str],
created_at: datetime = None,
@@ -23,6 +27,7 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
self._wait_for_restart = wait_for_restart
self._wait_for_shutdown = wait_for_shutdown
self._cache_max_messages = cache_max_messages
self._feature_flags = feature_flags
self._technician_ids = technician_ids
self._ping_urls = ping_urls
@@ -66,6 +71,14 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
def cache_max_messages(self, value: int):
self._cache_max_messages = value
@property
def feature_flags(self) -> dict[FeatureFlagsEnum]:
return self._feature_flags
@feature_flags.setter
def feature_flags(self, value: dict[FeatureFlagsEnum]):
self._feature_flags = value
@property
def technician_ids(self) -> List[int]:
return self._technician_ids
@@ -104,12 +117,13 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
return str(
f"""
INSERT INTO `CFG_Technician` (
`HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`
`HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`, `FeatureFlags`
) VALUES (
'{self._help_command_reference_url}',
{self._wait_for_restart},
{self._wait_for_shutdown},
{self._cache_max_messages}
{self._cache_max_messages},
'{json.dumps(self._feature_flags)}'
);
"""
)
@@ -122,7 +136,8 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
SET `HelpCommandReferenceUrl` = '{self._help_command_reference_url}',
`WaitForRestart` = {self._wait_for_restart},
`WaitForShutdown` = {self._wait_for_shutdown},
`CacheMaxMessages` = {self._cache_max_messages}
`CacheMaxMessages` = {self._cache_max_messages},
`FeatureFlags` = '{json.dumps(self._feature_flags)}'
WHERE `Id` = {self._id};
"""
)

View File

@@ -15,8 +15,8 @@ class User(TableABC):
self,
dc_id: int,
xp: int,
message_count: int,
reaction_count: int,
message_count: int,
server: Optional[Server],
created_at: datetime = None,
modified_at: datetime = None,
@@ -25,8 +25,8 @@ class User(TableABC):
self._user_id = id
self._discord_id = dc_id
self._xp = xp
self._message_count = message_count
self._reaction_count = reaction_count
self._message_count = message_count
self._server = server
TableABC.__init__(self)

View File

@@ -49,6 +49,15 @@ class UserGameIdent(TableABC):
"""
)
@staticmethod
def get_select_by_game_server_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `UserGameIdents`
WHERE `GameServerId` = {id};
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(

View File

@@ -39,7 +39,10 @@ class UserJoinedVoiceChannel(TableABC):
@property
@ServiceProviderABC.inject
def channel_name(self, bot: DiscordBotServiceABC) -> str:
return bot.get_channel(self.channel_id).name
channel = bot.get_channel(self.channel_id)
if channel is None:
return ""
return channel.name
@property
def user(self) -> User:

View File

@@ -41,7 +41,10 @@ class UserJoinedVoiceChannelHistory(HistoryTableABC):
@property
@ServiceProviderABC.inject
def channel_name(self, bot: DiscordBotServiceABC) -> str:
return bot.get_channel(self.channel_id).name
channel = bot.get_channel(self.channel_id)
if channel is None:
return ""
return channel.name
@property
def user(self) -> int:

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data.service"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -65,8 +65,8 @@ class AchievementRepositoryService(AchievementRepositoryABC):
def get_achievements_by_server_id(self, server_id: int) -> List[Achievement]:
achievements = List(Achievement)
self._logger.trace(__name__, f"Send SQL command: {Achievement.get_select_by_id_string(server_id)}")
results = self._context.select(Achievement.get_select_all_string())
self._logger.trace(__name__, f"Send SQL command: {Achievement.get_select_by_server_id_string(server_id)}")
results = self._context.select(Achievement.get_select_by_server_id_string(server_id))
for result in results:
self._logger.trace(__name__, f"Get user with id {result[0]}")
achievements.append(self._from_result(result))

View File

@@ -1,3 +1,4 @@
from enum import Enum
from typing import Optional
from cpl_core.database.context import DatabaseContextABC
@@ -49,13 +50,7 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
auth_user_id=self._get_value_from_result(au_result[0]),
)
self._logger.trace(
__name__,
f"Send SQL command: {auth_user.get_select_user_id_from_relations()}",
)
results = self._context.select(auth_user.get_select_user_id_from_relations())
for result in results:
user_id = self._get_value_from_result(result[0])
for user_id in self.get_auth_user_relation_ids(auth_user):
if user_id is None:
continue
@@ -64,6 +59,19 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
return auth_user
def get_auth_user_relation_ids(self, auth_user: AuthUser) -> List[int]:
self._logger.trace(
__name__,
f"Send SQL command: {auth_user.get_select_user_id_from_relations()}",
)
relation_ids = List(int)
results = self._context.select(auth_user.get_select_user_id_from_relations())
for result in results:
self._logger.trace(__name__, f"Got auth user relation with id {result[0]}")
relation_ids.append(result[0])
return relation_ids
def get_all_auth_users(self) -> List[AuthUser]:
users = List(AuthUser)
self._logger.trace(__name__, f"Send SQL command: {AuthUser.get_select_all_string()}")
@@ -100,9 +108,17 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
):
crit_sort_direction = criteria.sort_direction.lower()
if crit_sort_direction == "desc" or crit_sort_direction == "descending":
query = query.order_by_descending(lambda x: getattr(x, criteria.sort_column))
query = query.order_by_descending(
lambda x: getattr(x, criteria.sort_column)
if not isinstance(getattr(x, criteria.sort_column), Enum)
else getattr(x, criteria.sort_column).value
)
else:
query = query.order_by(lambda x: getattr(x, criteria.sort_column))
query = query.order_by(
lambda x: getattr(x, criteria.sort_column)
if not isinstance(getattr(x, criteria.sort_column), Enum)
else getattr(x, criteria.sort_column).value
)
result = FilteredResult()
result.total_count = query.count()

View File

@@ -68,13 +68,16 @@ class GameServerRepositoryService(GameServerRepositoryABC):
result = self._context.select(GameServer.get_select_by_id_string(id))[0]
return self._from_result(result)
def get_game_server_by_api_key_id(self, id: int) -> GameServer:
def get_game_servers_by_api_key_id(self, id: int) -> List[GameServer]:
self._logger.trace(
__name__,
f"Send SQL command: {GameServer.get_select_by_api_key_id_string(id)}",
)
result = self._context.select(GameServer.get_select_by_api_key_id_string(id))[0]
return self._from_result(result)
game_servers = List(GameServer)
results = self._context.select(GameServer.get_select_by_api_key_id_string(id))
for result in results:
game_servers.append(self._from_result(result))
return game_servers
def add_game_server(self, game_server: GameServer):
self._logger.trace(__name__, f"Send SQL command: {game_server.insert_string}")

View File

@@ -1,3 +1,5 @@
import json
from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List
@@ -62,23 +64,26 @@ class ServerConfigRepositoryService(ServerConfigRepositoryABC):
result[11],
result[12],
result[13],
self._servers.get_server_by_id(result[14]),
self._get_afk_channel_ids(result[14]),
self._get_team_role_ids(result[14]),
result[14],
result[15],
result[16],
json.loads(result[16]),
self._servers.get_server_by_id(result[17]),
self._get_afk_channel_ids(result[17]),
self._get_team_role_ids(result[17]),
result[18],
result[19],
id=result[0],
)
def does_server_config_exists(self, server_id: int) -> bool:
self._logger.trace(__name__, f"Send SQL command: {ServerConfig.get_select_by_id_string(server_id)}")
result = self._context.select(ServerConfig.get_select_by_id_string(server_id))
self._logger.trace(__name__, f"Send SQL command: {ServerConfig.get_select_by_server_id_string(server_id)}")
result = self._context.select(ServerConfig.get_select_by_server_id_string(server_id))
return len(result) > 0
def get_server_config_by_server(self, server_id: int) -> ServerConfig:
self._logger.trace(__name__, f"Send SQL command: {ServerConfig.get_select_by_id_string(server_id)}")
result = self._context.select(ServerConfig.get_select_by_id_string(server_id))[0]
self._logger.trace(__name__, f"Send SQL command: {ServerConfig.get_select_by_server_id_string(server_id)}")
result = self._context.select(ServerConfig.get_select_by_server_id_string(server_id))[0]
return self._from_result(result)

View File

@@ -34,29 +34,12 @@ class ServerConfigSeeder(DataSeederABC):
if self._server_config.does_server_config_exists(server.id):
continue
config = ServerConfig(
6,
guild.system_channel.id,
6,
1,
1,
20,
10,
10,
10,
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
server,
[],
[],
)
config = ServerConfig.new(guild, server)
self._server_config.add_server_config(config)
self._db.save_changes()
self._logger.debug(__name__, "Seeded technician config")
self._logger.debug(__name__, "Seeded server config")
except Exception as e:
self._logger.error(__name__, f"Seeding technician config failed", e)
self._logger.error(__name__, f"Seeding server config failed", e)

View File

@@ -0,0 +1,95 @@
from typing import Optional
from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.short_role_name_repository_abc import ShortRoleNameRepositoryABC
from bot_data.model.short_role_name import ShortRoleName
from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum
class ShortRoleNameRepositoryService(ShortRoleNameRepositoryABC):
def __init__(
self,
logger: DatabaseLogger,
db_context: DatabaseContextABC,
servers: ServerRepositoryABC,
):
self._logger = logger
self._context = db_context
self._servers = servers
ShortRoleNameRepositoryABC.__init__(self)
@staticmethod
def _get_value_from_result(value: any) -> Optional[any]:
if isinstance(value, str) and "NULL" in value:
return None
return value
def _short_role_name_from_result(self, sql_result: tuple) -> ShortRoleName:
return ShortRoleName(
self._get_value_from_result(sql_result[1]), # name
int(self._get_value_from_result(sql_result[2])), # role_id
ShortRoleNamePositionEnum(self._get_value_from_result(sql_result[3])), # position
self._servers.get_server_by_id(sql_result[4]), # server
self._get_value_from_result(sql_result[5]), # created_at
self._get_value_from_result(sql_result[6]), # modified_at
id=self._get_value_from_result(sql_result[0]), # id
)
def get_short_role_names(self) -> List[ShortRoleName]:
short_role_names = List(ShortRoleName)
self._logger.trace(__name__, f"Send SQL command: {ShortRoleName.get_select_all_string()}")
results = self._context.select(ShortRoleName.get_select_all_string())
for result in results:
self._logger.trace(__name__, f"Get short_role_name with id {result[0]}")
short_role_names.append(self._short_role_name_from_result(result))
return short_role_names
def get_short_role_name_by_id(self, id: int) -> ShortRoleName:
self._logger.trace(__name__, f"Send SQL command: {ShortRoleName.get_select_by_id_string(id)}")
result = self._context.select(ShortRoleName.get_select_by_id_string(id))[0]
return self._short_role_name_from_result(result)
def find_short_role_names_by_role_id(self, role_id: int) -> List[ShortRoleName]:
short_role_names = List(ShortRoleName)
self._logger.trace(__name__, f"Send SQL command: {ShortRoleName.get_select_by_role_id_string(role_id)}")
results = self._context.select(ShortRoleName.get_select_by_role_id_string(role_id))
for result in results:
self._logger.trace(__name__, f"Get short_role_name with id {result[0]}")
short_role_names.append(self._short_role_name_from_result(result))
return short_role_names
def get_short_role_names_by_server_id(self, server_id: int) -> List[ShortRoleName]:
short_role_names = List(ShortRoleName)
self._logger.trace(
__name__,
f"Send SQL command: {ShortRoleName.get_select_by_server_id_string(server_id)}",
)
results = self._context.select(ShortRoleName.get_select_by_server_id_string(server_id))
for result in results:
self._logger.trace(__name__, f"Get short_role_name with id {result[0]}")
short_role_names.append(self._short_role_name_from_result(result))
return short_role_names
def add_short_role_name(self, short_role_name: ShortRoleName):
self._logger.trace(__name__, f"Send SQL command: {short_role_name.insert_string}")
self._context.cursor.execute(short_role_name.insert_string)
def update_short_role_name(self, short_role_name: ShortRoleName):
self._logger.trace(__name__, f"Send SQL command: {short_role_name.udpate_string}")
self._context.cursor.execute(short_role_name.udpate_string)
def delete_short_role_name(self, short_role_name: ShortRoleName):
self._logger.trace(__name__, f"Send SQL command: {short_role_name.delete_string}")
self._context.cursor.execute(short_role_name.delete_string)

View File

@@ -1,3 +1,5 @@
import json
from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List
@@ -41,10 +43,11 @@ class TechnicianConfigRepositoryService(TechnicianConfigRepositoryABC):
result[2],
result[3],
result[4],
json.loads(result[5]),
self._get_technician_ids(),
self._get_technician_ping_urls(),
result[5],
result[6],
result[7],
id=result[0],
)

View File

@@ -32,6 +32,7 @@ class TechnicianConfigSeeder(DataSeederABC):
8,
8,
1000000,
{},
List(int, [240160344557879316]),
List(str, ["www.google.com", "www.sh-edraft.de", "www.keksdose-gaming.de"]),
)

View File

@@ -51,6 +51,19 @@ class UserGameIdentRepositoryService(UserGameIdentRepositoryABC):
return joins
def get_user_game_idents_by_game_server_id(self, game_server_id: int) -> List[UserGameIdent]:
joins = List(UserGameIdent)
self._logger.trace(
__name__,
f"Send SQL command: {UserGameIdent.get_select_by_game_server_id_string(game_server_id)}",
)
results = self._context.select(UserGameIdent.get_select_by_game_server_id_string(game_server_id))
for result in results:
self._logger.trace(__name__, f"Get UserGameIdent with id {result[0]}")
joins.append(self._from_result(result))
return joins
def get_user_game_ident_by_id(self, id: int) -> UserGameIdent:
self._logger.trace(
__name__,

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_graphql"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_graphql.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -9,6 +9,8 @@ from cpl_query.extension import List
from bot_api.exception.service_error_code_enum import ServiceErrorCode
from bot_api.exception.service_exception import ServiceException
from bot_api.route.route import Route
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_data.model.achievement import Achievement
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.auth_user import AuthUser
from bot_data.model.auto_role import AutoRole
@@ -17,6 +19,8 @@ from bot_data.model.client import Client
from bot_data.model.known_user import KnownUser
from bot_data.model.level import Level
from bot_data.model.server import Server
from bot_data.model.server_config import ServerConfig
from bot_data.model.short_role_name import ShortRoleName
from bot_data.model.user import User
from bot_data.model.user_joined_game_server import UserJoinedGameServer
from bot_data.model.user_joined_server import UserJoinedServer
@@ -66,13 +70,35 @@ class QueryABC(ObjectType):
self.set_field(f"{name}s", wrapper)
self.set_field(f"{name}Count", lambda *args: wrapper(*args).count())
@ServiceProviderABC.inject
def _can_user_see_element(self, user: AuthUser, element: T, services: ServiceProviderABC) -> bool:
def _can_user_see_element(self, user: AuthUser, element: T) -> bool:
@ServiceProviderABC.inject
def get_services(services: ServiceProviderABC) -> ServiceProviderABC:
return services
services = get_services()
permissions: PermissionService = services.get_service(PermissionService)
bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
if user.auth_role == AuthRoleEnum.admin:
return True
for u in user.users:
guild = bot.get_guild(u.server.discord_id)
if permissions.is_member_technician(guild.get_member(u.discord_id)):
return True
access = False
if type(element) == AutoRole:
if type(element) == Achievement:
element: Achievement = element
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_moderator(member) and u.server.id == element.server.id:
access = True
break
elif type(element) == AutoRole:
element: AutoRole = element
for u in user.users:
u: User = u
@@ -158,6 +184,34 @@ class QueryABC(ObjectType):
access = True
break
elif type(element) == ServerConfig:
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_technician(member):
access = True
break
elif type(element) == ShortRoleName:
element: ShortRoleName = element
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_moderator(member) and u.server.id == element.server.id:
access = True
break
elif type(element) == dict and "key" in element and element["key"] in [e.value for e in FeatureFlagsEnum]:
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_technician(member):
access = True
break
return access
@ServiceProviderABC.inject

View File

@@ -3,8 +3,8 @@
"Name": "bot-data",
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "7"
"Minor": "1",
"Micro": "10"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
"""
bot Keksdose bot
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for the Keksdose discord Server
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_graphql.filter"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.0.7"
__version__ = "1.1.10"
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="7")
version_info = VersionInfo(major="1", minor="1", micro="10")

View File

@@ -0,0 +1,70 @@
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_data.model.short_role_name import ShortRoleName
from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum
from bot_data.model.user import User
from bot_graphql.abc.filter_abc import FilterABC
class ShortRoleNameFilter(FilterABC):
def __init__(self, bot: DiscordBotServiceABC):
FilterABC.__init__(self)
self._bot = bot
self._id = None
self._short_name = None
self._role_id = None
self._role_name = None
self._position = None
self._server = None
def from_dict(self, values: dict):
if "id" in values:
self._id = int(values["id"])
if "shortName" in values:
self._short_name = values["shortName"]
if "roleId" in values:
self._role_id = int(values["roleId"])
if "roleName" in values:
self._role_name = values["roleName"]
if "position" in values:
self._position = ShortRoleNamePositionEnum(values["position"])
if "server" in values:
from bot_graphql.filter.server_filter import ServerFilter
self._server: ServerFilter = self._services.get_service(ServerFilter)
self._server.from_dict(values["server"])
def filter(self, query: List[User]) -> List[User]:
if self._id is not None:
query = query.where(lambda x: x.id == self._id)
if self._short_name is not None:
query = query.where(lambda x: x.short_name == self._short_name or self._short_name in x.short_name)
if self._role_id is not None:
query = query.where(lambda x: x.role_id == self._role_id)
if self._role_name is not None and self._role_id is not None:
def get_role_name(x: ShortRoleName):
guild = self._bot.get_guild(x.server.discord_id)
name = guild.get_role(x.role_id).name
return name == self._role_name or self._role_name in name
query = query.where(get_role_name)
if self._position is not None:
query = query.where(lambda x: x.position.value == self._position.value)
if self._server is not None:
servers = self._server.filter(query.select(lambda x: x.server)).select(lambda x: x.id)
query = query.where(lambda x: x.server.id in servers)
return query

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