Compare commits

...

1298 Commits

Author SHA1 Message Date
9bed89ed60 Fixed level by server id
All checks were successful
Deploy prod on push / pre-build (push) Successful in 10s
Deploy prod on push / build-bot (push) Successful in 4m19s
Deploy prod on push / build-web (push) Successful in 2m49s
Deploy prod on push / deploy (push) Successful in 30s
2024-10-29 18:38:09 +01:00
35fdeb168f Updated docker compose
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 1m59s
Deploy prod on push / build-web (push) Successful in 1m46s
Deploy prod on push / deploy (push) Successful in 22s
2024-09-06 20:50:03 +02:00
e785bddf2e Guild & Level can be null
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy prod on push / build-bot (push) Successful in 3m19s
Deploy prod on push / build-web (push) Successful in 1m58s
Deploy prod on push / deploy (push) Successful in 23s
2024-09-06 19:39:50 +02:00
b361a7b685 Fixed docker
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy prod on push / build-bot (push) Successful in 2m17s
Deploy prod on push / build-web (push) Successful in 1m58s
Deploy prod on push / deploy (push) Successful in 23s
2024-06-08 17:25:15 +02:00
bdd0da38ab Check if guild is None in can user see check
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy prod on push / build-bot (push) Successful in 7m20s
Deploy prod on push / build-web (push) Successful in 2m36s
Deploy prod on push / deploy (push) Successful in 1m29s
2024-02-25 13:42:09 +01:00
179c8a954b Check if guild is None in can user see check
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy prod on push / build-bot (push) Successful in 3m38s
Deploy prod on push / build-web (push) Successful in 2m41s
Deploy prod on push / deploy (push) Successful in 26s
2024-02-25 13:25:14 +01:00
248d47c280 Fixed update level permission by db state on level seeding
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 3m14s
Deploy prod on push / build-web (push) Successful in 1m55s
Deploy prod on push / deploy (push) Successful in 25s
2024-02-12 14:59:36 +01:00
414720f53b Update level permission by db state on level seeding
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy prod on push / build-bot (push) Successful in 3m15s
Deploy prod on push / build-web (push) Successful in 1m54s
Deploy prod on push / deploy (push) Successful in 24s
2024-02-12 14:19:31 +01:00
bb0ff1c560 Check if guild is None
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 3m4s
Deploy prod on push / build-web (push) Successful in 1m45s
Deploy prod on push / deploy (push) Successful in 22s
2024-02-09 08:48:49 +01:00
521a063fca Fixed technician check when not on the server /2
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy prod on push / build-bot (push) Successful in 2m58s
Deploy prod on push / build-web (push) Successful in 1m43s
Deploy prod on push / deploy (push) Successful in 21s
2024-02-09 08:27:58 +01:00
dc5ae365bb Fixed technician check when not on the server
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 3m5s
Deploy prod on push / build-web (push) Successful in 1m46s
Deploy prod on push / deploy (push) Successful in 21s
2024-02-09 08:07:54 +01:00
3c21b68b0c Check user update username
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy staging on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 3m12s
Deploy prod on push / build-web (push) Successful in 1m53s
Deploy staging on push / build-bot (push) Successful in 2m1s
Deploy prod on push / deploy (push) Successful in 23s
Deploy staging on push / build-web (push) Successful in 2m1s
Deploy staging on push / deploy (push) Successful in 22s
2024-02-03 19:21:57 +01:00
df316fd53b Merge pull request 'Use db pools' (#470) from staging into master
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 2m3s
Deploy prod on push / build-web (push) Successful in 1m49s
Deploy prod on push / deploy (push) Successful in 23s
Reviewed-on: #470
2024-02-01 20:30:03 +01:00
0a18f26a51 Merge branch 'master' into staging
All checks were successful
Deploy staging on push / pre-build (push) Successful in 2s
Deploy staging on push / build-bot (push) Successful in 2m4s
Deploy staging on push / build-web (push) Successful in 2m0s
Deploy staging on push / deploy (push) Successful in 22s
2024-02-01 20:29:23 +01:00
995c498e54 Use db pools
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 3m12s
Deploy staging on push / build-web (push) Successful in 1m55s
Deploy staging on push / deploy (push) Successful in 22s
2024-02-01 20:20:05 +01:00
9353fa749c Merge pull request 'staging' (#469) from staging into master
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 2m12s
Deploy prod on push / build-web (push) Successful in 1m53s
Deploy prod on push / deploy (push) Successful in 21s
Reviewed-on: #469
2024-02-01 18:39:49 +01:00
dd4b9182f3 Set version 1.2.7
All checks were successful
Deploy staging on push / pre-build (push) Successful in 2s
Deploy staging on push / build-bot (push) Successful in 3m15s
Deploy staging on push / build-web (push) Successful in 2m10s
Deploy staging on push / deploy (push) Successful in 22s
2024-02-01 18:21:17 +01:00
1fc8d441ad Removed fatal from db error handling & improved web error handling 2024-02-01 18:19:31 +01:00
219fffc344 Fixed user warnings
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 3m7s
Deploy prod on push / build-web (push) Successful in 1m48s
Deploy prod on push / deploy (push) Successful in 21s
2024-01-26 19:20:49 +01:00
fbdac4f57a Fixed user warnings
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 3m1s
Deploy prod on push / build-web (push) Successful in 1m47s
Deploy prod on push / deploy (push) Successful in 21s
2024-01-26 17:02:52 +01:00
dfee6b0568 Merge pull request 'staging' (#468) from staging into master
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy prod on push / build-bot (push) Successful in 1m55s
Deploy prod on push / build-web (push) Successful in 1m44s
Deploy prod on push / deploy (push) Successful in 20s
Reviewed-on: #468
2024-01-26 16:33:29 +01:00
9eb09fa3b2 Fixed configs
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 3m5s
Deploy staging on push / build-web (push) Successful in 1m49s
Deploy staging on push / deploy (push) Successful in 22s
2024-01-26 15:55:46 +01:00
60d81ce18b Resend confirmation mail
Some checks failed
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Failing after 22s
Deploy staging on push / build-web (push) Failing after 21s
Deploy staging on push / deploy (push) Has been skipped
2024-01-26 15:32:01 +01:00
a24fefd3e2 Fixed test mail & delete auth user 2024-01-26 14:03:47 +01:00
8cd5a0d040 Fixed mail 2024-01-26 12:41:26 +01:00
1b8a67e81b Merge pull request 'staging_1.2.6' (#467) from staging_1.2.6 into staging
All checks were successful
Deploy staging on push / pre-build (push) Successful in 3s
Deploy staging on push / build-bot (push) Successful in 3m25s
Deploy staging on push / build-web (push) Successful in 2m9s
Deploy staging on push / deploy (push) Successful in 23s
Reviewed-on: #467
2024-01-26 12:18:03 +01:00
8318dfe988 Fixed user avatar url 2024-01-26 12:16:13 +01:00
7185b087c9 Fixed level page 2024-01-26 12:13:53 +01:00
07fc512633 Made levels & Achievements public 2024-01-26 12:11:20 +01:00
ca5db6d397 Fixed achievement can see element 2024-01-26 11:53:51 +01:00
7888783b6a Fixed registration by discord 2024-01-26 11:46:48 +01:00
31c62b4108 Added missing translations 2024-01-26 11:37:36 +01:00
b0990b626c Fixed third user warning 2024-01-26 11:36:42 +01:00
df9c889c7e Fixed add new user warning 2024-01-26 11:32:42 +01:00
4d386759c0 Improved data import 2024-01-26 11:06:01 +01:00
3683f5f3d1 Set correct version 2024-01-25 19:28:56 +01:00
77f759a9ca Added user warnings to WI 2024-01-25 19:27:45 +01:00
f209e45905 Added level icons 2024-01-25 17:11:48 +01:00
a917803eff Updated config 2024-01-25 16:46:03 +01:00
acfa359eeb Fixed loading scheduled events 2024-01-25 16:45:05 +01:00
baf7b8d7de Merge pull request 'Fixed afk command' (#465) from staging into master
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 1m56s
Deploy prod on push / build-web (push) Successful in 1m52s
Deploy prod on push / deploy (push) Successful in 23s
Reviewed-on: #465
2024-01-13 15:17:01 +01:00
ee69ae58d1 Fixed afk command
All checks were successful
Deploy staging on push / pre-build (push) Successful in 2s
Deploy staging on push / build-bot (push) Successful in 3m21s
Deploy staging on push / build-web (push) Successful in 1m49s
Deploy staging on push / deploy (push) Successful in 23s
2024-01-13 15:16:39 +01:00
bc528f1474 Merge pull request 'staging' (#464) from staging into master
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 1m57s
Deploy prod on push / build-web (push) Successful in 1m49s
Deploy prod on push / deploy (push) Successful in 22s
Reviewed-on: #464
2024-01-13 15:06:06 +01:00
d67ba924dc Merge branch 'master' into staging
All checks were successful
Deploy staging on push / pre-build (push) Successful in 2s
Deploy staging on push / build-bot (push) Successful in 3m6s
Deploy staging on push / build-web (push) Successful in 1m43s
Deploy staging on push / deploy (push) Successful in 24s
2024-01-13 15:00:11 +01:00
e054c04c96 Tried to improve db connection
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 3m3s
Deploy staging on push / build-web (push) Successful in 1m49s
Deploy staging on push / deploy (push) Successful in 23s
2024-01-13 14:51:31 +01:00
c846614274 Set version 1.2.5 2024-01-13 13:36:47 +01:00
83764b3cee Added logic to remove short role name for all members by deleting
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 3m3s
Deploy staging on push / build-web (push) Successful in 1m57s
Deploy staging on push / deploy (push) Successful in 25s
2024-01-13 13:04:52 +01:00
4553490266 Add logic to other users to afk as mod 2024-01-11 20:56:19 +01:00
35aa2574f8 Fixed level order
All checks were successful
Deploy prod on push / pre-build (push) Successful in 2s
Deploy prod on push / build-bot (push) Successful in 3m17s
Deploy prod on push / build-web (push) Successful in 2m2s
Deploy prod on push / deploy (push) Successful in 27s
2023-12-17 11:36:49 +01:00
ccae285b81 Merge pull request 'Removed empty cp' (#463) from staging into master
All checks were successful
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 3m58s
Deploy prod on push / build-web (push) Successful in 2m4s
Deploy prod on push / deploy (push) Successful in 1m1s
Reviewed-on: #463
2023-12-17 01:10:40 +01:00
887a02a7af Removed empty cp
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 4m3s
Deploy staging on push / build-web (push) Successful in 1m47s
Deploy staging on push / deploy (push) Successful in 1m5s
2023-12-17 01:10:07 +01:00
f484c553b3 Merge pull request 'staging' (#462) from staging into master
Some checks failed
Deploy prod on push / pre-build (push) Successful in 1s
Deploy prod on push / build-bot (push) Successful in 4m4s
Deploy prod on push / build-web (push) Failing after 58s
Deploy prod on push / deploy (push) Has been skipped
Reviewed-on: #462
2023-12-17 01:03:13 +01:00
c5eca69db1 Merge pull request '#460' (#461) from #460 into staging
All checks were successful
Deploy staging on push / pre-build (push) Successful in 2s
Deploy staging on push / build-bot (push) Successful in 3m17s
Deploy staging on push / build-web (push) Successful in 1m54s
Deploy staging on push / deploy (push) Successful in 25s
Reviewed-on: #461
2023-12-15 15:40:12 +01:00
d1a04c537c Set correct frontend version #460 2023-12-15 15:39:14 +01:00
72715aac62 Added frontend implementation #460 2023-12-15 15:38:38 +01:00
e516def7ef Added reset member after rejoin setting to gql #460 2023-12-15 15:20:39 +01:00
f1f5954dfc Added reset member after rejoin setting to backend [untested] #460 2023-12-15 13:42:49 +01:00
266dacb301 Fixed deps
All checks were successful
Deploy staging on push / pre-build (push) Successful in 2s
Deploy staging on push / build-bot (push) Successful in 3m12s
Deploy staging on push / build-web (push) Successful in 2m1s
Deploy staging on push / deploy (push) Successful in 26s
Deploy dev on push / pre-build (push) Successful in 2s
Deploy dev on push / build-bot (push) Successful in 1m55s
Deploy dev on push / build-web (push) Successful in 1m46s
Deploy dev on push / deploy (push) Successful in 23s
2023-12-13 12:11:09 +01:00
280cd9827d shutdown correct stack
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 2m1s
Deploy staging on push / build-web (push) Successful in 1m57s
Deploy staging on push / deploy (push) Successful in 22s
2023-12-13 11:59:21 +01:00
36998470e8 Try filtering scheduled events
All checks were successful
Deploy staging on push / pre-build (push) Successful in 2s
Deploy staging on push / build-bot (push) Successful in 3m0s
Deploy staging on push / build-web (push) Successful in 2m7s
Deploy staging on push / deploy (push) Successful in 24s
2023-12-13 11:25:51 +01:00
53c6bf4208 Merge pull request 'Added gmod support #277' (#459) from #277 into staging
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 3m8s
Deploy staging on push / build-web (push) Successful in 1m47s
Deploy staging on push / deploy (push) Successful in 24s
Reviewed-on: #459
2023-12-12 11:49:43 +01:00
4e80e3ccb7 Added gmod support #277 2023-12-11 21:34:38 +01:00
ba173a6743 Improved xp knob #409
All checks were successful
Deploy staging on push / pre-build (push) Successful in 2s
Deploy staging on push / build-bot (push) Successful in 3m4s
Deploy staging on push / build-web (push) Successful in 1m56s
Deploy staging on push / deploy (push) Successful in 26s
2023-12-10 19:50:44 +01:00
84ff2a8a9b Fixed update user #455 2023-12-10 19:18:20 +01:00
13bc38fea8 Updated profile #409 2023-12-10 19:00:00 +01:00
dfdf0555d7 Added feature flag check for scheduled events #455
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 3m6s
Deploy staging on push / build-web (push) Successful in 1m57s
Deploy staging on push / deploy (push) Successful in 28s
2023-12-10 17:08:26 +01:00
39299eb11b Made watchers transient
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 3m46s
Deploy staging on push / build-web (push) Successful in 2m5s
Deploy staging on push / deploy (push) Successful in 28s
2023-12-10 13:13:24 +01:00
dfb6751bf9 Set event watcher loop from 12 to 3 hours
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 2m52s
Deploy staging on push / build-web (push) Successful in 1m53s
Deploy staging on push / deploy (push) Successful in 32s
2023-12-10 11:18:30 +01:00
4a75635a55 Fixed actions
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 1m47s
Deploy staging on push / build-web (push) Successful in 1m42s
Deploy staging on push / deploy (push) Successful in 22s
2023-12-09 22:48:37 +01:00
f6b2739394 Merge pull request 'Fixed actions' (#458) from dev into staging
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 1m52s
Deploy staging on push / build-web (push) Successful in 1m44s
Deploy staging on push / deploy (push) Successful in 23s
Reviewed-on: #458
2023-12-09 22:38:35 +01:00
36d2605655 Merge branch 'staging' into dev
All checks were successful
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 1m53s
Deploy dev on push / build-web (push) Successful in 1m47s
Deploy dev on push / deploy (push) Successful in 21s
2023-12-09 22:38:16 +01:00
af891fa588 Fixed actions
All checks were successful
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 1m51s
Deploy dev on push / build-web (push) Successful in 1m50s
Deploy dev on push / deploy (push) Successful in 23s
2023-12-09 22:33:14 +01:00
af348b85a4 Merge pull request 'dev into staging' (#457) from dev into staging
All checks were successful
Deploy staging on push / pre-build (push) Successful in 1s
Deploy staging on push / build-bot (push) Successful in 1m46s
Deploy staging on push / build-web (push) Successful in 1m44s
Deploy staging on push / deploy (push) Successful in 27s
Reviewed-on: #457
2023-12-09 22:23:06 +01:00
7ed621a25b Fixed actions
All checks were successful
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 1m52s
Deploy dev on push / build-web (push) Successful in 1m41s
Deploy dev on push / deploy (push) Successful in 21s
2023-12-09 22:17:56 +01:00
013f953a7f Fixed actions
All checks were successful
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 1m53s
Deploy dev on push / build-web (push) Successful in 1m42s
Deploy dev on push / deploy (push) Successful in 23s
2023-12-09 22:10:04 +01:00
4163532696 Fixed actions
All checks were successful
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 1m52s
Deploy dev on push / build-web (push) Successful in 1m57s
Deploy dev on push / deploy (push) Successful in 6s
2023-12-09 22:02:57 +01:00
b6a1172cc1 Fixed actions
All checks were successful
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 2m0s
Deploy dev on push / build-web (push) Successful in 1m47s
Deploy dev on push / deploy (push) Successful in 6s
2023-12-09 21:51:47 +01:00
20bdb6bd98 Updated compose files
All checks were successful
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 2m1s
Deploy dev on push / build-web (push) Successful in 1m42s
Deploy dev on push / deploy (push) Successful in 5s
2023-12-09 21:46:01 +01:00
3f13f65932 Updated other env actions 2023-12-09 21:43:34 +01:00
711e184895 Fixed dev action
All checks were successful
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 1m48s
Deploy dev on push / build-web (push) Successful in 1m53s
Deploy dev on push / deploy (push) Successful in 5s
2023-12-09 21:34:21 +01:00
7e3975f4be Fixed dev action
Some checks failed
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Successful in 2m13s
Deploy dev on push / build-web (push) Successful in 1m43s
Deploy dev on push / deploy (push) Failing after 1s
2023-12-09 21:28:15 +01:00
d4f4f39522 Fixed dev action
Some checks failed
Deploy dev on push / pre-build (push) Successful in 1s
Deploy dev on push / build-bot (push) Failing after 1m55s
Deploy dev on push / build-web (push) Failing after 1m45s
Deploy dev on push / deploy (push) Has been skipped
2023-12-09 21:22:00 +01:00
af9c55e4b1 Updated dev action
Some checks failed
Deploy dev on push / pre-build (push) Successful in 2s
Deploy dev on push / build-bot (push) Failing after 2m3s
Deploy dev on push / build-web (push) Failing after 2m5s
Deploy dev on push / deploy (push) Has been skipped
2023-12-09 21:00:20 +01:00
e3172d6f24 Fixed event logger
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m22s
2023-12-09 14:11:34 +01:00
0706579f62 Fixed set timestamp for scheduled events #456
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m9s
2023-12-09 14:05:35 +01:00
ad3fc94923 Improved logging for event_service
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m13s
2023-12-09 13:58:38 +01:00
69882af0bd Added event logger
Some checks reported warnings
Deploy staging on push / on-push-deploy_sh-edraft (push) Has been cancelled
2023-12-09 13:55:40 +01:00
560c7650bd Merge pull request 'Removed native password & disable ssl' (#454) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m24s
Reviewed-on: #454
2023-12-06 18:28:55 +01:00
b0fb12f841 Removed native password & disable ssl
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 5m13s
2023-12-06 17:59:23 +01:00
18386339b7 Merge pull request 'staging' (#453) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m21s
Reviewed-on: #453
2023-12-04 23:04:29 +01:00
4d980331e2 Merge pull request 'Added user activity score #451' (#452) from dev into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m18s
Reviewed-on: #452
2023-12-04 22:55:03 +01:00
e6667c78c8 Added user activity score #451
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m14s
2023-12-04 22:48:26 +01:00
9976c59302 Fixed permission service
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m42s
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m27s
2023-12-03 16:42:33 +01:00
293c8cd81c Merge pull request 'dev into staging' (#450) from dev into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m34s
Reviewed-on: #450
2023-12-03 16:08:24 +01:00
8f4ea56184 Merge branch 'staging' into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m2s
2023-12-03 16:07:29 +01:00
898e005978 Merge pull request 'Improved ontime loading & added game ontime #446' (#449) from #446 into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m58s
Reviewed-on: #449
2023-12-03 16:06:50 +01:00
db3e6183ba Merge branch 'dev' into #446 2023-12-03 16:06:36 +01:00
0a47393510 Improved ontime loading & added game ontime #446 2023-12-03 16:04:56 +01:00
6c5b514b41 Set new version
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 5m20s
2023-12-03 15:31:29 +01:00
84f994fd58 Merge pull request '#446' (#448) from #446 into dev
Some checks reported warnings
Deploy dev on push / on-push-deploy_sh-edraft (push) Has been cancelled
Reviewed-on: #448
2023-12-03 15:28:07 +01:00
3d21123786 Fixed profile design #446 2023-12-03 15:24:53 +01:00
36887f1bdf Improved feature flag loading in frontend #446 2023-12-03 15:13:20 +01:00
0e4419312b Improved permission loading #446 2023-12-03 15:03:40 +01:00
94732b7227 Improved data integrity service loop #446 2023-12-03 13:14:10 +01:00
4233e089f8 Improved user message per hour check handling #446 2023-12-03 11:59:16 +01:00
db61a764eb Merge pull request 'staging' (#447) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m45s
Reviewed-on: #447
2023-12-02 19:34:22 +01:00
919eef79f6 Merge branch 'master' into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m58s
2023-12-02 19:33:58 +01:00
0aa690b984 Changed normal data collection to list comprehensions p3 #446 2023-12-02 18:16:04 +01:00
b6b9bfabf5 Changed normal data collection to list comprehensions p2 #446 2023-12-02 17:53:23 +01:00
d927ab8fb7 Changed normal data collection to list comprehensions p1 #446 2023-12-02 17:37:50 +01:00
a2dd447dbd Always check scheduled_events after scheduled_event update #410
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m26s
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m33s
2023-12-02 15:32:16 +01:00
8a76b46165 Improved event time loading #410
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 5m12s
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m40s
2023-12-02 15:24:13 +01:00
af3084ad36 Fixed scheduled event end update #410
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m41s
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m39s
2023-12-01 21:04:29 +01:00
285b8bdbe4 Fixed scheduled events #410
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m44s
2023-12-01 20:40:44 +01:00
e2da4f09ee Fixed command
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m50s
2023-12-01 20:02:42 +01:00
4ed99da689 Merge pull request 'dev' (#445) from dev into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m32s
Reviewed-on: #445
2023-12-01 19:55:54 +01:00
bc94d31a8d Added logs cleanup
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m30s
2023-12-01 19:50:18 +01:00
0d3db75190 Improved scheduled_event handling #410
Some checks reported warnings
Deploy dev on push / on-push-deploy_sh-edraft (push) Has been cancelled
2023-12-01 19:06:11 +01:00
090f217f93 Fixed scheduled_events #410
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m37s
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m39s
2023-11-30 17:57:43 +01:00
b98828fce3 Fixed mass move #444 2023-11-30 17:54:31 +01:00
5f8ae787f0 Improved profile voice states & fixed new vs handling
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 5m31s
2023-11-20 09:28:53 +01:00
0c807a7de7 Merge pull request 'dev into staging' (#442) from dev into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m56s
Reviewed-on: #442
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-11-19 14:49:59 +01:00
2dc60acaa6 Merge branch 'staging' into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m45s
2023-11-19 14:42:42 +01:00
29ea96a5e5 Fixed new scheduled event
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 5m4s
2023-11-19 14:35:26 +01:00
026331b397 Merge pull request '#440' (#441) from #440 into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m43s
Reviewed-on: #441
2023-11-19 14:18:54 +01:00
bfe74ad1c5 Fixed frontend version #440 2023-11-19 14:17:47 +01:00
7c8c2bef70 Added flag handling to auth controller #440 2023-11-19 14:11:28 +01:00
4ccb57e6a3 Added feature flag for basic auth stuff #440 2023-11-19 14:01:26 +01:00
c8d3bf780d Merge pull request '#410' (#439) from #410 into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m49s
Reviewed-on: #439
2023-11-19 12:57:42 +01:00
8788b727c5 Some fixes #410 2023-11-19 12:56:55 +01:00
5e9280d972 Fixed loop timer #410 2023-11-19 12:37:20 +01:00
bd856d0143 Added scheduled_event handler #410 2023-11-19 12:32:42 +01:00
da57063b68 Completed frontend #410 2023-11-19 00:31:25 +01:00
171aa63df9 Improved update & add logic #410 2023-11-18 23:10:28 +01:00
74dba4b981 Added add dialog #410 2023-11-18 22:15:18 +01:00
a3ebd07093 Working on add/edit dialog #410 2023-11-15 19:35:20 +01:00
2de5afd648 Rebased & fixed backend #410 2023-11-15 19:35:17 +01:00
e8cc42e155 Added scheduledEvent to gql #410 2023-11-15 19:35:17 +01:00
20e20969e4 Added scheduled event to db #410 2023-11-15 19:35:17 +01:00
802d5478d1 Fixed migration service
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m14s
2023-11-15 19:30:29 +01:00
05f718f3ae Set version 1.2.2
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m11s
2023-11-15 18:18:37 +01:00
7682b966a8 Reformatted
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m11s
2023-11-15 18:05:36 +01:00
7cb4f03554 Merge pull request 'Fixed workspace #428' (#438) from #428 into dev
Some checks reported warnings
Deploy dev on push / on-push-deploy_sh-edraft (push) Has been cancelled
Reviewed-on: #438
2023-11-15 18:05:07 +01:00
b1b74b2551 Merge branch 'dev' into #428 2023-11-15 18:04:59 +01:00
bbad4100dc Fixed workspace #428 2023-11-15 17:36:30 +01:00
25df0e4876 Merge pull request '#428' (#436) from #428 into dev
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 2m32s
Reviewed-on: #436
2023-11-15 16:56:31 +01:00
4ba40b826a Fixed scripts #428 2023-11-15 16:56:08 +01:00
06a0eba5c5 Added migration to old naming safety #428 2023-11-14 23:50:05 +01:00
fe5b0207c0 Added version logic & fixed downgrade scripts #428 2023-11-13 23:38:04 +01:00
e01c738cf0 Removed old logic #428 2023-11-13 22:57:17 +01:00
d2d59bdad7 Removed old scripts #428 2023-11-13 22:55:35 +01:00
dd3bfa68c6 Finished script migration #428 2023-11-13 22:54:47 +01:00
4e12ba5ffe Added other scripts #428 2023-11-10 23:39:21 +01:00
35a8b8f592 Added 1.0.0 scripts #428 2023-11-10 23:36:32 +01:00
5c8feed8aa Readded known scripts & added formatting #428 2023-11-10 23:35:56 +01:00
e018fdcbdf Updated and added script order #428 2023-11-10 23:34:07 +01:00
39b9def76c Fixed versions #428 2023-11-10 13:28:54 +01:00
2801c617f6 Fixed migrations #428 2023-11-10 13:27:58 +01:00
5461a6d8dc Added 0.3.1 migration scripts #428 2023-11-10 13:25:53 +01:00
d93c3ad6c7 Added 0.3 migration scripts #428 2023-11-10 13:23:23 +01:00
aec7dac4c7 Added 0.2.2 migration scripts #428 2023-11-10 13:22:36 +01:00
407ec08463 Added 0.1 migration scripts #428 2023-11-10 13:20:33 +01:00
4628f31993 Added logic to handle down and upgrades #428 2023-11-10 13:19:23 +01:00
1f2fbc362f Improved sql migration to script migration tool #428 2023-11-10 12:56:02 +01:00
666b20d3a9 Added mock db base #428 2023-11-10 11:57:54 +01:00
5de6710261 Merge pull request 'staging' (#435) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m34s
Reviewed-on: #435
2023-11-07 20:37:13 +01:00
e99e272029 Merge branch 'master' into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m12s
2023-11-07 20:37:03 +01:00
650f612a6b Fixed base on member join
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m19s
2023-11-07 20:36:29 +01:00
38093ab817 Removed maintenance mode
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m10s
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m12s
2023-11-07 18:27:57 +01:00
d2c37a0098 Merge pull request 'staging' (#434) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m15s
Reviewed-on: #434
2023-11-07 18:21:58 +01:00
804aa0b9b8 Fixed some histories
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m1s
2023-11-07 18:16:10 +01:00
692cf8de31 Merge pull request 'Probably fixed server stats #432' (#433) from dev into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m19s
Reviewed-on: #433
2023-11-07 18:07:11 +01:00
b15c3b7fa3 Set version 1.2.1
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m15s
2023-11-07 18:01:23 +01:00
49121fd179 Probably fixed server stats #432
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m25s
2023-11-07 17:56:57 +01:00
9bad75e7c2 Temporarily removed server stats
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 5m7s
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m16s
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m11s
2023-11-07 00:28:22 +01:00
7358b67072 Fixed server loading in web
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 5m6s
2023-11-07 00:06:17 +01:00
1b0ba01258 Fixed gql types
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m52s
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m3s
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m3s
2023-11-06 23:29:11 +01:00
6fc5ee3ed3 Merge pull request 'Fixed DeleteUserJoinedServer' (#431) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m18s
Reviewed-on: #431
2023-11-06 21:43:36 +01:00
099707446d Merge branch 'master' into staging
Some checks reported warnings
Deploy staging on push / on-push-deploy_sh-edraft (push) Has been cancelled
2023-11-06 21:43:25 +01:00
d6b7fd73df Fixed DeleteUserJoinedServer
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m2s
2023-11-06 21:42:52 +01:00
6bfb0ddbf9 Merge pull request 'Fixed remove user process' (#429) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m10s
Reviewed-on: #429
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-11-06 21:34:29 +01:00
e1b76fa628 Possibly fixed rate limit in actions
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m0s
2023-11-06 21:26:25 +01:00
e6f98def6a Possibly fixed rate limit in actions 2023-11-06 21:26:25 +01:00
590479eee2 Set migration only on prod 2023-11-06 21:26:25 +01:00
d25305be4a Merge pull request 'Fixed migration scripts' (#427) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m24s
Reviewed-on: #427
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-11-06 20:26:57 +01:00
2889a97f17 Merge branch 'master' into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m21s
2023-11-06 20:25:59 +01:00
b540821a32 Fixed migration scripts
Some checks reported warnings
Deploy staging on push / on-push-deploy_sh-edraft (push) Has been cancelled
2023-11-06 20:25:10 +01:00
5b43b72838 Merge pull request 'staging into master' (#426) from staging into master
All checks were successful
Deploy prod on push / on-push-deploy_sh-edraft (push) Successful in 3m30s
Reviewed-on: #426
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-11-06 20:06:33 +01:00
46cd33d194 Updated gitea actions
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m11s
2023-11-06 20:05:10 +01:00
1287829bdf Set migration only on prod
Some checks failed
Deploy staging on push / on-push-deploy_sh-edraft (push) Failing after 5s
2023-11-06 19:41:52 +01:00
c91c8b2bcd Updated config
Some checks failed
Deploy staging on push / on-push-deploy_sh-edraft (push) Failing after 5s
2023-11-06 19:25:40 +01:00
a5b4c4cd66 Updated config
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m27s
2023-11-06 19:22:40 +01:00
1688347367 Merge pull request 'dev into staging' (#425) from dev into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m54s
Reviewed-on: #425
2023-11-06 19:06:09 +01:00
6e79811bc9 Added maintenance option to technician settings #424
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m20s
2023-11-06 18:56:04 +01:00
e1258151de Added maintenance to db and gql #424 2023-11-06 18:02:09 +01:00
a7c833b9db Added maintenance mode #423
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m9s
2023-11-05 22:22:39 +01:00
2f161d2f43 Fixed technicianFullDataAccess
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m59s
2023-11-05 17:50:37 +01:00
0a5f23f1af Merge pull request 'dev' (#422) from dev into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 3m22s
Reviewed-on: #422
2023-11-05 17:07:56 +01:00
23a3dbbc5e Merge branch 'staging' into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m42s
2023-11-05 17:07:48 +01:00
8975665407 Merge pull request '#420' (#421) from #420 into dev
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m23s
Reviewed-on: #421
2023-11-05 15:51:47 +01:00
90de90684c Added statistics #420 2023-11-05 15:51:25 +01:00
d1ecfe9603 Added activity score calculation #420 2023-11-05 15:34:17 +01:00
f7f25e9428 Added base for server statistics #420 2023-11-05 14:01:24 +01:00
6ae7ab5c5a Set higher timer for steam offer watcher
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m20s
2023-11-05 11:48:45 +01:00
315c90cacc Fixed dropdown width
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m57s
2023-11-05 00:38:44 +01:00
2caa910613 Merge pull request 'dev into staging' (#415) from dev into staging
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m29s
Reviewed-on: #415
2023-11-05 00:29:44 +01:00
8e55ebc4b7 Added active member count #413
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 6m38s
2023-11-05 00:18:01 +01:00
665e524aa9 Fixed menu design
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m13s
2023-11-04 23:56:36 +01:00
ae021ac7ea Added custom level header to make multi env compatible
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m0s
2023-11-04 23:43:54 +01:00
dcbb481b10 Added setting for max steam offer count 2023-11-04 23:37:07 +01:00
e6165caed9 Only view first 150 elements of steam offers
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m27s
2023-11-04 18:01:40 +01:00
58fdc9f48f Fixed staging icon
All checks were successful
Deploy staging on push / on-push-deploy_sh-edraft (push) Successful in 4m5s
2023-11-04 17:54:39 +01:00
1c02608410 Merge pull request 'dev into staging' (#414) from dev into staging
Some checks failed
Deploy staging on push / on-push-deploy_sh-edraft (push) Failing after 2m30s
Reviewed-on: #414
2023-11-04 17:47:23 +01:00
5e0b322273 Removed invalid files
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m48s
2023-11-04 15:33:28 +01:00
4f336bed05 Fixed technician config loading
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m50s
2023-11-04 15:21:22 +01:00
99d476df86 Fixed version handling
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 3m20s
2023-11-04 14:40:42 +01:00
81062e74d7 Fixed docker
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 3m28s
2023-11-04 14:27:27 +01:00
acae8ac891 Fixed deploy actions
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 3m19s
2023-11-04 14:22:15 +01:00
e3dc0f725e Possibly fixed web build
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 3m18s
2023-11-04 14:13:55 +01:00
40a7919a3f Set migration only for test purpose
Some checks failed
Deploy dev on push / on-push-deploy_sh-edraft (push) Failing after 3m16s
2023-11-04 14:00:31 +01:00
14d0e38c5d Improved deployment 2023-11-04 13:21:55 +01:00
62649226ba Updated config to deploy dev 2023-11-04 13:06:11 +01:00
0a04ad74d8 Added dev env 2023-11-04 13:02:09 +01:00
467050d87e Set steam offer loop to one hour 2023-11-04 11:04:04 +01:00
e8f2a01851 Updated config
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m31s
2023-11-03 15:19:04 +01:00
f972055ebf Added translation for short role name position 2023-11-03 15:07:23 +01:00
9bbfe498cc Fixed channel sort
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m43s
2023-11-03 15:02:27 +01:00
b21c9f894f Fixed sale count for steam offers
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m35s
2023-11-03 14:54:25 +01:00
7a0f29f557 Improved workflows
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m42s
2023-11-03 14:15:59 +01:00
ed72620d33 Changed steam sale offer checker
All checks were successful
Deploy dev on push / on-push-deploy_sh-edraft (push) Successful in 4m5s
2023-11-03 08:12:21 +01:00
b8356917b3 Prevent logging bots 2023-11-03 08:12:21 +01:00
84fedfaa0b Improved data validation for import 2023-11-03 08:12:21 +01:00
2d358188af Fixed formatting 2023-11-03 08:12:21 +01:00
79278d8f4b Fixed sync by member command 2023-11-03 08:12:21 +01:00
b943b9a7ed Fixed version #407 2023-11-03 08:12:21 +01:00
1c20bbed66 Added tooltip translation #407 2023-11-03 08:12:21 +01:00
33006e3d01 Added data import & export #407 2023-11-03 08:12:21 +01:00
90ae55c0d4 Fixed birthday gql output 2023-11-03 08:12:21 +01:00
626d0891f9 Fixed config loading query 2023-11-03 08:12:21 +01:00
09cccd1b89 Fixed deps 2023-11-03 08:12:21 +01:00
940a2ed065 Fixed add user 2023-11-03 08:12:21 +01:00
c2fa1a1c00 Fixed docker config 2023-11-03 08:12:21 +01:00
1f1b1f7b65 Fixed docker config 2023-11-03 08:12:21 +01:00
4b52995143 Updated image name in stack 2023-11-03 08:12:21 +01:00
6a6d19686c Fixed workflow 2023-11-03 08:12:21 +01:00
798162fb62 Readded configs 2023-11-03 08:12:21 +01:00
74c71abea5 Readded docker 2023-11-03 08:12:21 +01:00
0e679eda32 Fixed action 2023-11-03 08:12:21 +01:00
403c169b71 Fixed action 2023-11-03 08:12:21 +01:00
a113e21e19 Fixed angular.json 2023-11-03 08:12:21 +01:00
71c091c226 Added todo comment 2023-11-03 08:12:21 +01:00
b8d27cc682 Fixed sorting 2023-11-03 08:12:21 +01:00
c9b967b9d0 Changed env var prefix #405 2023-11-03 08:12:21 +01:00
410049be6e Updated web build #405 2023-11-03 08:12:21 +01:00
be6361f619 Formatted stuff #405 2023-11-03 08:12:21 +01:00
3a7daf8b42 Fixed submodules #405 2023-11-03 08:12:21 +01:00
f435d3dd48 Moved folders #405 2023-11-03 08:12:21 +01:00
eb32bec43c Fixed task logging #404 2023-11-03 08:12:21 +01:00
232429a77d Updated cpl-discord #404 2023-11-03 08:12:21 +01:00
0946734633 Removed mysql_native_password #404 2023-11-03 08:12:21 +01:00
ea1472a9eb Fixed type param for get_services #404 2023-11-03 08:12:21 +01:00
f710f6ad6c Build new version #404 2023-11-03 08:12:21 +01:00
030fedfcfb Updated deps #404 2023-11-03 08:12:21 +01:00
bd1d230f67 Added birthday watcher #401 2023-11-03 08:12:21 +01:00
dcafa63d74 Improved steam offer #188 2023-11-03 08:12:21 +01:00
3a42b42dbf Improved steam offer #188 2023-11-03 08:12:21 +01:00
4747f23202 Get steam offers #188 2023-11-03 08:12:21 +01:00
5057cbed16 Added birthday command #401 2023-11-03 08:12:21 +01:00
7aff767a4b Added birthday to wi #401 2023-11-03 08:12:21 +01:00
61bdc8a52a Improved user warnings in WI #402 2023-11-03 08:12:21 +01:00
5afd0fafa8 Show user warnings in profile & lazy load other stuff #402 2023-11-03 08:12:21 +01:00
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
9db00516c3 Fixed translations #1.1.0 2023-08-14 19:36:22 +02:00
44e225c273 Fixed code after merges #1.1.0 2023-08-14 19:25:12 +02:00
99e75ba325 Merge branch 'support' into 1.1.0 #1.1.0
# Conflicts:
#	kdb-bot/src/bot/config
#	kdb-bot/src/modules/base/events/base_on_voice_state_update_event_scheduled_event_bonus.py
2023-08-14 19:22:23 +02:00
3a078271ff Merge branch 'master' into support 2023-08-14 19:17:07 +02:00
1f9991eeda Fixed queries #295 2023-08-14 19:14:59 +02:00
bfe72668dc Send message to team chat when a member leaves the server #295 2023-08-14 19:14:59 +02:00
51d95c81c1 Added technician config to frontend #127 2023-08-14 19:14:59 +02:00
6c39cd1ae1 Added server config to frontend #127 2023-08-14 19:14:59 +02:00
5d36f1188a Added server config mutation #127 2023-08-14 19:14:59 +02:00
4c42949516 Added translations #127 2023-08-14 19:14:59 +02:00
8922524f44 Added logic to edit technician config in WI #127 2023-08-14 19:14:59 +02:00
eac367c611 Added technician config to frontend #127 2023-08-14 19:14:59 +02:00
f02acd7f94 Added technician config mutation #127 2023-08-14 19:14:59 +02:00
05ddfb3de3 Added technician config queries #127 2023-08-14 19:14:59 +02:00
5c2c89ca45 Removed old settings #127 2023-08-14 19:14:59 +02:00
ec1ce4adef Changed config loading from file to db #127 2023-08-14 19:14:59 +02:00
71f1f972c9 Added technician config seeder #127 2023-08-14 19:14:59 +02:00
23757bc841 Improved technician config repo #127 2023-08-14 19:14:59 +02:00
9671090385 Added technician config repo #127 2023-08-14 19:14:59 +02:00
a03ddf3fc2 Added sql for cfg in wi migration #127 2023-08-14 19:14:59 +02:00
da3538a836 Added config migration #127 2023-08-14 19:14:59 +02:00
c782c11b6d Removed from_dict from settings stuff #127 2023-08-14 19:14:59 +02:00
05a2ea9b18 Added migration for config in wi #127 2023-08-14 19:14:59 +02:00
a482c72a56 Moved version settings to version.json #294 2023-08-14 19:14:59 +02:00
22bdf13835 Fixed workspace #268_achievements 2023-08-14 19:14:59 +02:00
0a3affc5d0 Added bug report #293_complaints 2023-08-14 19:14:59 +02:00
d642322985 Improved complaint command #293_complaints 2023-08-14 19:14:59 +02:00
9f63a9c6dd [UNTESTED] Added complaint command #293_complaints 2023-08-14 19:14:59 +02:00
11a4874bfb Added achievements to data integrity service #268_achievements 2023-08-14 19:14:59 +02:00
d4dd55944a Add xp for achievement #268_achievements 2023-08-14 19:14:59 +02:00
23d6216029 Added description to achievements #268_achievements 2023-08-14 19:14:59 +02:00
f7297ddf78 Added history for achievements to frontend #268_achievements 2023-08-14 19:14:59 +02:00
eb3715d00b Fixed achievements in user profile #268_achievements 2023-08-14 19:14:59 +02:00
aae6472e11 Added achievements to user profile #268_achievements 2023-08-14 19:14:59 +02:00
a71e3e4720 Added last_single_ontime_hours achievement logic #268_achievements 2023-08-14 19:14:59 +02:00
189128f0d3 Added played_on_game_server achievement logic #268_achievements 2023-08-14 19:14:59 +02:00
3fb951a748 Improved generic achievement logic #268_achievements 2023-08-14 19:14:59 +02:00
2293849d94 Improved internal achievement checks #268_achievements 2023-08-14 19:14:59 +02:00
cd5b3b6523 Added logic to make achievement config more generic #268_achievements 2023-08-14 19:14:59 +02:00
c8a2ed290b Fixed config #268_achievements 2023-08-14 19:14:59 +02:00
184d241695 Improved achievement logic #268_achievements 2023-08-14 19:14:59 +02:00
cab65477b0 Improved achievement endpoint #268_achievements 2023-08-14 19:14:59 +02:00
3507623c92 Improved achievement component #268_achievements 2023-08-14 19:14:59 +02:00
b99dd1bded Fixed server cache & improved frontend implementation #268_achievements 2023-08-14 19:14:59 +02:00
a0d38bec49 First step to add achievements to frontend #268_achievements 2023-08-14 19:14:59 +02:00
f312a2d776 Fixed achievement query #268_achievements 2023-08-14 19:14:58 +02:00
bfb816dd17 Fixed achievement query #268_achievements 2023-08-14 19:14:58 +02:00
d6854d44b7 Added achievement gql endpoint [UNTESTED] #268_achievements 2023-08-14 19:14:58 +02:00
fdbba1b89c Fixed models #268_achievements 2023-08-14 19:14:58 +02:00
7f197a0ea7 Added achievement data model #268_achievements 2023-08-14 19:14:58 +02:00
2c9569b75f Fixed gql playground # 2023-08-14 19:14:58 +02:00
607b7d8aee Ensure bot shutdown before data checks #292_shutdown_procedure 2023-08-14 19:14:58 +02:00
00db6ac10f Improved open voice state check #292_shutdown_procedure 2023-08-14 19:14:58 +02:00
f034413e35 Added data integrity check to shutdown #292_shutdown_procedure 2023-08-14 19:14:58 +02:00
ff16eae477 Moved data integrity check #292_shutdown_procedure 2023-08-14 19:14:58 +02:00
dbd82930d4 Removed comments #297_cpl_update 2023-08-14 19:14:58 +02:00
2e9cf0bd97 Updated cpl-discord #297_cpl_update 2023-08-14 19:14:58 +02:00
8a2edc7228 Updated stuff #297_cpl_update 2023-08-14 19:14:58 +02:00
6d14ba9d79 Updated packages #297_cpl_update 2023-08-14 19:14:58 +02:00
ba5f83f3d0 Merge pull request 'Add xp when event starts #323' (#324) from #323 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#324
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-08-14 09:30:16 +02:00
9f614e8a31 Repaired config for support 2023-07-08 09:59:50 +02:00
6e0d4a5144 Add xp when event starts #323 2023-07-08 09:40:20 +02:00
bd8bd40863 Added reaction channel null check #318 2023-06-08 08:47:56 +02:00
c7a1069c0c Merge pull request 'Fixed bug that mods cannot see auto role rules' (#315) from 314 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#315
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #314
2023-04-25 15:16:42 +02:00
dc0c6ca6a0 Merge branch 'support' into 314 2023-04-19 18:01:34 +02:00
ff009ffb61 Merge pull request 'support' (#316) from support into master
Reviewed-on: sh-edraft.de/kd_discord_bot#316
2023-04-18 22:23:59 +02:00
074b03eecf Merge branch 'master' into support 2023-04-18 22:23:51 +02:00
9201cbf357 Fixed bug that mods cannot see auto role rules 2023-04-18 20:33:59 +02:00
5ea698ef97 Build 1.0.7 patch 2023-04-14 23:28:56 +02:00
400e54a501 Merge pull request 'Als Nutzer des WI möchte ich nicht, dass Tabellen mit vielen Daten so lange laden #300' (#312) from #300 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#312
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #300
2023-04-14 23:25:39 +02:00
3c0233e8b3 Merge pull request 'Fixed closed navbar #307' (#311) from #307 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#311
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #307
2023-04-14 23:25:30 +02:00
8d2ae38d85 Set frontend version #300 2023-04-14 22:02:01 +02:00
2b866b5ab1 Improved level data loading #300 2023-04-14 22:01:06 +02:00
4da87ae3cb Improved auto-role data loading #300 2023-04-14 21:56:02 +02:00
1ebad89c97 Improved members data loading #300 2023-04-14 21:46:01 +02:00
b8320c83fe Fixed closed navbar #307 2023-04-14 21:09:03 +02:00
0ee26ccf3d Merge pull request 'Fixed register re nav #306' (#308) from #306 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#308
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-04-12 22:08:31 +02:00
31ca9cd8f4 Merge pull request 'Fixed is ready function #309' (#310) from #309 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#310
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-04-12 22:08:25 +02:00
089de53136 Fixed is ready function #309 2023-04-12 22:04:49 +02:00
280b22af55 Fixed register re nav #306 2023-04-12 21:43:45 +02:00
ebdf375283 Merge pull request 'Added level checks #304' (#305) from #304 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#305
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #304
2023-04-12 21:20:52 +02:00
c058312af7 Merge branch 'support' into #304 2023-04-12 21:02:40 +02:00
2befa921ea Added level on reaction handling #304 2023-04-12 21:02:18 +02:00
1792359e68 Merge pull request 'support' (#303) from support into master
Reviewed-on: sh-edraft.de/kd_discord_bot#303
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-04-12 20:20:20 +02:00
faaf14d63e Merge branch 'master' into support 2023-04-12 20:19:26 +02:00
49d1ec75c8 Build new patch version 2023-04-12 20:10:34 +02:00
629556b5fc Merge pull request 'Potentially fixed bug to kill web api on restart #301' (#302) from #301 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#302
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #301
2023-04-12 20:09:05 +02:00
9ece541e52 Fixed log message #301 2023-04-12 20:06:30 +02:00
fd51db8cac Merge branch 'support' into #301 2023-04-10 13:15:41 +02:00
2005d93f44 Merge pull request 'support in master' (#299) from support into master
Reviewed-on: sh-edraft.de/kd_discord_bot#299
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-04-10 13:15:32 +02:00
010dafc655 Potentially fixed bug to kill web api on restart #301 2023-04-10 00:13:09 +02:00
bea9dd1590 Merge branch 'master' into support 2023-04-09 20:04:54 +02:00
ef0da25f11 Improved license 2023-04-03 10:05:26 +02:00
c01a6b97fe Build patch version 2023-04-03 07:59:30 +02:00
059bd3aaf1 Build patch version 2023-04-03 07:56:25 +02:00
a9d180fdf1 Fixed last api changes 2023-04-03 07:53:24 +02:00
c71b1092f2 Merge pull request '#290' (#291) from #290 into support
Reviewed-on: sh-edraft.de/kd_discord_bot#291
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #290
2023-04-02 21:17:30 +02:00
c1e8274f46 Set async mode in web api #290 2023-04-02 18:32:34 +02:00
583218b215 Set async mode in web api #290 2023-04-02 14:41:05 +02:00
e05e67785b Build patched version 2023-03-31 12:25:37 +02:00
72d3ccded3 Merge pull request 'Fixed reaction handling #287' (#288) from 1.0.4 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#288
Closes #287
2023-03-31 12:04:09 +02:00
f30bd119df Fixed reaction handling #287 2023-03-31 12:03:07 +02:00
858fc062b3 Merge pull request '1.0.3 #285' (#286) from 1.0.3 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#286
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #285
2023-03-30 16:55:32 +02:00
6d622a70d3 Build patch version 2023-03-30 14:45:37 +02:00
4a0a6a4631 Improved logging to app end 2023-03-30 14:43:21 +02:00
17c2acd77c Improved logging to app end 2023-03-30 14:37:02 +02:00
27363522d3 Fixed xp input #285 2023-03-30 14:29:31 +02:00
1960b18058 Improved level service 2023-03-30 14:23:29 +02:00
91034cee09 Merge pull request '1.0.2 #283' (#284) from 1.0.2 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#284
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #283
2023-03-29 23:06:51 +02:00
a4d3cffa93 Removed test logs 2023-03-29 23:05:41 +02:00
809c6d4cb9 Build patch version 2023-03-29 22:59:40 +02:00
2fecbf2c31 Added cache service to cache server 2023-03-29 22:58:32 +02:00
c439d5925f Merge pull request '1.0.1' (#278) from 1.0.1 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#278
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-03-29 21:00:02 +02:00
1777a32899 Merge pull request '#281' (#282) from #281 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#282
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #281
2023-03-29 19:45:10 +02:00
3e5301b2d8 Merge branch '1.0.1' into #281 2023-03-29 19:39:04 +02:00
653562b908 idk #281 2023-03-29 19:38:42 +02:00
8025c31339 Set xp by level only when incoming level is different from user level #281 2023-03-29 19:38:25 +02:00
ccf41bec79 Retry select after half a second 2023-03-29 15:17:19 +02:00
f75d8f2068 Merge pull request 'Fixed reaction handling #279' (#280) from #279 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#280
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #279
2023-03-29 14:53:49 +02:00
da02aca7e4 Fixed reaction handling #279 2023-03-29 14:52:36 +02:00
3762f16c7e Merge pull request 'Fixed remove warning team notification #270' (#271) from #270 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#271
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #270
2023-03-28 23:39:41 +02:00
b3099121ab Build bot version #270 2023-03-28 23:36:33 +02:00
6a750ee31b Set bot version #270 2023-03-28 23:36:06 +02:00
3c371ec074 Set correct frontend version #270 2023-03-28 23:34:42 +02:00
d818eafb9d Merge branch '1.0.1' into #270 2023-03-28 23:30:32 +02:00
b4a5fdb258 Merge pull request 'Fixed unnecessary voice states #274' (#275) from #274 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#275
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #274
2023-03-28 23:29:47 +02:00
cf69436168 Merge pull request 'Fixed can_user_see_element #272' (#273) from #272 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#273
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #272
2023-03-28 23:29:35 +02:00
ccf171e876 Merge pull request 'Fixed id access #266' (#267) from #266 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#267
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #266
2023-03-28 23:29:22 +02:00
5a312bf660 Merge pull request 'Als Admin möchte ich, dass bei Erstellung einer AutoRollen Regel die Reaktion automatisch hinzugefügt wird #259' (#263) from #259 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#263
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #259
2023-03-28 23:29:05 +02:00
0003255d7c Merge branch '1.0.1' into #274 2023-03-28 18:24:21 +02:00
27a4c140e4 Fixed unnecessary voice states #274 2023-03-28 18:23:45 +02:00
3183461195 Merge branch '1.0.1' into #272 2023-03-28 15:46:14 +02:00
cb4f8d870c Fixed can_user_see_element #272 2023-03-28 15:45:38 +02:00
7c447bb0f2 Set frontend version for patch version #270 2023-03-28 15:04:20 +02:00
4debe4e2ba Fixed remove warning team notification #270 2023-03-28 15:01:35 +02:00
3cd3df3e5f Merge branch '1.0.1' into #266 2023-03-27 19:46:51 +02:00
b4a631d4e4 Fixed id access #266 2023-03-27 19:46:10 +02:00
7ba0247519 Merge pull request 'Fixed dropdown color #260' (#262) from #260 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#262
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #260
2023-03-27 19:35:30 +02:00
209e75fdcc Merge pull request 'Disabled add button for mods in level list #264' (#265) from #264 into 1.0.1
Reviewed-on: sh-edraft.de/kd_discord_bot#265
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #264
2023-03-27 19:35:04 +02:00
3bca3f86eb Disabled add button for mods in level list #264 2023-03-27 19:33:22 +02:00
657a8fa586 Added comment #259 2023-03-27 10:17:56 +02:00
3c8a092f40 Added logic to add reaction after creating auto role rule in WI #259 2023-03-27 10:17:55 +02:00
61bf508cea Fixed dropdown color #260 2023-03-27 10:04:18 +02:00
75ad07477a Merge pull request '1.0.0' (#253) from 1.0.0 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#253
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-03-27 09:30:49 +02:00
132d41f0a2 Fixed some stuff 2023-03-26 22:58:56 +02:00
707a835672 Updated docker & config 2023-03-26 20:08:04 +02:00
f56dbf8e2a Merge pull request 'Fixed permission handling for member data #256' (#258) from #256 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#258
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
#Closes #256
2023-03-25 18:01:57 +01:00
c311e534d7 Merge pull request 'Fixed profile navigation #255' (#257) from #255 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#257
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #255
2023-03-25 18:01:41 +01:00
87b277515c Fixed permission handling for member data #256 2023-03-24 14:23:13 +01:00
e6c614dfdc Fixed profile navigation #255 2023-03-24 14:15:21 +01:00
24d5bbf4d8 Made version in presence optional 2023-03-24 14:14:49 +01:00
52035af0cc Fixed jwt handling 2023-03-21 19:14:39 +01:00
fdc9a118c8 Fixed jwt handling 2023-03-20 16:30:07 +01:00
ba1f4ee955 Merge pull request '1.0.0-fix' (#254) from 1.0.0-fix into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#254
2023-03-20 14:41:33 +01:00
35d161c080 Removed obsolete fix 2023-03-20 14:40:56 +01:00
818163cbed Formatted tools 2023-03-20 14:39:23 +01:00
468ebb5f79 Merge branch 'master' into 1.0.0-fix
# Conflicts:
#	kdb-bot/src/bot/__init__.py
#	kdb-bot/src/bot/bot.json
#	kdb-bot/src/bot/config
#	kdb-bot/src/bot/extension/__init__.py
#	kdb-bot/src/bot_api/__init__.py
#	kdb-bot/src/bot_api/abc/__init__.py
#	kdb-bot/src/bot_api/bot-api.json
#	kdb-bot/src/bot_api/configuration/__init__.py
#	kdb-bot/src/bot_api/controller/__init__.py
#	kdb-bot/src/bot_api/event/__init__.py
#	kdb-bot/src/bot_api/exception/__init__.py
#	kdb-bot/src/bot_api/filter/__init__.py
#	kdb-bot/src/bot_api/filter/discord/__init__.py
#	kdb-bot/src/bot_api/logging/__init__.py
#	kdb-bot/src/bot_api/model/__init__.py
#	kdb-bot/src/bot_api/model/discord/__init__.py
#	kdb-bot/src/bot_api/route/__init__.py
#	kdb-bot/src/bot_api/service/__init__.py
#	kdb-bot/src/bot_api/transformer/__init__.py
#	kdb-bot/src/bot_core/__init__.py
#	kdb-bot/src/bot_core/abc/__init__.py
#	kdb-bot/src/bot_core/bot-core.json
#	kdb-bot/src/bot_core/configuration/__init__.py
#	kdb-bot/src/bot_core/core_extension/__init__.py
#	kdb-bot/src/bot_core/events/__init__.py
#	kdb-bot/src/bot_core/exception/__init__.py
#	kdb-bot/src/bot_core/helper/__init__.py
#	kdb-bot/src/bot_core/logging/__init__.py
#	kdb-bot/src/bot_core/pipes/__init__.py
#	kdb-bot/src/bot_core/service/__init__.py
#	kdb-bot/src/bot_data/__init__.py
#	kdb-bot/src/bot_data/abc/__init__.py
#	kdb-bot/src/bot_data/bot-data.json
#	kdb-bot/src/bot_data/migration/__init__.py
#	kdb-bot/src/bot_data/model/__init__.py
#	kdb-bot/src/bot_data/service/__init__.py
#	kdb-bot/src/bot_graphql/__init__.py
#	kdb-bot/src/bot_graphql/abc/__init__.py
#	kdb-bot/src/bot_graphql/filter/__init__.py
#	kdb-bot/src/bot_graphql/mutations/__init__.py
#	kdb-bot/src/modules/auto_role/__init__.py
#	kdb-bot/src/modules/auto_role/auto-role.json
#	kdb-bot/src/modules/auto_role/command/__init__.py
#	kdb-bot/src/modules/auto_role/events/__init__.py
#	kdb-bot/src/modules/auto_role/helper/__init__.py
#	kdb-bot/src/modules/base/__init__.py
#	kdb-bot/src/modules/base/abc/__init__.py
#	kdb-bot/src/modules/base/base.json
#	kdb-bot/src/modules/base/command/__init__.py
#	kdb-bot/src/modules/base/configuration/__init__.py
#	kdb-bot/src/modules/base/events/__init__.py
#	kdb-bot/src/modules/base/events/base_on_voice_state_update_event.py
#	kdb-bot/src/modules/base/helper/__init__.py
#	kdb-bot/src/modules/base/model/__init__.py
#	kdb-bot/src/modules/base/service/__init__.py
#	kdb-bot/src/modules/base/thread/__init__.py
#	kdb-bot/src/modules/boot_log/__init__.py
#	kdb-bot/src/modules/boot_log/boot-log.json
#	kdb-bot/src/modules/boot_log/configuration/__init__.py
#	kdb-bot/src/modules/database/__init__.py
#	kdb-bot/src/modules/database/database.json
#	kdb-bot/src/modules/level/__init__.py
#	kdb-bot/src/modules/level/command/__init__.py
#	kdb-bot/src/modules/level/configuration/__init__.py
#	kdb-bot/src/modules/level/events/__init__.py
#	kdb-bot/src/modules/level/level.json
#	kdb-bot/src/modules/level/service/__init__.py
#	kdb-bot/src/modules/permission/__init__.py
#	kdb-bot/src/modules/permission/abc/__init__.py
#	kdb-bot/src/modules/permission/configuration/__init__.py
#	kdb-bot/src/modules/permission/events/__init__.py
#	kdb-bot/src/modules/permission/permission.json
#	kdb-bot/src/modules/permission/service/__init__.py
#	kdb-bot/src/modules/stats/service/__init__.py
#	kdb-bot/src/modules/stats/stats.json
#	kdb-bot/src/modules/technician/__init__.py
#	kdb-bot/src/modules/technician/command/__init__.py
#	kdb-bot/src/modules/technician/technician.json
#	kdb-bot/tools/get_version/get-version.json
#	kdb-bot/tools/post_build/post-build.json
#	kdb-bot/tools/set_version/set-version.json
2023-03-20 14:39:18 +01:00
085726bf60 Updated config 2023-03-20 14:32:44 +01:00
223abbe66f Fixed user mutation 2023-03-20 14:11:02 +01:00
4c5a8baed5 Build release 2023-03-20 14:01:08 +01:00
59162408e5 Merge pull request 'Datenschutz und Impressum angeben #251' (#252) from #251 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#252
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #251
2023-03-20 13:42:23 +01:00
634b81d23b Merge branch '1.0.0' into #251 2023-03-20 13:40:17 +01:00
c0cd5bb70e Merge pull request '1.0.0.rc2' (#250) from 1.0.0.rc2 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#250
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-03-20 13:40:00 +01:00
cc0a0a5c69 Added logic to confirm privacy before registration #251 2023-03-17 14:43:16 +01:00
4420c0e11c Added imprint & privacy to auth and improved getting url #251 2023-03-17 13:48:48 +01:00
7be40ed236 Added imprint and privacy urls 2023-03-17 13:18:33 +01:00
ff415c354d Merge branch '1.0.0' into 1.0.0.rc2 2023-03-14 18:43:35 +01:00
283eaabef6 Merge pull request 'Als Nutzer möchte ich Datenänderungen nach verfolgen können #246' (#248) from #246 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#248
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: Jonas <joni.drescher@web.de>
2023-03-14 18:31:36 +01:00
b7e72888f7 Fixed translation #246 2023-03-14 17:00:52 +01:00
b29227e8d5 Fixed translation 2023-03-14 17:00:34 +01:00
9f57182fc1 Fixed collection sorting & paging order 2023-03-14 15:32:26 +01:00
699377be54 Added type hints #246 2023-03-14 15:32:00 +01:00
efba1a4ce8 Added type hints #246 2023-03-12 18:46:39 +01:00
68fa1b8c2d Fixed translation 2023-03-12 05:04:26 +01:00
8b79d69e41 Build 1.0.0.rc2 2023-03-12 04:55:42 +01:00
c1b75dff78 Set frontent version 1.0.0.rc2 2023-03-12 04:55:42 +01:00
5f284597aa Build 1.0.0.rc2 2023-03-12 04:55:42 +01:00
e1b1a68b07 Set version for rc2 2023-03-12 04:55:42 +01:00
b1a0115e8b Fixed db set date & show only changed fields in history view #246 2023-03-12 04:55:04 +01:00
ad00dce5d9 Fixed mysql scripts #246 2023-03-11 03:09:27 +01:00
e3c47ce5b1 Fixed mysql scripts #246 2023-03-11 03:09:18 +01:00
68026e4b47 Improved history component #246 2023-03-11 03:08:47 +01:00
ee503f76f2 Order history tables #246 2023-03-11 01:19:06 +01:00
a1f7b8b2dc Added en and fixed de translation #246 2023-03-11 01:19:06 +01:00
b8e4146b33 Added history to all data tables #246 2023-03-11 01:19:06 +01:00
51f0ee5744 Improved history component #246 2023-03-11 01:19:06 +01:00
69ce659328 Added history tables to graphql #246 2023-03-11 01:18:35 +01:00
325a17b5a8 Added level history to graphql #246 2023-03-11 01:18:35 +01:00
5df0501505 Added last migration parts #246 2023-03-11 01:18:35 +01:00
c3ef7a746f [WIP] Added last tables #246 2023-03-11 01:18:35 +01:00
bca33c6e56 [WIP] Added more tables #246 2023-03-11 01:18:35 +01:00
d24d3fa4de [WIP] Added more tables #246 2023-03-11 01:18:35 +01:00
1755efb5d9 [WIP] Added migration and basics for history logic #246 2023-03-11 01:18:35 +01:00
54b0086a14 Merge pull request 'Unbekannte Benutzer führen zu einem Fehler mit tracking id statt einer fehlermeldung #247' (#249) from #247 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#249
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #247
2023-03-11 01:17:15 +01:00
f404287cc1 Merge branch '1.0.0' into #247 2023-03-11 01:14:47 +01:00
7966ca16e5 Merge pull request '1.0.0.rc1' (#244) from 1.0.0.rc1 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#244
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-03-11 01:12:31 +01:00
c0e5f0d4b0 Updated config 2023-03-09 19:41:10 +01:00
80769a1bf0 Fixed permission service 2023-03-09 19:27:56 +01:00
bc92dc4536 Fixed icon buttons #247 2023-03-09 11:22:10 +01:00
16ef29999c Fixed _is_email_valid method #247 2023-03-09 11:15:28 +01:00
33279b7053 Fixed collection count field #247 2023-03-09 11:12:48 +01:00
04fcfddbd9 Code cleanup #247 2023-03-09 11:10:53 +01:00
21f0f32322 Retranslate sidebar on lang change 2023-03-06 10:54:58 +01:00
d1420d18c0 Put boot log send message in loop task #243 2023-03-06 10:54:58 +01:00
22d26bf032 Reload levelsystem after mutate levels #245 2023-03-06 10:54:58 +01:00
a701807831 Fixed frontend permissions 2023-03-06 10:54:58 +01:00
3324cf3ac3 Fixed time calculation for user joined gs/vs 2023-03-06 10:54:58 +01:00
1664c67763 Fixed time calculation for user joined gs/vs 2023-03-06 10:54:58 +01:00
bddcd3929a Updated docker compose 2023-03-06 10:54:58 +01:00
23e17c1f38 Fixed auto-role error 2023-03-06 08:42:48 +01:00
883811d156 Removed minecraft_id 2023-03-06 08:42:48 +01:00
4d0e8898fe Build frontend 2023-03-06 08:42:48 +01:00
505c87b996 Build version 2023-03-06 08:42:48 +01:00
18fe6ecb86 Set version for rc 2023-03-06 08:42:48 +01:00
f02268c1a1 Merge pull request '#238' (#242) from #238 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#242
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #238
2023-03-06 08:42:21 +01:00
1b328dc20e Fixed translation #238 2023-03-06 08:05:30 +01:00
34c362a391 Improved game server handling for ontime #238 2023-03-06 08:05:08 +01:00
15dfc3f47c Added GameServer & ApiKey logic #238 2023-03-06 08:05:08 +01:00
91b2cf7546 Added GameServer handling & commands #238 2023-03-06 08:05:08 +01:00
a8dad6b223 Added GameServer data model #238 2023-03-06 08:05:08 +01:00
124209c371 Merge pull request '#240' (#241) from #240 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#241
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #240
2023-03-05 21:55:39 +01:00
d24c8e40de Merge branch '1.0.0' into #240 2023-03-05 21:47:53 +01:00
54004d10a5 Merge pull request 'Übersetzungen in Front und Backend aufräumen #232' (#237) from #232 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#237
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #232
2023-03-05 21:47:38 +01:00
a510cf731f Fixed german translation #232 2023-03-05 21:42:51 +01:00
23b7e4f59c Fixed english translation #232 2023-03-05 21:33:30 +01:00
24f90657e1 Fixed german translation #232 2023-03-05 21:22:22 +01:00
454fabb3e3 Added migration only mode #240 2023-03-04 18:57:51 +01:00
a588f8bf72 Merge pull request 'Verwarnungssystem #35' (#235) from #35 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#235
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #35
2023-02-24 08:49:08 +01:00
d75503569e Refactored translations #232 2023-02-23 10:58:08 +01:00
5b265488df Refactored translations #232 2023-02-23 10:56:07 +01:00
2d995544c3 Code refactoring #35 2023-02-23 08:58:04 +01:00
e5fb9fd504 Merge branch '1.0.0' into #35 2023-02-23 08:46:52 +01:00
a80bbc33cf Merge pull request 'Fixed table loading #220' (#236) from #220 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#236
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #220
2023-02-23 08:46:04 +01:00
6915515932 Fixed table loading #220 2023-02-22 21:02:49 +01:00
42b71525bd Merge pull request '#133' (#224) from #133 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#224
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Jonas <joni.drescher@web.de>
2023-02-22 19:29:16 +01:00
2674af64e9 Added warning commands #35 2023-02-22 08:44:08 +01:00
1eb625fe7a Improved warning handling #35 2023-02-22 08:39:50 +01:00
19f47a01e5 Added warnings service #35 2023-02-22 08:39:50 +01:00
8ff21debf0 Added user warning repository #35 2023-02-22 08:39:50 +01:00
89bcb655d2 Added user warning model #35 2023-02-22 08:39:50 +01:00
b9d33c5fd0 Merge branch '1.0.0' into #133 2023-02-21 22:45:30 +01:00
9ea1b14852 Optimized code #133 2023-02-21 22:44:42 +01:00
2763f254af Merge pull request 'Fixed db null handling #219' (#229) from #219 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#229
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #219
2023-02-21 21:10:18 +01:00
f7dc8d135a Improved SQL statements #219 2023-02-21 21:08:51 +01:00
d42b76ba87 Improved SQL statements #219 2023-02-21 20:51:28 +01:00
0f26db3d74 Merge pull request 'Der Bot muss wohl zwei mal gestartet werden, damit er die DB richtig läd #214' (#231) from #214 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#231
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #214
2023-02-21 20:43:05 +01:00
d9d3f8c8b0 Merge pull request 'Fixed add xp to author of reacted message #218' (#230) from #218 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#230
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #218
2023-02-21 20:42:52 +01:00
23ee963d65 Fixed formattings #133 2023-02-21 17:29:08 +01:00
f3024d2ea5 Fixed changes of rebase #133 2023-02-21 17:24:18 +01:00
Jonas Drescher
e463b19a73 added level table 2023-02-21 17:11:56 +01:00
15214b1c99 Fixed user filter #133 2023-02-21 17:10:34 +01:00
Jonas Drescher
dfcd958965 WIP: levels table 2023-02-21 17:10:32 +01:00
9274be6bb7 Merge branch '1.0.0' into #218 2023-02-21 13:21:33 +01:00
ac1affa937 Fixed seeder and module order #214 2023-02-21 13:19:34 +01:00
4e722d9c47 Fixed add xp to author of reacted message #218 2023-02-21 12:47:20 +01:00
6585576266 Merge branch '1.0.0' into #219 2023-02-21 12:43:15 +01:00
8937243725 Fixed db null handling #219 2023-02-21 12:42:47 +01:00
c841f39a03 Merge pull request 'Added confirm dialog on first discord login #210' (#228) from #210 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#228
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #210
2023-02-21 12:12:30 +01:00
a3fa7cb7b9 Merge pull request 'Improved server loading by route #216' (#227) from #216 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#227
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #216
2023-02-21 12:12:20 +01:00
f38b517b98 Added confirm dialog on first discord login #210 2023-02-21 12:09:29 +01:00
7d450a12ac Improved server loading by route #216 2023-02-21 11:50:30 +01:00
0ea1edff4d Merge pull request 'Removed api url from env #217' (#226) from #217 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#226
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #217
2023-02-21 11:34:09 +01:00
70775111c5 Removed api url from env #217 2023-02-21 11:33:49 +01:00
f42f2086e7 Merge pull request 'Fixed notification on OnMemberJoin #191' (#225) from #191 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#225
2023-02-21 10:17:47 +01:00
1f3b12501b Fixed notification on OnMemberJoin #191 2023-02-21 10:16:16 +01:00
c0882a8ad3 Merge pull request 'AutoRole #134' (#222) from #134 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#222
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #134
2023-02-21 09:54:35 +01:00
75ab159539 Added typing #134 2023-02-20 22:46:18 +01:00
ec9bc80392 Finished auto role rules #134 2023-02-20 22:30:25 +01:00
02d04725bd Added auto role rule list logic #134 2023-02-20 21:32:46 +01:00
10d79f8c2c Prepared auto role rules #134 2023-02-20 21:32:46 +01:00
a2dcbbc465 Finished auto role list #134 2023-02-20 21:32:46 +01:00
81fe7433bd Improved settings #134 2023-02-20 21:32:46 +01:00
ed5564dc7c [WIP] Improved auto roles #134 2023-02-20 21:32:46 +01:00
e0ca057399 [WIP] Added auto roles list #134 2023-02-20 21:32:46 +01:00
8f95e196ec Merge pull request 'Removed statistic module #190' (#213) from #190 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#213
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #190
2023-02-20 14:17:51 +01:00
16b2deec6b Added requested changes #190 2023-02-19 21:33:08 +01:00
85e664e642 Removed statistic module #190 2023-02-19 19:46:13 +01:00
64985f5983 Merge pull request 'Client in Webinterface anzeigen #80' (#211) from #80_show_info_of_client into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#211
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #80
2023-02-19 18:02:45 +01:00
Jonas Drescher
02ed6eb75b deleted unused comments #80 2023-02-19 18:01:13 +01:00
Jonas Drescher
b615f2608f added translation #80 2023-02-19 17:59:59 +01:00
Jonas Drescher
bf776177d4 added clients to server-dashboard #80 2023-02-19 17:45:50 +01:00
Jonas Drescher
a2a0056873 min = 0 fix on xp inputfield 2023-02-19 14:49:53 +01:00
Jonas Drescher
eb18fdea46 added Jonas to settings 2023-02-19 14:36:07 +01:00
Jonas Drescher
6945cd2eac added Jonas to settings 2023-02-19 14:31:00 +01:00
ef040f2b91 Fixed permission check 2023-02-19 14:25:41 +01:00
ba4ef693da Merge pull request '#130' (#209) from #130 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#209
2023-02-19 12:00:14 +01:00
07f2c4921c Merge branch '1.0.0' into #130 2023-02-19 12:00:09 +01:00
96339ed168 Fixed some stuff for deployment #130 2023-02-19 11:59:02 +01:00
9667f40730 Merge pull request 'Set version for stage build #130' (#208) from #130 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#208
2023-02-19 11:10:59 +01:00
5a9ad77761 Updated config #130 2023-02-19 11:09:34 +01:00
e4d1e229eb Set version for stage build #130 2023-02-19 10:59:40 +01:00
299fc65d1f Merge pull request 'Set version to build for staging' (#207) from #130 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#207
2023-02-19 10:39:45 +01:00
aa38623633 Set version to build for staging 2023-02-19 10:37:56 +01:00
fd9d938b8a Set version to build for staging 2023-02-19 10:29:29 +01:00
efbe6efc20 Merge pull request 'Mitglieder auf einem Server anzeigen #130' (#206) from #130 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#206
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #130
2023-02-18 14:56:38 +01:00
da3680a83e Improved imports #130 2023-02-18 14:45:51 +01:00
610ce42fa2 Fixed styling & added game server to profile #130 2023-02-18 13:37:03 +01:00
6149825101 Fixed sorting with null values #130 2023-02-18 13:05:45 +01:00
7193e58ba1 Fixed dashboard server filter #130 2023-02-18 12:54:56 +01:00
38417bd712 Fixed auth user confirmed check #130 2023-02-18 12:49:14 +01:00
43b6df2ba3 Improved spinner logic and table design #130 2023-02-18 12:42:51 +01:00
7d67b08ce6 Added leftServer handling to members list #130 2023-02-18 12:14:04 +01:00
afff27b273 Improved db updates #130 2023-02-18 11:44:13 +01:00
de8262dae1 Improved sidebar handling & added minecraftId to profile #130 2023-02-18 11:34:33 +01:00
b96288f4a3 Added member profile #130 2023-02-18 10:44:19 +01:00
1ca6debc59 Fixed server view in sidebar #130 2023-02-18 10:22:31 +01:00
dfe4f28e24 Improved sorting #130 2023-02-18 10:22:31 +01:00
fea259fa3b Renamed type_id to id for sorting #130 2023-02-18 10:22:31 +01:00
85452c9a74 Added members view #130 2023-02-18 10:22:30 +01:00
f44f77d7e5 Improved sidebar #130 2023-02-18 10:20:15 +01:00
b15bcec20a Updated config #130 2023-02-18 10:19:47 +01:00
ee351ee749 Improved routing #130 2023-02-18 10:19:47 +01:00
f847841582 Added routing by permissions #130 2023-02-18 10:19:45 +01:00
e2ef4f3bde Merge pull request 'Login in WI möglich trotz nicht bestätigter mail #77' (#205) from #77 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#205
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #77
2023-02-16 22:18:20 +01:00
3456c5f021 Merge pull request 'Bonus XP wenn man an einem Event teilnimmt #167' (#202) from #167 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#202
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #167
2023-02-16 22:18:10 +01:00
065e8b0645 Merge branch '1.0.0' into #77 2023-02-16 22:02:59 +01:00
f04a6066a1 Merge branch '1.0.0' into #167 2023-02-16 22:01:38 +01:00
c0d1288aef Merge pull request 'Erstellt am & Zuletzt bearbeitet am in Benutzertabellen #78' (#204) from #78 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#204
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #78
2023-02-16 22:01:24 +01:00
c4507d3aa1 Merge branch '1.0.0' into #167 2023-02-16 21:45:10 +01:00
1039a58d4f Merge branch '1.0.0' into #77 2023-02-16 21:44:53 +01:00
ed4d41d424 Merge branch '1.0.0' into #78 2023-02-16 21:44:32 +01:00
645e84a8fa Merge pull request 'Externe ontime Quelle: Minecraft #181' (#200) from #181 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#200
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #181
2023-02-16 21:44:20 +01:00
b9087dccb3 Fixed copy&paste error #181 2023-02-16 21:43:47 +01:00
4bb486f1d5 Merge branch '1.0.0' into #181 2023-02-16 21:08:48 +01:00
8efd0fc993 Added logic to prevent login when email not confirmed #77 2023-02-16 17:12:41 +01:00
6c0b48a941 Added logic to show createdAt & modifiedAt in auth user list #78 2023-02-16 17:00:55 +01:00
77946cb3a8 Added logic to add bonus xp when joining the event channel #167 2023-02-13 23:15:04 +01:00
5953c82a9b Fixed formatting #167 2023-02-13 23:14:57 +01:00
6bf73fcf91 Added logic to save active events locally #167 2023-02-13 23:14:49 +01:00
3844240930 Fixed filter error #181 2023-02-13 22:21:18 +01:00
efa18944fe Edited my API config 2023-02-13 20:47:32 +01:00
f435d779a7 Merge branch '1.0.0' into #181 2023-02-12 21:44:42 +01:00
cd34d18205 Merge pull request 'Als Mitglied möchte ich anhand meiner Rechte Daten ändern können oder daran gehindert werden #198' (#199) from #198 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#199
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #198
2023-02-12 21:44:27 +01:00
9e2a0441d3 Merge branch '1.0.0' into #198 2023-02-12 20:36:05 +01:00
898e27550e Merge pull request 'Added logic to check if user is allowed to see requested data #89' (#197) from #89 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#197
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #89
2023-02-12 20:35:54 +01:00
60990db88d Fixed collection building #89 2023-02-12 20:33:28 +01:00
ce1cdd4017 Added user joined game server validation checks on start #181 2023-02-12 20:30:42 +01:00
9a8f8a13f6 Improved user joined game server mutation #181 2023-02-12 20:00:47 +01:00
667bb708d9 Improved user joined game server mutation #181 2023-02-12 19:47:27 +01:00
54cb6cf8a0 Fixed user filter #181 2023-02-12 17:42:59 +01:00
aa16847fbf Added minecraft register commands #181 2023-02-12 17:22:58 +01:00
2ef4d079ed Added minecraft id #181 2023-02-12 16:55:35 +01:00
bd4e088032 Added mutations for user joined game server #181 2023-02-12 16:39:26 +01:00
1e74584e71 Added user joined game server gql query #181 2023-02-12 16:16:17 +01:00
0b5acdea58 Added user joined game server model #181 2023-02-12 15:42:02 +01:00
91bbb2f2e9 Added permission check on data mutation #198 2023-02-12 14:59:20 +01:00
dd64435c65 Added logic to check if user is allowed to see requested data #89 2023-02-11 13:11:55 +01:00
84937dde0a Merge pull request 'Ausgewählter Server besser darstellen #131' (#196) from #131 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#196
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #131
2023-02-11 10:42:03 +01:00
ca5744ea39 Removed theme.css #131 2023-02-11 10:41:44 +01:00
f68bd875b5 Merge branch '1.0.0' into #131 2023-02-11 10:40:10 +01:00
429f8b2819 Merge pull request 'graphql part3/3 #162-3' (#194) from #162-3 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#194
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #162
2023-02-11 10:39:49 +01:00
7fb8b521e4 Merge branch '1.0.0' into #162-3 2023-02-11 10:38:51 +01:00
936b8e9cb6 Merge pull request 'graphql part2/3 #162-2' (#193) from #162-2 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#193
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-02-11 10:38:28 +01:00
1fa6f44f76 Merge branch '1.0.0' into #162-2 2023-02-11 10:38:20 +01:00
f04d40ce75 Readded browserlist #162-2 2023-02-11 10:37:09 +01:00
45a6b49cf5 Improved way to load and show server in sidebar #131 2023-02-11 10:34:46 +01:00
4822348e01 Improved way to load server for server dashboard #131 2023-02-11 10:34:35 +01:00
1d1fc8a876 Merge pull request 'GraphQL Part1 (gql endpoint only) #162' (#192) from #162 into 1.0.0
Reviewed-on: sh-edraft.de/kd_discord_bot#192
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-02-11 10:30:41 +01:00
a6df06f13a Added logic to create default api-key for frontend #162-3 2023-02-09 22:09:02 +01:00
7f14aff1bd Added api-key commands #162-3 2023-02-09 20:22:46 +01:00
d03ea1d970 Added ApiKeys to db #162-3 2023-02-09 19:29:25 +01:00
f144564806 Secured graphql playground #162-2 2023-02-09 18:29:19 +01:00
f7c27b77ee Added graphql support #162-2 2023-02-09 16:36:50 +01:00
6aca981fd1 [WIP] Switched from rest to GraphQL #162-2 2023-02-09 16:09:34 +01:00
4266db7e35 [WIP] Updated packages #162-2 2023-02-09 15:27:39 +01:00
667b9fa87e [WIP] Switched to gql #162-2 2023-02-09 15:19:31 +01:00
79837afdfb Removed server route #162-2 2023-02-09 14:32:38 +01:00
8273b2b98e Build frontend & fixed oauth scopes #162 2023-02-09 14:30:51 +01:00
eaa22efd08 Merge branch '1.0.0' into #162 2023-02-08 19:26:21 +01:00
b33c5dc9bf Fixed mutations #162 2023-02-08 19:24:07 +01:00
e9559dec08 Fixed queries #162 2023-02-08 19:10:56 +01:00
5d470be583 Changed from snake to camel case #162 2023-02-08 19:05:32 +01:00
1dfe7edcba Added services to di #162 2023-02-08 17:50:43 +01:00
af8c2dea60 Added mutations #162 2023-02-08 17:48:54 +01:00
23e238b7d5 Removed server from queries where user set #162 2023-02-08 12:34:47 +01:00
fde318b85d Improved filters & queries #162 2023-02-08 12:32:16 +01:00
93c60b9176 Improved filters #162 2023-02-08 12:05:02 +01:00
12f8f669ed Improved filters #162 2023-02-07 19:09:27 +01:00
36fd3c73b9 Added client filter #162 2023-02-07 18:58:09 +01:00
3f7cfc47af Finished auto role filter #162 2023-02-07 18:53:28 +01:00
eb58c34c4d Added auto role filter #162 2023-02-07 17:52:38 +01:00
e3c0a0dea3 Reformatted files with black #162 2023-02-07 17:07:25 +01:00
dbfae8d8a4 Added more gql filters #162 2023-02-07 17:07:14 +01:00
e1c89814da Fixed voice state update (ontime) handling 2023-01-19 20:02:56 +01:00
53cdaf3fa0 Added get_ontime_overlaps script 2023-01-19 19:34:03 +01:00
b11ce18ac9 Fixed switch channel handling 2023-01-19 18:35:49 +01:00
16066864ed Improved queries & filtering #162 2023-01-16 19:18:23 +01:00
807827e30f Improved queries & filtering #162 2023-01-16 15:13:45 +01:00
c75cc54d16 Improved queries #162 2023-01-15 17:47:40 +01:00
6a1ad1ec9f Added filters #162 2023-01-15 17:06:04 +01:00
8256ebed71 Added auto role query #162 2023-01-15 16:24:16 +01:00
eb7fce140a Added more queries #162 2023-01-15 11:00:00 +01:00
ebcf876457 Added more queries #162 2023-01-15 10:59:54 +01:00
5efb1da0b8 Added more queries #162 2023-01-15 10:59:25 +01:00
b9e66bba9d Added more queries #162 2023-01-15 10:36:09 +01:00
b8484185e9 Improved level stuff #162 2023-01-15 09:51:40 +01:00
552e686aeb Updated model #162 2023-01-15 02:37:35 +01:00
efb772094b Updated cpl-core #162 2023-01-15 02:35:39 +01:00
95b9eea236 Added graphql from prototype #162 2023-01-15 02:28:28 +01:00
b95a951a1b Merge branch 'prototype/graphql/ariadne' into #162
# Conflicts:
#	kdb-bot/cpl-workspace.json
#	kdb-bot/src/bot/config
#	kdb-bot/src/bot/module_list.py
#	kdb-bot/src/bot_api/api.py
#	kdb-bot/src/bot_data/service/client_repository_service.py
#	kdb-bot/src/bot_data/service/server_repository_service.py
2023-01-15 02:25:05 +01:00
1b5f87f869 Merge pull request '0.3.1' (#187) from 0.3.1 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#187
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-01-14 10:39:27 +01:00
ed83826234 Merge branch 'master' into 0.3.1 2023-01-14 01:35:36 +01:00
96b54fdbc9 Fixed ontime calculation 2023-01-14 01:31:35 +01:00
9658a5c238 Fixed ontime round 2023-01-14 00:27:08 +01:00
6dd9b9c302 Resettet python version 2023-01-14 00:18:50 +01:00
29ee85bd93 Merge pull request 'Formatted files with black' (#186) from formatting/black into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#186
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-01-14 00:01:00 +01:00
e969926769 Set version and copyright 2023-01-13 23:59:38 +01:00
d596d7465e Formatted files with black 2023-01-13 23:54:55 +01:00
ea266cc5be Formatted files with black 2023-01-13 23:54:06 +01:00
e2b2fb5abb Formatted files with black 2023-01-13 23:43:37 +01:00
37ec0cf0c7 Merge pull request '/user add atr value member #179' (#182) from #179 into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#182
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #179
2023-01-13 23:28:36 +01:00
460bb42028 Fixed /user reset command #179 2023-01-13 23:26:38 +01:00
0379c3ed9b Removed unused imports #179 2023-01-13 23:17:06 +01:00
fecb82bf36 Refixed migration #179 2023-01-13 23:15:06 +01:00
2401e58827 Fixed client utils & Added add, remove and reset commands #179 2023-01-13 23:12:00 +01:00
5d3ceff3bf Renamed remove command #179 2023-01-13 23:10:33 +01:00
e481958bad Added logic to handle max message xp per hour #168 2023-01-13 23:09:54 +01:00
0c76269e40 Merge pull request 'XP abziehen bei löschen einer Nachricht #178' (#180) from #178 into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#180
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #178
2023-01-13 23:06:22 +01:00
17b336623d Renamed function #178 2023-01-13 22:59:48 +01:00
00b4e2ab66 Updated cpl-discord #178 2023-01-13 22:47:42 +01:00
1b15e54199 Improved formatting #178 2023-01-13 22:47:42 +01:00
c9aeb684d6 Added support to remove xp on message delete #178 2023-01-13 22:47:42 +01:00
3811cf7d74 Added support to set cached max_message by config #178 2023-01-13 22:47:39 +01:00
2a0e3d77b7 Merge pull request 'Vergebene XP für Nachrichten und Reaktionen pro Stunde begrenzen #168' (#176) from #168 into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#176
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #168
2023-01-13 22:47:12 +01:00
59fc1e1442 Fixed naming error #168 2023-01-13 22:43:30 +01:00
84f8690bdf Updated migration #168 2023-01-13 22:35:46 +01:00
d91ff392ca Fixed is_message_xp_count_by_hour_higher_that_max_message_count_per_hour #168 2023-01-13 22:27:05 +01:00
1ff70af72b Added logic to handle max message xp per hour #168 2023-01-13 22:17:16 +01:00
a216506a37 Added UserMessageCountPerHour model #168 2023-01-13 22:16:05 +01:00
3d01c9f798 Added max_message_xp_per_hour #168 2023-01-13 22:16:00 +01:00
624625d4b5 Merge pull request 'Levelsystem per Befehl neuladen #164' (#175) from #164 into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#175
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #164
2023-01-13 22:15:11 +01:00
f9593b5f44 Merge pull request 'Ontime berechnung zentralisieren #166' (#172) from #166 into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#172
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #166
2023-01-13 22:14:57 +01:00
34ebb48c83 Centralised ontime calculation #166 2023-01-13 12:23:49 +01:00
849a92125a Improved formatting #164 2023-01-12 07:33:53 +01:00
5d6c55fc86 Improved formatting #164 2023-01-12 07:29:45 +01:00
3cf0fe3479 Improved formatting #166 2023-01-12 07:20:00 +01:00
b80958e3ab Fixed vc_state_update #166 2023-01-12 07:14:44 +01:00
b89fa12ec6 Fixed level service #166 2023-01-12 07:14:44 +01:00
706b6732eb Fixed ontime calculation #166 2023-01-12 07:14:40 +01:00
053c190c78 Merge branch '0.3.1' into #164 2023-01-12 07:12:04 +01:00
c443d108dc Merge pull request 'Added optional feature-flag files' (#177) from internal/feature-flags into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#177
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-01-12 07:11:32 +01:00
09fbc27981 Added optional feature-flag files 2023-01-12 07:09:40 +01:00
242ffd1550 Merge pull request 'Reaktion ins message.log #169' (#174) from #169 into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#174
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #169
2023-01-12 07:05:50 +01:00
fb4be18ef2 Merge pull request 'VoiceStateUpdate speichern nach channel wechsel #165' (#173) from #165 into 0.3.1
Reviewed-on: sh-edraft.de/kd_discord_bot#173
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #165
2023-01-12 07:05:32 +01:00
89ee16d1b5 Merge pull request '0.3' (#146) from 0.3 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#146
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-01-12 07:04:39 +01:00
8b7efed257 Added level reload command & improved delete_message guild id handling #164 2023-01-11 18:23:00 +01:00
d10c33c6c2 Added logic to log reactions #169 2023-01-11 17:53:21 +01:00
3abaee3e71 Added logic to save vc_state_update when changing channel #165 2023-01-11 17:25:51 +01:00
4c577f6a7b Set config 2023-01-10 20:05:17 +01:00
f50a763539 Set docker 2023-01-10 20:05:03 +01:00
9ff9cc672e Improved docker stuff 2023-01-09 10:23:06 +01:00
9d4cf5a769 Set version for frontend 2023-01-09 08:31:31 +01:00
df1d62f569 Build version 0.3.0 2023-01-09 08:06:28 +01:00
4201510e9f Set version 0.3.0 2023-01-09 08:05:50 +01:00
394428a81a Updated config for build 2023-01-09 08:04:57 +01:00
4733f84ec6 Updated config for build 2023-01-09 08:04:45 +01:00
df42acec26 Added mutations without saving data 2023-01-07 16:31:28 +01:00
44204f5b94 Improved query & filtering 2023-01-07 15:53:53 +01:00
ce85bb332a Improved query & filtering 2023-01-07 15:53:44 +01:00
7a836a7f59 Added filtering 2023-01-07 15:17:11 +01:00
dacb429d9b Moved graphql stuff to own lib 2023-01-07 12:41:22 +01:00
77e18027a0 Improved ariadne with DI 2023-01-06 23:18:40 +01:00
b13695b018 Moved to ariadne 2023-01-06 16:21:21 +01:00
75500076a7 Improved gql data layer 2023-01-06 14:47:45 +01:00
5455a6b359 Added first graphene models 2023-01-06 14:14:37 +01:00
9c466733fb Reset config 2023-01-05 13:33:24 +01:00
bd62618fdf Build rc5 version 2023-01-04 17:20:26 +01:00
a78d5f0fcb Fixed #153 again 2023-01-04 17:19:36 +01:00
661630bb37 Build rc4 version 2023-01-04 17:07:53 +01:00
15f041a2da Set rc4 version 2023-01-04 17:07:30 +01:00
1ac5d982ed Fixed #152 2023-01-04 17:06:46 +01:00
1337ef35dd Fixed #153 2023-01-04 17:05:32 +01:00
986d7c4562 Merge remote-tracking branch 'origin/0.3' into 0.3 2023-01-04 17:03:33 +01:00
7fcb4084d2 Reactivated web api & set frontend version 2023-01-04 12:23:14 +01:00
fbac0d3d02 Reactivated web api & set frontend version 2023-01-04 12:21:31 +01:00
9626de2b27 Build new rc version 2023-01-04 12:14:39 +01:00
1d74f5e67c Set new rc version 2023-01-04 12:14:18 +01:00
6949db10f8 Merge pull request '/auto-role rule add failed (#151)' (#161) from #151 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#161
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #151
2023-01-04 12:09:14 +01:00
ba5d897662 Merge pull request 'Fixed autocompletes (#150)' (#160) from #150 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#160
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #150
2023-01-04 11:30:22 +01:00
47415af868 Merge pull request 'Fixed user autocompletes (#153)' (#159) from #153 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#159
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #153
2023-01-04 11:30:11 +01:00
6353c7ca86 Merge pull request 'Fixed user info command (#152)' (#158) from #152 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#158
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #152
2023-01-04 11:30:00 +01:00
440689653d Merge pull request 'Added logic to count moved users to mass move (#156)' (#157) from #156 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#157
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #156
2023-01-04 11:29:49 +01:00
844a818aa0 Fixed auto-role add #151 2022-12-30 13:05:49 +01:00
33fb973f21 Fixed autocompletes #150 2022-12-30 13:05:30 +01:00
7646335d03 Fixed autocompletes #150 2022-12-30 12:18:56 +01:00
04c905d287 Fixed user autocompletes #153 2022-12-30 11:45:41 +01:00
c7d8508173 Fixed user info command #152 2022-12-30 11:34:47 +01:00
f3eff97780 Added logic to count moved users to mass move #156 2022-12-30 11:26:29 +01:00
476db0ed33 Build rc2 2022-12-28 20:13:48 +01:00
9c369b911a Fixed user group 2022-12-28 20:10:20 +01:00
6dfd476bce Merge pull request 'Improved translations #64' (#149) from #64 into 0.3
closes #64
2022-12-28 19:48:49 +01:00
f669410b2a Improved translations #64 2022-12-28 19:45:50 +01:00
a46122243f Merge pull request 'Added logic to handle public and private messages #147' (#148) from #147 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#148
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #147
2022-12-28 18:59:47 +01:00
3b7345b404 Added logic to handle public and private messages #147 2022-12-27 19:02:59 +01:00
59d38f8f2a Merge pull request 'Build 0.3.0.rc1' (#145) from 0.3.0.rc1 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#145
Closes #145
2022-12-27 18:54:29 +01:00
612430d3e0 Fixed dockerfile for releases 2022-12-23 16:41:28 +01:00
e01290db9b Build 0.3.0.rc1 2022-12-23 16:12:35 +01:00
6273ce9cba Merge pull request 'Added user remove command #23' (#144) from #23 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#144
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #23
2022-12-23 15:50:07 +01:00
5c923d8bd8 Merge branch '0.3' into #23 2022-12-23 15:48:46 +01:00
6c6169f7ee Merge pull request 'Added user set command #22' (#143) from #22 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#143
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #22
2022-12-23 15:48:36 +01:00
ffd5105154 Removed error handling for database errors, replaced match-case-statements with if-else-statements and removed unused variables from the language file #23 2022-12-22 21:02:05 +01:00
9040ab6fca Improved error handling and changed attribute names from constants to variables which are located in the language file #23 2022-12-22 20:41:50 +01:00
9d89135b4c Added SQL command to delete all records by user id in "userjoinedvoicechannel"-table #23 2022-12-22 20:39:39 +01:00
71899346b2 Added translation for user remove command #23 2022-12-22 20:39:39 +01:00
d197a6e158 Added user remove command #23 2022-12-22 20:39:39 +01:00
40e53de3f2 Removed error handling for database errors and replaced match-case-statements with if-else-statements #22 2022-12-22 20:38:59 +01:00
1b9553e63b Improved error handling and changed attribute names from constants to variables which are located in the language file #22 2022-12-18 22:44:07 +01:00
5447d502cc Merge branch '0.3' into #22 2022-12-18 11:02:07 +01:00
5a4c2901f5 Fixed not checking level after new XP is assinged to user #22 2022-12-17 19:21:04 +01:00
bcf71a26f0 Fixed cpl query update 2022-12-17 16:17:14 +01:00
b25b75e382 Fixed frontend 2022-12-17 15:26:48 +01:00
f21b4f9881 Merge pull request 'Updated CPL to 2022.12.0 (#140)' (#141) from #140 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#141
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #140
2022-12-12 08:13:14 +01:00
8705904882 Merge branch '0.3' into #140 2022-12-12 08:13:00 +01:00
cf610b770b Added translation for user set command 2022-12-11 21:19:08 +01:00
ec30069ff5 Added user set command 2022-12-11 21:18:51 +01:00
7026b3abac Merge pull request 'Added user get command #21' (#142) from #21 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#142
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #21
2022-12-11 19:27:35 +01:00
31464df3f6 Fixed ontime rounding #21 2022-12-11 19:26:48 +01:00
eb9f5b83d5 Changed cpl-query to "2022.12.1.post1" in "kdb-bot/src/bot/bot.json" 2022-12-11 03:03:12 +01:00
fdd8357729 Added user get command #21 2022-12-11 00:22:34 +01:00
7c744f0e65 Updated CPL to 2022.12.0 #140 2022-12-04 18:38:58 +01:00
4a0f5c28c1 Merge pull request '0.3 - Bei message Member.name -> Member.mentions oder so (#100)' (#137) from #100 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#137
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #100
2022-11-22 18:16:38 +01:00
d2f99003ff Merge pull request '0.3 - Nachrichten sollen länger gezeigt werden (#135)' (#138) from #135 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#138
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #135
2022-11-22 18:16:21 +01:00
9dd3fd4b8e Updated configs #135 2022-11-21 20:35:55 +01:00
d18500b96c Changed .name -> .mention #100 2022-11-21 20:29:50 +01:00
91fdf34d32 Merge pull request 'Added mass-move command' (#136) from #20 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#136
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #136
2022-11-21 19:00:34 +01:00
12369cdbe3 Removed unused code for mass-move #20 2022-11-21 18:20:23 +01:00
25c698273a Fixed sending message with translation pipe #20 2022-11-21 00:30:49 +01:00
2868b1afe2 Added messaging to mass-move #20 2022-11-20 23:27:22 +01:00
0d1c15b31d Added mass-move command #20 2022-11-20 19:18:17 +01:00
840da350e4 Merge pull request '0.3 - Login per Discord (#128)' (#129) from #128 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#129
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #128
2022-11-20 16:54:03 +01:00
bd94c42eae Added discord login & removed discord register #128 2022-11-20 16:09:20 +01:00
c7a925b997 Merge pull request 'Added presence command #18' (#126) from #18 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#126
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #126
2022-11-20 15:41:26 +01:00
7fb6d22c3f Added requested changes to presence command #18 2022-11-20 15:39:34 +01:00
c5b5297058 Added presence command #18 2022-11-20 06:21:51 +01:00
9ed66c2560 Merge branch '0.3' of https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot into 0.3
 Conflicts:
	kdb-bot/src/modules/technician/command/log_command.py
2022-11-18 15:39:36 +01:00
6e6157ccf2 Fixed log command 2022-11-18 15:34:25 +01:00
f136d6164e Fixed log command 2022-11-18 15:05:39 +01:00
9b5033b80e Fixed some on member join stuff 2022-11-18 14:33:54 +01:00
f5a71a8450 Fixed some on member join stuff 2022-11-18 14:14:01 +01:00
d3279eb7c7 Updated config 2022-11-18 10:23:40 +01:00
ec7aeb8712 Added icmplib 2022-11-18 10:16:59 +01:00
fd609eb923 Merge remote-tracking branch 'origin/0.3' into 0.3
# Conflicts:
#	kdb-bot/cpl-workspace.json
2022-11-18 09:58:28 +01:00
a7dbc75d2e Updated configs 2022-11-18 09:58:05 +01:00
b0459567f4 Fixed workspace 2022-11-18 09:52:27 +01:00
25b7b18013 Fixed workspace 2022-11-18 09:51:06 +01:00
87350cba1a Moved dockerfile 2022-11-18 09:50:06 +01:00
864d181de0 Fixed project files 2022-11-18 09:33:50 +01:00
90011be760 Updated api config ? 2022-11-18 09:30:44 +01:00
47dd6fdc2d Improved build version stuff 2022-11-18 09:30:29 +01:00
8445c23e7f Merge pull request '0.3 - Log Befehl (#44)' (#125) from #44 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#125
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #44
2022-11-17 23:03:33 +01:00
e6fc41090a Refactored code #44 2022-11-17 23:02:27 +01:00
7c79c6f992 Merge branch '0.3' into #44
# Conflicts:
#	kdb-bot/src/bot/config
2022-11-17 22:54:01 +01:00
7b8dca64bf Finished log command #44 2022-11-17 22:45:10 +01:00
549b05087f Merge pull request '0.3 - /user info für alle (#119)' (#122) from #119 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#122
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #119
2022-11-17 20:40:55 +01:00
83d18da58f Merge pull request '0.3 - level check for all members on seed (#123)' (#124) from #123 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#124
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #123
2022-11-17 20:40:37 +01:00
18e4465b17 Merge branch '0.3' into #123 2022-11-17 20:01:44 +01:00
2e20bb12de Merge branch '0.3' into #119 2022-11-17 20:01:31 +01:00
4f4e80fb6b Merge pull request '0.3 - Xp für Reaction (#118)' (#121) from #118 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#121
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #121
2022-11-17 20:01:12 +01:00
fd1245fb4f Merge remote-tracking branch 'origin/#118' into #118 2022-11-17 19:59:01 +01:00
fdb358c45e Removed xp when remove reaction #118 2022-11-17 19:58:51 +01:00
c438a91b87 Added logic to add xp on reaction #118 2022-11-17 19:58:51 +01:00
a46fbcd9fc Removed xp when remove reaction #118 2022-11-17 19:57:28 +01:00
91285540c6 Merge pull request '0.3 - /ping pings to urls (#117)' (#120) from #117 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#120
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #117
2022-11-17 19:54:17 +01:00
ab2145d5df Check level for each member after changes #123 2022-11-17 19:31:57 +01:00
63fe566044 Improved /user info command #119 2022-11-17 16:49:33 +01:00
d45d787cea Added logic to add xp on reaction #118 2022-11-17 16:35:47 +01:00
442170eca9 Added pings to servers to ping command #117 2022-11-17 16:16:28 +01:00
2c7f4647af [WIP] Added log command #44 2022-11-16 21:04:07 +01:00
53604706c2 Added technician module #44 2022-11-14 22:29:43 +01:00
42d8a16d05 Merge pull request '0.3 - Nachricht an Moderatoren, wenn Hilfe-Channel betreten wird (#113)' (#116) from #113 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#116
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #113
2022-11-14 21:56:40 +01:00
d933cae73c Merge branch '0.3' into #113 2022-11-14 21:56:24 +01:00
ce73145dbb Merge pull request '0.3 - Checks in Befehlen als Decorators (#114)' (#115) from #114 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#115
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #114
2022-11-14 21:49:59 +01:00
ab7fdec499 Merge branch '0.3' into #114 2022-11-14 21:49:42 +01:00
d2968e0652 Merge pull request '0.3 - Admins können keine anderen Benutzer zu Admin machen (#88)' (#112) from #88 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#112
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #88
2022-11-14 21:10:35 +01:00
cebdc1b860 Merge branch '0.3' into #88 2022-11-14 21:09:30 +01:00
87435614db Fixed angular setup for windoof and linux 2022-11-14 20:10:44 +01:00
e9386633d8 Merge branch '0.3' into #88 2022-11-13 22:20:51 +01:00
49d9509255 Added logic to send mods a message when member joins help channel #113 2022-11-13 12:32:31 +01:00
905182931c Improved event checks #114 2022-11-13 12:15:53 +01:00
026d989789 Improved event checks #114 2022-11-13 12:11:01 +01:00
d38fa77757 Added checks to commands #114 2022-11-13 12:07:50 +01:00
5cdf2834cc Added is ready check to events #114 2022-11-13 12:01:34 +01:00
7173dee28d Added event checks #114 2022-11-13 11:58:09 +01:00
e754a10241 Added command checks #114 2022-11-13 11:56:42 +01:00
theim
8fa6458d6e Added my configs 2022-11-12 15:16:06 +01:00
e269442603 Fixed bot project 2022-11-12 14:29:50 +01:00
d36a29042e Fixed copy paste error in feature flags 2022-11-12 12:15:45 +01:00
c09841a3da Merge branch '0.3' into #88 2022-11-11 22:02:39 +01:00
e098416a29 Merge pull request '0.3 - /level edit (#103)' (#108) from #103 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#108
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #103
2022-11-11 22:02:26 +01:00
9017535bfb Merge branch '0.3' into #88 2022-11-11 10:19:25 +01:00
b2087042bc Added error notification to level edit #103 2022-11-11 07:33:24 +01:00
8fafc94118 Merge branch '0.3' into #103 2022-11-11 07:28:21 +01:00
c608b232b0 Merge pull request '0.3 - Ontime in user info (#97)' (#107) from #97 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#107
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #97
2022-11-11 07:26:44 +01:00
6ff53fb31c Merge branch '0.3' into #97 2022-11-11 07:26:34 +01:00
be96644e5c Merge pull request '0.3 - AutoRole Emoji zu nachricht nach Anlegen einer Regel hinzufügen (#63)' (#110) from #63 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#110
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #63
2022-11-11 07:26:28 +01:00
2646dccb91 Merge branch '0.3' into #63 2022-11-11 07:25:52 +01:00
1a5917ac6b Merge pull request '0.3 - Nachricht bei shutdown und restart wird nicht geschickt vor neustart (#62)' (#111) from #62 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#111
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #62
2022-11-11 07:21:34 +01:00
588a8e140f Merge branch '0.3' into #62 2022-11-11 07:21:21 +01:00
c70149e9c8 Added is admin check to level edit #103 2022-11-10 21:10:48 +01:00
50fbc3eb8c Merge branch '0.3' into #103 2022-11-10 21:09:52 +01:00
b4fce51b57 Added is admin check to level create 2022-11-10 20:56:45 +01:00
3c1f017e3a Fixed admins cannot assign users to admins #88 2022-11-10 20:26:29 +01:00
25cc98732d Fixed restart after message #62 2022-11-10 20:02:53 +01:00
ef41ce03d3 Added functionality to auto-role rule add to add reaction to message #63 2022-11-10 19:50:42 +01:00
44f22e6aee Added level edit command #103 2022-11-10 16:33:04 +01:00
10a502fa4b Merge branch '#97' of https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot into #97 2022-11-10 08:23:46 +01:00
2a4933f971 Added ontime to user info #97 2022-11-10 08:23:40 +01:00
b30d49f5d7 Updated my laptop config 2022-11-10 08:20:49 +01:00
7eca399b9d Merge remote-tracking branch 'origin/0.3' into 0.3 2022-11-10 08:17:58 +01:00
766e9b1235 Changed edrafts secrets 2022-11-10 08:17:44 +01:00
26f0938566 Changed prod pws 2022-11-10 08:15:50 +01:00
97fab6adca Changed stage pws 2022-11-10 08:12:43 +01:00
97279c2599 Changed dev pws 2022-11-10 08:03:12 +01:00
8fe38c451e Moved docker related files 2022-11-10 07:54:31 +01:00
b0b228eef6 Moved docker related files 2022-11-10 07:54:20 +01:00
7bb407f2d7 Added configs 2022-11-10 07:47:43 +01:00
bf4468bfa6 Merge branch '0.3' of https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot into 0.3 2022-11-10 07:34:12 +01:00
762e85d062 Removed configs 2022-11-10 07:34:03 +01:00
36a8d14720 Merge branch '0.3' into #97 2022-11-10 07:12:32 +01:00
2613fcc999 Merge pull request '0.3 - received command in allen neuen Befehlen (#105)' (#106) from #105 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#106
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #105
2022-11-10 07:12:26 +01:00
356dc1848c Added ontime to user info #97 2022-11-09 22:34:25 +01:00
55c43efbdc Merge branch '0.3' into #105 2022-11-09 22:23:08 +01:00
e47318d8e9 Added received command to new commands #105 2022-11-09 22:21:32 +01:00
f551fdf87b Merge pull request '0.3 - auto-role list - möglicherweise nicht pro Server sondern allgemein (#93)' (#104) from #93 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#104
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #93
2022-11-09 22:06:32 +01:00
6f3877700e Fixed auto-role output by server #93 2022-11-09 21:40:04 +01:00
2483faef01 Merge pull request '0.3 - Statistiken (#46)' (#102) from #46 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#102
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #46
2022-11-09 20:55:05 +01:00
82365a24ba Fixed stats group #46 2022-11-09 20:52:58 +01:00
a29e33a3f9 Readded debug log to level seeder #26 2022-11-09 20:07:37 +01:00
273548411b Removed tests #26 2022-11-09 19:57:16 +01:00
a8f481ff4a Merge branch '#46' of https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot into #46
 Conflicts:
	kdb-bot/src/modules/level/level_seeder.py
2022-11-09 19:54:40 +01:00
7fe0f19adf Added db to stats #46 2022-11-09 19:53:10 +01:00
b52cdf0f34 Added stats repo #46 2022-11-09 19:53:10 +01:00
1c9c265ba8 Added stats table #46 2022-11-09 19:53:10 +01:00
b5080d8c04 Added stats migration #46 2022-11-09 19:53:10 +01:00
bf107f9a18 Added stats remove command #46 2022-11-09 19:53:10 +01:00
8cd67cd68c Added stats edit command #46 2022-11-09 19:53:10 +01:00
5c7db72723 Fixed level seeder #46 2022-11-09 19:53:10 +01:00
86433e841b Fixed typo #46 2022-11-09 19:51:46 +01:00
61b2432d0b Added logic to handle custom statistics #46 2022-11-09 19:51:46 +01:00
ddb9d0e647 Removed old code #46 2022-11-09 19:51:46 +01:00
a57c8da72a Added logic to call statistics #46 2022-11-09 19:51:46 +01:00
c6a5d49942 Added logic to call statistics #46 2022-11-09 19:51:46 +01:00
27ccdbd980 Merge pull request '0.3 - level set (#26)' (#101) from #26 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#101
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #26
2022-11-09 19:51:22 +01:00
a5ef2551e8 Improved error translation #26 2022-11-09 19:50:57 +01:00
c632ad51d4 Fixed stuff caused by merges #26 2022-11-09 19:33:45 +01:00
4f433c3840 Merge branch '#26' of https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot into #26 2022-11-09 19:26:47 +01:00
455c1e7023 Fixed translation #26 2022-11-09 19:26:41 +01:00
9ade299be7 Merge branch '0.3' into #26 2022-11-09 19:24:12 +01:00
09dcc8a9d3 Merge pull request '0.3 - level up (#27)' (#99) from #27 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#99
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #27
2022-11-09 19:24:01 +01:00
bd79831892 Added db to stats #46 2022-11-09 19:23:10 +01:00
c7967c6904 Added stats repo #46 2022-11-09 18:49:11 +01:00
a43676e9bf Added stats table #46 2022-11-09 18:36:48 +01:00
fa7e41469b Added stats migration #46 2022-11-09 18:22:27 +01:00
c9ce81701f Added stats remove command #46 2022-11-09 18:01:14 +01:00
c407c59c1a Added stats edit command #46 2022-11-09 17:59:55 +01:00
7e5706137e Fixed level seeder #46 2022-11-09 17:18:14 +01:00
144c1d7e79 Merge branch '0.3' into #27
# Conflicts:
#	kdb-bot/src/bot/translation/de.json
2022-11-09 10:16:06 +01:00
054266bfa0 Merge pull request '0.3 - level down (#28)' (#98) from #28 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#98
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #28
2022-11-09 10:03:21 +01:00
eaae058754 Fixed problems since merge #28 2022-11-09 08:51:08 +01:00
95a64732f3 Fixed typo #46 2022-11-08 22:06:36 +01:00
57d59e91ac Merge branch '0.3' into #28
# Conflicts:
#	kdb-bot/src/bot/translation/de.json
#	kdb-bot/src/modules/level/command/level_group.py
2022-11-08 22:04:14 +01:00
e3d3d200d6 Added logic to handle custom statistics #46 2022-11-08 21:54:33 +01:00
7da60e6f0a Merge pull request '0.3 - level remove Befehl (#91)' (#96) from #91 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#96
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #91
2022-11-08 21:47:46 +01:00
95e33109fe Removed old code #46 2022-11-08 20:36:31 +01:00
9e937f17b7 Fixed typo in translation... bruh #91 2022-11-08 20:33:55 +01:00
5dca2e5fed Added logic to call statistics #46 2022-11-08 20:28:44 +01:00
f24fd5e880 Added logic to call statistics #46 2022-11-08 20:28:38 +01:00
cfd96126df Merge branch '0.3' into #91 2022-11-08 18:59:41 +01:00
9099ebe4f3 Moved admin & moderator commands to base module 2022-11-08 18:59:24 +01:00
c666ceb51e Added level set command #26 2022-11-08 18:49:18 +01:00
e5eb50a3cb Fixed level seeder #26 2022-11-08 18:49:10 +01:00
f0f23163e4 Added level down command #27 2022-11-08 18:01:04 +01:00
faaadb0009 Fixed level seeder #28 2022-11-08 17:49:42 +01:00
fe32604a14 Added level down command #28 2022-11-08 17:49:32 +01:00
9b39d9baa5 Merge branch '#91' of https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot into #91 2022-11-08 09:36:41 +01:00
7f2cdc5b1c Added remove command #91 2022-11-08 09:36:15 +01:00
4ffbbd5b89 Merge pull request '0.3 - level create Befehl (#90)' (#95) from #90 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#95
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #90
2022-11-08 09:35:29 +01:00
898b24c8ee Changed color names #90 2022-11-08 08:02:35 +01:00
ccbe60b747 Merge branch '0.3' into #90 2022-11-07 22:33:26 +01:00
22456946b8 Merge pull request '0.3 - level list Befehl (#29)' (#94) from #29 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#94
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #29
2022-11-07 22:29:36 +01:00
e4fcc7931e Merge branch '0.3' into #91 2022-11-07 22:16:32 +01:00
e0af7421a1 Merge branch '0.3' into #90 2022-11-07 22:16:22 +01:00
c2ed8b9bc5 Merge branch '0.3' into #29 2022-11-07 22:16:01 +01:00
e27d2ae682 Merge pull request '0.3 - Levelsystem (#25)' (#92) from #25 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#92
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #25
2022-11-07 22:15:37 +01:00
b8fcaa48a5 Added remove command #91 2022-11-07 20:54:27 +01:00
6a18b15447 Fixed level stuff #90 2022-11-07 20:35:24 +01:00
b2397fcc2f Added create command #90 2022-11-07 20:35:12 +01:00
7ed30c40be Added list command #29 2022-11-07 19:04:41 +01:00
63000636a8 Updated version of level project #25 2022-11-06 22:46:15 +01:00
3d27295b14 Added translation to level service #25 2022-11-06 22:43:42 +01:00
1b587b049a Build files #25 2022-11-06 22:40:30 +01:00
dc90258a28 "Repaired" workspace file #25 2022-11-06 22:30:57 +01:00
23fde793db Fixed my config #25 2022-11-06 22:19:41 +01:00
6640d70440 Added logic to send message after level up #25 2022-11-06 22:17:27 +01:00
6e39154c75 Fixed level assignment #25 2022-11-06 21:54:21 +01:00
164671a07c Added logic to handle level by xp #25 2022-11-06 21:34:58 +01:00
8aee72856c Added level service #25 2022-11-06 19:51:50 +01:00
8118d4edc3 Improved logic to create roles for levels by default #25 2022-11-06 19:36:15 +01:00
861a847088 Improved logic to create roles for levels by default #25 2022-11-06 19:18:11 +01:00
666c527730 Added logic to handle default levels #25 2022-11-06 16:26:15 +01:00
e6e26b77f9 Added level repo #25 2022-11-06 14:46:11 +01:00
5a3eb57c0b Added level model #25 2022-11-06 14:35:28 +01:00
e1dbab3f4f Added level module and migration #25 2022-11-06 14:26:41 +01:00
3516a164da Merge pull request 'Added flask support #70 #75' (#71) from #70 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#71
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
Closes #70 #72 #75 #83 #85 #86
2022-11-05 13:55:41 +01:00
e1304cc602 Added comment #70 2022-11-05 13:49:01 +01:00
88f00c6046 Fixed typing #70 2022-11-05 12:42:22 +01:00
09a6062992 Fixed typing #70 2022-11-05 12:40:21 +01:00
c92403f274 Removed unused deps #70 2022-11-05 12:39:49 +01:00
422c9bbb25 Fixed log level #70 2022-11-05 12:03:22 +01:00
e45d156e74 Changed config #70 2022-11-05 11:52:31 +01:00
8e32362333 Changed config #70 2022-11-05 11:51:58 +01:00
801d4bf16b Merge pull request 'Logging erweitern um IP-Adressen #70-4 (#85)' (#87) from #85 into #70
Reviewed-on: sh-edraft.de/kd_discord_bot#87
Closes #85
2022-10-25 21:24:27 +02:00
f7fd15b4bd Merge branch '#70' into #85 2022-10-25 21:24:11 +02:00
ac5271de6d Fixed update user #85 2022-10-25 21:15:40 +02:00
1f2087f50f Fixed update user #85 2022-10-25 21:11:55 +02:00
1c5b776efb Fixed change password autocomplete #70 2022-10-25 20:44:50 +02:00
368a00434b Fixed socket connect error #85 2022-10-25 20:27:59 +02:00
242af637f7 Improved api logging #85 2022-10-25 20:27:39 +02:00
6d8aa26883 Improved api logging #85 2022-10-25 20:19:05 +02:00
bf2a412dec Improved user confirmation #70 2022-10-25 08:31:08 +02:00
811e9991d0 Fixed user confirmation :/ #70 2022-10-25 08:07:15 +02:00
5cbd6ec00b Fixed user confirmation 2022-10-25 08:00:57 +02:00
b9c793ebb7 Merge pull request 'Set secured passwords #70-3' (#84) from #70-3 into #70
Reviewed-on: sh-edraft.de/kd_discord_bot#84
Closes #83
2022-10-25 07:50:58 +02:00
76c14a79ed Set secured passwords #70-3 2022-10-25 07:48:53 +02:00
877efe086b Fixed AuthUserTransformer #70 2022-10-25 07:41:13 +02:00
3b2ab6c8a0 Potentially fixed docker deployment #70 2022-10-23 22:41:18 +02:00
7c0f30ff95 Fixed nginx #70 2022-10-23 18:24:32 +02:00
8719452dad Fixed nginx #70 2022-10-23 18:24:13 +02:00
24a3a48478 Fixed socket service #70 2022-10-23 17:49:31 +02:00
ea026b351e Fixed docker dev env #70 2022-10-23 16:38:48 +02:00
109d3f28a2 Fixed revoke jwt #70 2022-10-23 16:35:24 +02:00
af5b9a2341 Improved dev stack #70 2022-10-23 15:37:40 +02:00
25a6758c40 Improved dev stack #70 2022-10-23 15:32:03 +02:00
a685ab9e06 Fixed docker cfg #70 2022-10-23 15:11:05 +02:00
7b8f42ad59 Added dev stack #70 2022-10-23 15:05:01 +02:00
a691808068 Fixed multiple send mails error #70 2022-10-23 14:37:42 +02:00
ecd648a9b2 Fixed confirmation id None on discord registration #70 2022-10-23 14:24:23 +02:00
f891587ce3 Improved docker support for deployment #70 2022-10-23 14:11:15 +02:00
ffe7b5e109 Repaired register by discord #70 2022-10-23 12:44:51 +02:00
602b1f3f98 Fixed docker env #70 2022-10-22 08:17:54 +02:00
17a14cedb6 Improved config #70 2022-10-22 07:37:47 +02:00
e31c5472af [WIP] Changed some stuff for docker #70 2022-10-21 23:01:09 +02:00
46ed616560 Added get version stuff to build docker #70 2022-10-21 19:25:17 +02:00
47f294a982 Improved set version for frontend #70 2022-10-21 13:50:11 +02:00
0fcf2c7b45 Set version correctly #70 2022-10-21 13:45:37 +02:00
fd2d30ee7f Added set version tool #70 2022-10-21 12:45:46 +02:00
e9b74140b5 Removed gitkeep #70 2022-10-20 21:19:24 +02:00
27442fe7c7 Merge pull request 'Bissl docker kram zum laufen gebracht #70-1_docker_and_build' (#76) from #70-1_docker_and_build into #70
Reviewed-on: sh-edraft.de/kd_discord_bot#76
2022-10-20 20:49:38 +02:00
b748435f98 Build tools project #70-1 2022-10-20 20:20:01 +02:00
d60baa0dce Added project information #70-1 2022-10-20 20:18:16 +02:00
48507962f8 Improved docker #70-1 2022-10-20 17:50:50 +02:00
7d4f3e9541 Added requirements.txt generator #70-1 2022-10-20 16:48:06 +02:00
3b9ef0048e Remove unnecessary configs #70-1 2022-10-20 16:32:05 +02:00
523e019aa0 Added post-build project #70-1 2022-10-20 15:46:08 +02:00
d0d053152d Improved docker compose #70-1 2022-10-20 15:45:52 +02:00
8231d20e3b Moved deps #70 2022-10-20 12:57:36 +02:00
f35dd0b15d Fixed auth user and user relation #70 2022-10-20 12:57:02 +02:00
d778bd2719 Added logic to register by discord #70 2022-10-20 09:47:23 +02:00
0c42c6554c Added logic to register by discord #70 2022-10-19 22:42:53 +02:00
fbc7b58780 Put send mail in thread #70 2022-10-19 18:42:20 +02:00
840193d5a8 Fixed send mails #70 2022-10-19 18:01:11 +02:00
4869039503 Fixed auto-role migration #70 2022-10-19 16:57:03 +02:00
d0ded956cb [WIP] Fixed forgot password #70 2022-10-18 21:00:23 +02:00
47a73a4298 Fixed password handling #70 2022-10-18 19:50:13 +02:00
a082b879ca Secured password handling #70 2022-10-18 18:33:03 +02:00
a51efa641d Improved auth views and imrpoved default settings handling #70 2022-10-18 18:04:53 +02:00
f553779797 Merge pull request '0.3-#70 - Im Web Interface Server auswählen - (#72)' (#73) from #72 into #70
Reviewed-on: sh-edraft.de/kd_discord_bot#73
Closes #72
2022-10-18 16:37:04 +02:00
dee8e4fe74 Fixed themes #72 2022-10-18 16:36:24 +02:00
7760ee5725 Update menu when server is selected #72 2022-10-18 16:23:40 +02:00
1055d5c2e1 Improved design of menu to handle servers #72 2022-10-18 13:44:13 +02:00
c094a3efae Improved get server logic #72 2022-10-18 12:41:42 +02:00
2a97438417 [WIP] Added server dashboard #72 2022-10-17 19:44:51 +02:00
a69c223a33 Added server list to dashboard #72 2022-10-17 18:12:43 +02:00
1baa8cee60 Added logic to get servers to dashboard #72 2022-10-17 16:50:09 +02:00
3d17bb7703 Added get filtered servers #72 2022-10-17 16:22:09 +02:00
d7a0706e0c Improved get server logic #72 2022-10-17 16:07:33 +02:00
dfcc516389 Added role check to authorization #72 2022-10-17 13:53:37 +02:00
1857473ccc Added logic to get discord servers #72 2022-10-17 12:19:50 +02:00
90bfee23b4 Added logic to load api after bot #70 2022-10-16 21:36:08 +02:00
f634ad552e Fixed settings dto #70 2022-10-16 21:29:58 +02:00
29fa35dffe Fixed update user #70 2022-10-16 21:16:04 +02:00
c5f371e0d5 Fixed update user #70 2022-10-16 21:10:20 +02:00
f319e89473 Fixed login state problems #70 2022-10-16 16:01:37 +02:00
d5ad5ded88 Fixed header styling #70 2022-10-16 14:49:46 +02:00
dbbd2b54c4 Fixed load menu #70 2022-10-16 13:09:26 +02:00
1a3126dfc5 Removed themeService from templates #70 2022-10-16 12:57:27 +02:00
ba881aefa8 Added verify-login #70 2022-10-16 12:06:18 +02:00
3fe8e1503c Added authorize check to controller #70 2022-10-16 10:11:21 +02:00
651482a1b9 Added api connection check #70 2022-10-16 01:55:37 +02:00
8c3cd1fae7 Added angular frontend #70 2022-10-16 00:13:03 +02:00
ee49bde961 Added waitress dep #70 2022-10-15 23:48:38 +02:00
2b08c1d71e Updated bot stuff #70 2022-10-15 23:38:38 +02:00
ead3f69a69 Moved bot to kdb-bot #70 2022-10-15 23:17:45 +02:00
029b46d7de Build #70 2022-10-15 17:34:16 +02:00
9da95f4dfb Fixed update user #70 2022-10-15 17:25:49 +02:00
8e56ff6a8e Set log level #70 2022-10-15 17:07:46 +02:00
21fcfaaa7f Fixed some random stuff #70 2022-10-15 17:07:22 +02:00
119f4e9d04 Improved api #70 2022-10-15 12:54:10 +02:00
5cd91d8341 Fixed error and dto handling #70 2022-10-15 09:32:41 +02:00
e0844a7f92 [WIP] Improved basics of api #70 2022-10-15 03:04:17 +02:00
6f95d0a055 Added auth service stuff with jwt #70 2022-10-15 00:42:55 +02:00
1090e502c2 [WIP] Added auth service stuff without jwt #70 2022-10-14 23:32:36 +02:00
1defe29406 Added auth user controller #70 2022-10-14 15:37:52 +02:00
126637306d [WIP] Added auth user service #70 2022-10-14 13:17:25 +02:00
2457107c63 Added auth user repository #70 2022-10-14 13:05:53 +02:00
411e44a681 [WIP] Added auth controller & updated pakages #70 2022-10-14 10:35:58 +02:00
91b054fdca Added auth service abc #70 2022-10-14 07:51:30 +02:00
e8c491a478 Made api async #70 2022-10-14 07:16:12 +02:00
aab3d62365 Added api settings #70 2022-10-14 07:04:56 +02:00
0927288bb5 Added api calls #70 2022-10-13 20:57:47 +02:00
0019f868ad Added flask support #70 2022-10-13 19:57:56 +02:00
d05dec3605 Updated my config 2022-10-13 16:34:04 +02:00
30dbce3f4b Merge pull request '0.3 - user-info zu /user info konvertieren #61' (#68) from Ebola-Chan/kd_discord_bot:#61 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#68
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #61
2022-10-13 16:33:17 +02:00
56db9f42ad Merge pull request '0.3 - Techniker in PermissionService aufnehmen #60' (#69) from Ebola-Chan/kd_discord_bot:#60 into 0.3
Reviewed-on: sh-edraft.de/kd_discord_bot#69
Reviewed-by: Sven Heidemann <sven.heidemann@sh-edraft.de>
Closes #60
2022-10-13 16:32:44 +02:00
85f5717624 Addad technician to PermissionService #60 2022-10-12 21:27:55 +02:00
0c71e4934e Renamed user-info and added it to user group #61 2022-10-12 20:50:26 +02:00
988 changed files with 69693 additions and 6474 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,129 @@
name: Deploy dev on push
run-name: Deploy dev on push
on:
push:
branches:
- dev
jobs:
pre-build:
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- name: Shutdown stack
run: docker stack rm sdb_dev
build-bot:
needs: pre-build
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- 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
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Prepare bot build
run: |
python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
cd bot
cpl i
- name: Build docker bot
run: |
cd bot
docker image prune -f
cpl build
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-dev .
- name: Login to registry git.sh-edraft.de
uses: https://github.com/docker/login-action@v1
with:
registry: git.sh-edraft.de
username: ${{ secrets.CI_USERNAME }}
password: ${{ secrets.CI_ACCESS_TOKEN }}
- name: Push image
run: |
cd bot
docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-dev
build-web:
needs: pre-build
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- 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
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Setup node
uses: https://github.com/actions/setup-node@v3
- name: Prepare web build
run: |
cd web
npm install -g ts-node
npm ci
- name: Build docker web
run: |
cd web
docker image prune -f
cp src/favicon.dev.ico src/favicon.ico
npm run build
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-dev .
- name: Login to registry git.sh-edraft.de
uses: https://github.com/docker/login-action@v1
with:
registry: git.sh-edraft.de
username: ${{ secrets.CI_USERNAME }}
password: ${{ secrets.CI_ACCESS_TOKEN }}
- name: Push image
run: |
cd web
docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-dev
deploy:
needs: [ build-bot, build-web ]
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- name: Clone Repository
uses: https://github.com/actions/checkout@v3
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Install cpl
run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
- name: Set version
run: |
cd bot/docker
chmod +x ./set-docker-compose-image-version.sh
./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv)-dev git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;)-dev
- 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: sdb_dev
file: bot/docker/docker-compose.dev.yml
variables: '{}'

View File

@ -0,0 +1,128 @@
name: Deploy prod on push
run-name: Deploy prod on push
on:
push:
branches:
- master
jobs:
pre-build:
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- name: Shutdown stack
run: docker stack rm sdb_prod
build-bot:
needs: pre-build
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- 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
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Prepare bot build
run: |
python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
cd bot
cpl i
- name: Build docker bot
run: |
cd bot
docker image prune -f
cpl build
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv) .
- name: Login to registry git.sh-edraft.de
uses: https://github.com/docker/login-action@v1
with:
registry: git.sh-edraft.de
username: ${{ secrets.CI_USERNAME }}
password: ${{ secrets.CI_ACCESS_TOKEN }}
- name: Push image
run: |
cd bot
docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)
build-web:
needs: pre-build
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- 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
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Setup node
uses: https://github.com/actions/setup-node@v3
- name: Prepare web build
run: |
cd web
npm install -g ts-node
npm ci
- name: Build docker web
run: |
cd web
docker image prune -f
npm run build
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv) .
- name: Login to registry git.sh-edraft.de
uses: https://github.com/docker/login-action@v1
with:
registry: git.sh-edraft.de
username: ${{ secrets.CI_USERNAME }}
password: ${{ secrets.CI_ACCESS_TOKEN }}
- name: Push image
run: |
cd web
docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)
deploy:
needs: [ build-bot, build-web ]
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- name: Clone Repository
uses: https://github.com/actions/checkout@v3
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Install cpl
run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
- name: Set version
run: |
cd bot/docker
chmod +x ./set-docker-compose-image-version.sh
./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv) git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;)
- 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: sdb_prod
file: bot/docker/docker-compose.yml
variables: '{}'

View File

@ -0,0 +1,129 @@
name: Deploy staging on push
run-name: Deploy staging on push
on:
push:
branches:
- staging
jobs:
pre-build:
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- name: Shutdown stack
run: docker stack rm sdb_staging
build-bot:
needs: pre-build
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- 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
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Prepare bot build
run: |
python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
cd bot
cpl i
- name: Build docker bot
run: |
cd bot
docker image prune -f
cpl build
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-staging .
- name: Login to registry git.sh-edraft.de
uses: https://github.com/docker/login-action@v1
with:
registry: git.sh-edraft.de
username: ${{ secrets.CI_USERNAME }}
password: ${{ secrets.CI_ACCESS_TOKEN }}
- name: Push image
run: |
cd bot
docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-staging
build-web:
needs: pre-build
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- 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
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Setup node
uses: https://github.com/actions/setup-node@v3
- name: Prepare web build
run: |
cd web
npm install -g ts-node
npm ci
- name: Build docker web
run: |
cd web
docker image prune -f
cp src/favicon.staging.ico src/favicon.ico
npm run build
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-staging .
- name: Login to registry git.sh-edraft.de
uses: https://github.com/docker/login-action@v1
with:
registry: git.sh-edraft.de
username: ${{ secrets.CI_USERNAME }}
password: ${{ secrets.CI_ACCESS_TOKEN }}
- name: Push image
run: |
cd web
docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-staging
deploy:
needs: [ build-bot, build-web ]
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
steps:
- name: Clone Repository
uses: https://github.com/actions/checkout@v3
with:
token: ${{ secrets.CI_ACCESS_TOKEN }}
submodules: true
- name: Install cpl
run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
- name: Set version
run: |
cd bot/docker
chmod +x ./set-docker-compose-image-version.sh
./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv)-staging git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;)-staging
- 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: sdb_staging
file: bot/docker/docker-compose.staging.yml
variables: '{}'

9
.gitmodules vendored Normal file
View File

@ -0,0 +1,9 @@
[submodule "bot/src/bot/config"]
path = bot/src/bot/config
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.config.git
[submodule "bot/src/bot_api/config"]
path = bot/src/bot_api/config
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.api.config.git
[submodule "bot/docker"]
path = bot/docker
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.docker.git

View File

@ -0,0 +1,9 @@
MIT License
Copyright (c) 2022-2023 sh-edraft.de
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,100 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class DBTable(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
self._name = self._name.replace("_db_table", "")
self._class_name = self._class_name.split("Db_table")[0]
def get_code(self) -> str:
import textwrap
code = textwrap.dedent(
"""\
from datetime import datetime
from cpl_core.database import TableABC
class $ClassName(TableABC):
def __init__(
self,
value: str,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._value = value
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 value(self) -> str:
return self._value
@value.setter
def value(self, value: str):
self._value = value
@staticmethod
def get_select_all_string() -> str:
return str(
f\"""
SELECT * FROM `$TableName`;
\"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f\"""
SELECT * FROM `$TableName`
WHERE `Id` = {id};
\"""
)
@property
def insert_string(self) -> str:
return str(
f\"""
INSERT INTO `$TableName` (
`Value`
) VALUES (
{self._value}
);
\"""
)
@property
def udpate_string(self) -> str:
return str(
f\"""
UPDATE `$TableName`
SET `Value` = {self._value}
WHERE `Id` = {self._id};
\"""
)
@property
def delete_string(self) -> str:
return str(
f\"""
DELETE FROM `$TableName`
WHERE `Id` = {self._id};
\"""
)
"""
)
return self.build_code_str(
code,
ClassName=self._class_name,
TableName=self._class_name,
)
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "db-table", [])

View File

@ -0,0 +1,55 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Migration(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
import textwrap
code = textwrap.dedent(
"""\
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class $ClassName(MigrationABC):
name = "1.0_$ClassName"
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 `$TableName` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`CreatedAt` DATETIME(6),
`LastModifiedAt` DATETIME(6),
PRIMARY KEY(`Id`)
);
\"""
)
)
def downgrade(self):
self._cursor.execute("DROP TABLE `$TableName`;")
"""
)
return self.build_code_str(
code,
ClassName=self._class_name,
TableName=self._class_name.split("Migration")[0],
)
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "migration", [])

View File

@ -0,0 +1,34 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Query(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
import textwrap
code = textwrap.dedent(
"""\
from bot_graphql.abc.data_query_abc import DataQueryABC
class $ClassName(DataQueryABC):
def __init__(self):
DataQueryABC.__init__(self, "Name")
self.set_field("id", self.resolve_id)
@staticmethod
def resolve_id(x, *_):
return x.id
"""
)
return self.build_code_str(
code,
ClassName=self._class_name,
)
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "query", [])

9
bot/LICENSE Normal file
View File

@ -0,0 +1,9 @@
MIT License
Copyright (c) 2022-2023 sh-edraft.de
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

2
bot/README.md Normal file
View File

@ -0,0 +1,2 @@
# kd_discord_bot

46
bot/cpl-workspace.json Normal file
View File

@ -0,0 +1,46 @@
{
"WorkspaceSettings": {
"DefaultProject": "bot",
"Projects": {
"bot": "src/bot/bot.json",
"bot-api": "src/bot_api/bot-api.json",
"bot-core": "src/bot_core/bot-core.json",
"bot-data": "src/bot_data/bot-data.json",
"bot-graphql": "src/bot_graphql/bot-graphql.json",
"achievements": "src/modules/achievements/achievements.json",
"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/config.json",
"database": "src/modules/database/database.json",
"level": "src/modules/level/level.json",
"technician": "src/modules/technician/technician.json",
"short-role-name": "src/modules/short_role_name/short-role-name.json",
"special-offers": "src/modules/special_offers/special-offers.json",
"checks": "tools/checks/checks.json",
"get-version": "tools/get_version/get-version.json",
"post-build": "tools/post_build/post-build.json",
"set-version": "tools/set_version/set-version.json",
"migration-to-sql": "tools/migration_to_sql/migration-to-sql.json"
},
"Scripts": {
"format": "black ./",
"sv": "cpl set-version $ARGS",
"set-version": "cpl run set-version $ARGS --dev; echo '';",
"gv": "cpl get-version",
"get-version": "export VERSION=$(cpl run get-version --dev); echo $VERSION;",
"pre-build": "cpl set-version $ARGS; black ./;",
"post-build": "cpl run post-build --dev; black ./;",
"pre-prod": "cpl build",
"prod": "export SDB_ENVIRONMENT=production; export SDB_NAME=SDB-Prod; cpl start;",
"pre-stage": "cpl build",
"stage": "export SDB_ENVIRONMENT=staging; export SDB_NAME=SDB-Stage; cpl start;",
"pre-dev": "cpl build",
"dev": "export SDB_ENVIRONMENT=development; export SDB_NAME=SDB-Dev; cpl start;",
"docker-build": "cpl build $ARGS; docker build -t sh-edraft.de/sdb-bot:$(cpl gv) .;",
"dc-up": "docker-compose up -d",
"dc-down": "docker-compose down",
"docker": "cpl dc-down; cpl docker-build; cpl dc-up;"
}
}
}

1
bot/docker Submodule

@ -0,0 +1 @@
Subproject commit fbcd9226c4d199529fdbce5169b38b1b23074adb

21
bot/dockerfile Normal file
View File

@ -0,0 +1,21 @@
# syntax=docker/dockerfile:1
FROM python:3.10.4-alpine
WORKDIR /app
COPY ./dist/bot/build/bot/ .
COPY ./dist/bot/build/requirements.txt .
RUN python -m pip install --upgrade pip
RUN apk update
RUN apk add --update alpine-sdk linux-headers
RUN apk add bash
RUN apk add nano
RUN pip install -r requirements.txt --extra-index-url https://pip.sh-edraft.de
RUN pip install flask[async]
# RUN pip install dnspython==2.2.1 # https://stackoverflow.com/questions/75137717/eventlet-dns-python-attribute-error-module-dns-rdtypes-has-no-attribute-any
# ^ probably fixed py package updates
CMD [ "bash", "/app/bot/bot"]

2
bot/pyproject.toml Normal file
View File

@ -0,0 +1,2 @@
[tool.black]
line-length = 120

26
bot/src/bot/__init__.py Normal file
View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,90 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.console import Console
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_core.logging import LoggerABC
from cpl_discord.application import DiscordBotApplicationABC
from cpl_discord.configuration import DiscordBotSettings
from cpl_discord.service import DiscordBotServiceABC, DiscordBotService
from cpl_translation import TranslatePipe, TranslationServiceABC, TranslationSettings
from bot_api.api_thread import ApiThread
from bot_core.abc.task_abc import TaskABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.environment_variables import MAINTENANCE
from bot_core.service.data_integrity_service import DataIntegrityService
class Application(DiscordBotApplicationABC):
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
DiscordBotApplicationABC.__init__(self, config, services)
self._services = services
self._config = config
# cpl-core
self._logger: LoggerABC = services.get_service(LoggerABC)
self._data_integrity: DataIntegrityService = services.get_service(DataIntegrityService)
# cpl-discord
self._bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
self._bot_settings: DiscordBotSettings = config.get_configuration(DiscordBotSettings)
# cpl-translation
self._translation: TranslationServiceABC = services.get_service(TranslationServiceABC)
self._t: TranslatePipe = services.get_service(TranslatePipe)
# internal stuff
self._tasks = services.get_services(TaskABC)
self._feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings)
# api
if self._feature_flags.get_flag(FeatureFlagsEnum.api_module):
self._api: ApiThread = services.get_service(ApiThread)
self._is_stopping = False
async def configure(self):
self._translation.load_by_settings(self._configuration.get_configuration(TranslationSettings))
async def main(self):
try:
self._logger.debug(__name__, f"Starting...")
if (
self._feature_flags.get_flag(FeatureFlagsEnum.api_module)
and self._feature_flags.get_flag(FeatureFlagsEnum.api_only)
and self._environment.environment_name == "development"
):
self._api.start()
self._api.join()
return
self._logger.info(__name__, f"Try to start {DiscordBotService.__name__}")
if not self._config.get_configuration(MAINTENANCE):
for task in self._tasks:
await self._bot.add_cog(task)
await self._bot.start_async()
await self._bot.stop_async()
except Exception as e:
self._logger.error(__name__, "Start failed", e)
async def stop_async(self):
if self._is_stopping:
return
self._is_stopping = True
try:
self._logger.info(__name__, f"Try to stop {DiscordBotService.__name__}")
if self._feature_flags.get_flag(FeatureFlagsEnum.api_module):
self._api.stop()
await self._bot.close()
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)
Console.write_line()
def is_restart(self):
return True if self._configuration.get_configuration("IS_RESTART") == "true" else False

3
src/bot/bot → bot/src/bot/bot Normal file → Executable file
View File

@ -14,9 +14,6 @@ elif [[ $1 == "-stage" ]]; then
elif [[ $1 == "-prod" ]]; then
export KDB_ENVIRONMENT=production
export KDB_NAME=KDB
else
export KDB_ENVIRONMENT=production
export KDB_NAME=KDB-prod
fi
export PYTHONPATH=./:$PYTHONPATH

79
bot/src/bot/bot.json Normal file
View File

@ -0,0 +1,79 @@
{
"ProjectSettings": {
"Name": "bot",
"Version": {
"Major": "1",
"Minor": "2",
"Micro": "8"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",
"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",
"LicenseName": "MIT",
"LicenseDescription": "MIT, see LICENSE for more details.",
"Dependencies": [
"cpl-translation==2023.4.0.post1",
"cpl-query==2023.10.0",
"cpl-discord==2023.10.0.post1",
"Flask==3.0.0",
"Flask-Classful==0.16.0",
"Flask-Cors==4.0.0",
"PyJWT==2.8.0",
"waitress==2.1.2",
"Flask-SocketIO==5.3.6",
"eventlet==0.33.3",
"requests-oauthlib==1.3.1",
"icmplib==3.0.4",
"ariadne==0.20.1",
"cryptography==41.0.4",
"discord==2.3.2",
"bs4==0.0.1",
"lxml==4.9.3",
"python-valve==0.2.1",
"cpl-core==2023.10.2"
],
"DevDependencies": [
"cpl-cli==2023.4.0.post3",
"pygount==1.6.1",
"black==23.10.1"
],
"PythonVersion": ">=3.10.4",
"PythonPath": {},
"Classifiers": []
},
"BuildSettings": {
"ProjectType": "console",
"SourcePath": "",
"OutputPath": "../../dist",
"Main": "bot.main",
"EntryPoint": "bot",
"IncludePackageData": false,
"Included": [],
"Excluded": [
"*/__pycache__",
"*/logs",
"*/tests"
],
"PackageData": {},
"ProjectReferences": [
"../bot_api/bot-api.json",
"../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/short_role_name/short-role-name.json",
"../modules/special_offers/special-offers.json",
"../modules/technician/technician.json"
]
}
}

1
bot/src/bot/config Submodule

@ -0,0 +1 @@
Subproject commit eeebd13f80c6ceecc922ede5771e55212a884019

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot.extension"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,22 @@
import os
import shutil
from datetime import datetime
from cpl_core.application.application_extension_abc import ApplicationExtensionABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_query.extension import List
class CleanLogsExtension(ApplicationExtensionABC):
def __init__(self):
pass
async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
(
List(str, os.listdir("logs/"))
.where(lambda x: os.path.isdir(f"logs/{x}"))
.order_by()
.where(lambda x: (datetime.now() - datetime.strptime(x, "%Y-%m-%d")).days >= 7)
.for_each(lambda x: shutil.rmtree(f"logs/{x}"))
)

View File

@ -0,0 +1,16 @@
from cpl_core.application import ApplicationExtensionABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.model.technician_config import TechnicianConfig
class InitBotExtension(ApplicationExtensionABC):
def __init__(self):
ApplicationExtensionABC.__init__(self)
async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
settings = config.get_configuration(TechnicianConfig)
bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC, max_messages=settings.cache_max_messages)

View File

@ -6,32 +6,44 @@ from cpl_core.application import ApplicationBuilder
from cpl_core.console import Console
from bot.application import Application
from bot.extension.clean_logs_extension import CleanLogsExtension
from bot.extension.init_bot_extension import InitBotExtension
from bot.startup import Startup
from bot.startup_discord_extension import StartupDiscordExtension
from bot.startup_migration_extension import StartupMigrationExtension
from bot_data.startup_migration_extension import StartupMigrationExtension
from bot.startup_module_extension import StartupModuleExtension
from bot.startup_settings_extension import StartupSettingsExtension
from bot_api.app_api_extension import AppApiExtension
from bot_core.core_extension.core_extension import CoreExtension
from modules.boot_log.boot_log_extension import BootLogExtension
from modules.config.config_extension import ConfigExtension
from modules.database.database_extension import DatabaseExtension
class Program:
def __init__(self):
self.app: Optional[Application] = None
async def start(self):
# discord extension has to be loaded before modules (modules depends on discord stuff)
app_builder = ApplicationBuilder(Application) \
.use_extension(StartupSettingsExtension) \
.use_extension(StartupDiscordExtension) \
.use_extension(StartupModuleExtension) \
.use_extension(StartupMigrationExtension) \
.use_extension(BootLogExtension) \
.use_extension(DatabaseExtension) \
app_builder = (
ApplicationBuilder(Application)
.use_extension(StartupSettingsExtension)
.use_extension(StartupDiscordExtension)
.use_extension(StartupModuleExtension)
.use_extension(StartupMigrationExtension)
.use_extension(CleanLogsExtension)
.use_extension(DatabaseExtension)
.use_extension(ConfigExtension)
.use_extension(InitBotExtension)
.use_extension(BootLogExtension)
.use_extension(AppApiExtension)
.use_extension(CoreExtension)
.use_startup(Startup)
)
self.app: Application = await app_builder.build_async()
await self.app.run_async()
Console.write_line(f"[ INFO ] [ {__name__} ]: Finished app.run_async")
async def stop(self):
if self.app is None:
@ -46,19 +58,25 @@ def main():
except KeyboardInterrupt:
asyncio.run(program.stop())
except Exception as e:
Console.error(f'[ ERROR ] [ {__name__} ]: Cannot start the bot', f'{e} -> {traceback.format_exc()}')
Console.error(
f"[ ERROR ] [ {__name__} ]: Cannot start the bot",
f"{e} -> {traceback.format_exc()}",
)
finally:
try:
asyncio.run(program.stop())
except Exception as e:
Console.error(f'[ ERROR ] [ {__name__} ]: Cannot stop the bot', f'{e} -> {traceback.format_exc()}')
Console.error(
f"[ ERROR ] [ {__name__} ]: Cannot stop the bot",
f"{e} -> {traceback.format_exc()}",
)
if program.app is not None and program.app.is_restart():
del program
main()
if __name__ == '__main__':
if __name__ == "__main__":
main()
# ((

View File

@ -0,0 +1,44 @@
from cpl_query.extension import List
from bot_api.api_module import ApiModule
from bot_core.core_extension.core_extension_module import CoreExtensionModule
from bot_core.core_module import CoreModule
from bot_data.data_module import DataModule
from bot_graphql.graphql_module import GraphQLModule
from modules.achievements.achievements_module import AchievementsModule
from modules.auto_role.auto_role_module import AutoRoleModule
from modules.base.base_module import BaseModule
from modules.boot_log.boot_log_module import BootLogModule
from modules.config.config_module import ConfigModule
from modules.database.database_module import DatabaseModule
from modules.level.level_module import LevelModule
from modules.short_role_name.short_role_name_module import ShortRoleNameModule
from modules.special_offers.special_offers_module import SteamSpecialOffersModule
from modules.technician.technician_module import TechnicianModule
class ModuleList:
@staticmethod
def get_modules():
# core modules (modules out of modules folder) should be loaded first!
return List(
type,
[
CoreModule, # has to be first!
DataModule,
ConfigModule, # has to be before db check
DatabaseModule,
GraphQLModule,
AutoRoleModule,
BaseModule,
LevelModule,
ApiModule,
TechnicianModule,
AchievementsModule,
ShortRoleNameModule,
SteamSpecialOffersModule,
# has to be last!
BootLogModule,
CoreExtensionModule,
],
)

View File

@ -9,17 +9,19 @@ from cpl_core.dependency_injection import ServiceProviderABC
from cpl_core.environment import ApplicationEnvironment
from cpl_core.logging import LoggerABC
from bot_api.logging.api_logger import ApiLogger
from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.logging.command_logger import CommandLogger
from bot_core.logging.database_logger import DatabaseLogger
from bot_core.logging.event_logger import EventLogger
from bot_core.logging.message_logger import MessageLogger
from bot_core.logging.task_logger import TaskLogger
from bot_data.db_context import DBContext
class Startup(StartupABC):
def __init__(self):
StartupABC.__init__(self)
self._start_time = datetime.now()
@ -27,18 +29,27 @@ class Startup(StartupABC):
self._config: Optional[ConfigurationABC] = None
self._feature_flags: Optional[FeatureFlagsSettings] = None
def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC:
def configure_configuration(
self, configuration: ConfigurationABC, environment: ApplicationEnvironment
) -> ConfigurationABC:
self._config = configuration
self._feature_flags = configuration.get_configuration(FeatureFlagsSettings)
return configuration
def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC:
def configure_services(
self, services: ServiceCollectionABC, environment: ApplicationEnvironment
) -> ServiceProviderABC:
services.add_logging()
if self._feature_flags.get_flag(FeatureFlagsEnum.core_module):
# custom logging
services.add_singleton(CustomFileLoggerABC, CommandLogger)
services.add_singleton(CustomFileLoggerABC, DatabaseLogger)
services.add_singleton(CustomFileLoggerABC, MessageLogger)
services.add_singleton(CustomFileLoggerABC, TaskLogger)
services.add_singleton(CustomFileLoggerABC, EventLogger)
if self._feature_flags.get_flag(FeatureFlagsEnum.api_module):
services.add_singleton(CustomFileLoggerABC, ApiLogger)
services.add_translation()
services.add_db_context(DBContext, self._config.get_configuration(DatabaseSettings))
@ -48,9 +59,11 @@ class Startup(StartupABC):
for c in CustomFileLoggerABC.__subclasses__():
i: LoggerABC = provider.get_service(c)
logger: LoggerABC = provider.get_service(LoggerABC)
for flag in [f for f in FeatureFlagsEnum]:
logger.debug(__name__, f'Loaded feature-flag: {flag} = {self._feature_flags.get_flag(flag)}')
logger.debug(
__name__,
f"Loaded feature-flag: {flag} = {self._feature_flags.get_flag(flag)}",
)
return provider

View File

@ -6,7 +6,6 @@ from cpl_discord import get_discord_collection
class StartupDiscordExtension(StartupExtensionABC):
def __init__(self):
pass

View File

@ -12,7 +12,6 @@ from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
class StartupModuleExtension(StartupExtensionABC):
def __init__(self):
self._config: Optional[ConfigurationABC] = None
self._feature_flags: Optional[FeatureFlagsSettings] = None
@ -33,7 +32,7 @@ class StartupModuleExtension(StartupExtensionABC):
continue
Console.set_foreground_color(ForegroundColorEnum.green)
Console.write_line(f'[{__name__}] Loaded module: {module_type}')
Console.write_line(f"[{__name__}] Loaded module: {module_type}")
Console.color_reset()
module.configure_configuration(self._config, env)
module.configure_services(services, env)

View File

@ -0,0 +1,55 @@
import os
from datetime import datetime
from typing import Optional, Type, Callable
from cpl_core.application import StartupExtensionABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceCollectionABC
from cpl_core.environment import ApplicationEnvironmentABC
from bot_core.configuration.bot_logging_settings import BotLoggingSettings
from bot_core.environment_variables import MAINTENANCE, MIGRATION_ONLY
class StartupSettingsExtension(StartupExtensionABC):
def __init__(self):
self._start_time = datetime.now()
def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironmentABC):
# this shit has to be done here because we need settings in subsequent startup extensions
environment.set_working_directory(os.path.dirname(os.path.realpath(__file__)))
configuration.add_environment_variables("SDB_")
configuration.add_environment_variables("DISCORD_")
configuration.add_configuration(
MAINTENANCE, configuration.get_configuration(MAINTENANCE) in [True, "true", "True"]
)
configuration.add_configuration(
MIGRATION_ONLY, configuration.get_configuration(MIGRATION_ONLY) in [True, "true", "True"]
)
configuration.add_json_file(f"config/appsettings.json", optional=False)
configuration.add_json_file(f"config/appsettings.{environment.environment_name}.json", optional=True)
configuration.add_json_file(f"config/appsettings.{environment.host_name}.json", optional=True)
# load feature-flags
configuration.add_json_file(f"config/feature-flags.json", optional=False)
configuration.add_json_file(f"config/feature-flags.{environment.environment_name}.json", optional=True)
configuration.add_json_file(f"config/feature-flags.{environment.host_name}.json", optional=True)
configuration.add_configuration("Startup_StartTime", str(self._start_time))
self._configure_settings_with_sub_settings(
configuration, BotLoggingSettings, lambda x: x.files, lambda x: x.key
)
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
pass
@staticmethod
def _configure_settings_with_sub_settings(
config: ConfigurationABC, settings_type: Type, list_atr: Callable, atr: Callable
):
settings: Optional[settings_type] = config.get_configuration(settings_type)
if settings is None:
return
for sub_settings in list_atr(settings):
config.add_configuration(f"{type(sub_settings).__name__}_{atr(sub_settings)}", sub_settings)

View File

@ -0,0 +1,383 @@
{
"api": {
"api": {
"test_mail": {
"message": "Dies ist eine Test-Mail vom Krümelmonster Web Interface\r\nGesendet von {}-{}",
"subject": "Krümelmonster Web Interface Test-Mail"
}
},
"auth": {
"confirmation": {
"message": "Öffne den Link, um die E-Mail zu bestätigen:\r\n{}auth/register/{}",
"subject": "E-Mail für {} {} bestätigen"
},
"forgot_password": {
"message": "Öffne den Link, um das Passwort zu ändern:\r\n{}auth/forgot-password/{}",
"subject": "Passwort für {} {} zurücksetzen"
}
},
"mail": {
"automatic_mail": "\r\n\r\nDies ist eine automatische E-Mail.\r\nGesendet von {}-{}@{}"
}
},
"common": {
"bot_has_no_permission_message": "Ey!!!\nWas soll das?\nIch habe keine Berechtigungen :(\nScheiß System...",
"colors": {
"blue": "Blau",
"dark_blue": "Dunkelblau",
"dark_gold": "Dunkelgold",
"dark_gray": "Dunkelgrau",
"dark_green": "Dunkelgrün",
"dark_grey": "Dunkelgrau",
"dark_magenta": "Dunkelmagenta",
"dark_orange": "Dunkelorange",
"dark_purple": "Dunkelviolett",
"dark_red": "Dunkelrot",
"dark_teal": "Dunkelblaugrün",
"default": "Standard",
"gold": "Gold",
"green": "Grün",
"greyple": "Graugrün",
"light_grey": "Hellgrau",
"magenta": "Magenta",
"orange": "Orange",
"purple": "Violett",
"red": "Rot",
"teal": "Blaugrün",
"yellow": "Gelb"
},
"errors": {
"argument_parsing_error": "Fehler: Parameter konnte nicht gelesen werden!",
"bad_argument": "Fehler: Ungültiger Parameter!",
"bad_union_argument": "Fehler: Ungültiger Union Parameter!",
"bot_missing_any_role": "Fehler: Mir fehlen alle benötigten Rollen!",
"bot_missing_permissions": "Fehler: Mir fehlen Berechtigungen!",
"bot_missing_role": "Fehler: Mir fehlt eine benötigte Rolle!",
"bot_not_ready_yet": "Ey Alter! Gedulde dich doch mal! ...",
"check_any_failure": "Fehler: Alle Checks sind Fehlgeschlagen!",
"check_failure": "Fehler: Du hast nicht die benötigte Berechtigung!",
"command_error": "Es gab einen Fehler beim Bearbeiten des Befehls. Melde dich bitte bei einem Admin.",
"command_invoke_error": "Fehler: Befehl konnte nicht aufgerufen werden!",
"command_not_found": "Fehler: Befehl konnte nicht gefunden werden!",
"command_on_cooldown": "Fehler: Befehl befindet sich im Cooldown!",
"disabled_command": "Fehler: Befehl wurde deaktiviert!",
"error": "Es gab einen Fehler. Melde dich bitte bei einem Admin.",
"expected_closing_quote_error": "Fehler: Erwarte Zitatende!",
"extension_already_loaded": "Fehler: Erweiterung wurde bereits geladen!",
"extension_error": "Fehler: Erweiterungsfehler!",
"extension_failed": "Fehler: Erweiterung ist fehlgeschlagen!",
"extension_not_loaded": "Fehler: Erweiterung wurde nicht geladen!",
"invalid_end_of_quoted_string_error": "Fehler: Ungültiges Zitatende!",
"max_concurrency_reached": "Fehler: Maximale Parallelität erreicht!",
"missing_any_role": "Fehler: Alle benötigten Rollen fehlen!",
"missing_permissions": "Fehler: Berechtigungen fehlen!",
"missing_required_argument": "Fehler: Ein benötigter Parameter fehlt!",
"missing_role": "Fehler: Benötigte Rolle fehlt!",
"no_entry_point_error": "Fehler: Kein Eintrittspunkt!",
"no_private_message": "Fehler: Private Nachrichten sind nicht erlaubt!",
"not_owner": "Fehler: Du bist nicht mein besitzer!",
"nsfw_channel_required": "Fehler: NSFW Kanal benötigt!",
"private_message_only": "Fehler: Nur private Nachrichten sind erlaubt!",
"too_many_arguments": "Fehler: Zu viele Parameter!",
"unexpected_quote_error": "Fehler: Unerwarteter Fehler beim Anführungszeichen!",
"user_input_error": "Fehler: Eingabefehler!"
},
"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...",
"presence": {
"booting": "Ich fahre gerade hoch...",
"restart": "Muss neue Kekse holen...",
"running": "Ich esse Kekse :D",
"shutdown": "Ich werde bestimmt wieder kommen...",
"maintenance": "In Wartung!"
}
},
"modules": {
"special_offers": {
"price": "Preis",
"discount": "Rabatt",
"discount_price": "Neuer Preis"
},
"achievements": {
"commands": {
"check": "Alles klar, ich schaue eben nach... nom nom"
},
"got_new_achievement": "{} hat die Errungenschaft {} freigeschaltet :D"
},
"auto_role": {
"add": {
"error": {
"already_exists": "auto-role für die Nachricht {} existiert bereits!",
"not_found": "Nachricht {} in {} nicht gefunden!"
},
"success": "auto-role für die Nachricht {} wurde hinzugefügt :D"
},
"error": {
"nothing_found": "Keine auto-role Einträge gefunden."
},
"list": {
"auto_role_id": "auto-role Id",
"description": "Von auto-role beobachtete Nachrichten:",
"message_id": "Nachricht-Id",
"title": "Beobachtete Nachrichten:"
},
"remove": {
"error": {
"not_found": "auto-role {} nicht gefunden!"
},
"success": "auto-role {} wurde entfernt :D"
},
"react": {
"success": "Alle Reaktionen wurden hinzugefügt"
},
"rule": {
"add": {
"error": {
"already_exists": "Regel für auto-role {} existiert bereits!",
"emoji_not_found": "Emoji {} für auto-role Regel {} nicht gefunden!",
"not_found": "Regel für auto-role {} nicht gefunden!",
"role_not_found": "Rolle {} für auto-role Regel {} nicht gefunden!"
},
"success": "Regel {} -> {} für auto-role {} wurde hinzugefügt :D"
},
"error": {
"id_not_found": "Kein auto-role Eintrag mit der Id gefunden!"
},
"list": {
"auto_role_rule_id": "auto-role Regel Id",
"description": "Von auto-role angewendete Regeln:",
"emoji": "Emoji",
"role": "Rolle",
"title": "auto-role Regeln:"
},
"remove": {
"error": {
"not_found": "Regel für auto-role {} nicht gefunden!"
},
"success": "Regel für auto-role {} wurde entfernt :D"
}
}
},
"base": {
"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": {
"api_key": "API Key",
"description": "Konfigurierte Gameserver:",
"name": "Name",
"title": "Gameserver"
},
"list_members": {
"description": "Konfigurierte Mitglieder:",
"title": "Mitglieder",
"users": "Mitglieder"
},
"remove": {
"success": "Gameserver wurde entfernt :D"
}
},
"goodbye_message": "Schade, dass du uns so schnell verlässt :(",
"info": {
"description": "Informationen über mich",
"fields": {
"deleted_message_count": "Gelöschte Nachrichten",
"modules": "Module",
"moved_users_count": "Verschobene Benutzer",
"ontime": "Ontime",
"received_command_count": "Empfangene Befehle",
"received_message_count": "Empfangene Nachrichten",
"sent_message_count": "Gesendete Nachrichten",
"version": "Version"
},
"footer": "",
"title": "Krümelmonster"
},
"mass_move": {
"channel_from_error": "Du musst dich in einem Voicechannel befinden oder die Option \"channel_from\" mit angeben.",
"moved": "Alle Personen aus {} wurden nach {} verschoben."
},
"member_joined_help_voice_channel": "{} braucht Hilfe, bitte kümmere dich drum :D",
"member_left_message": "{} hat uns leider verlassen :(",
"pong": "Pong",
"presence": {
"changed": "Presence wurde geändert.",
"max_char_count_exceeded": "Der Text darf nicht mehr als 128 Zeichen lang sein!",
"removed": "Presence wurde entfernt."
},
"register": {
"not_found": "Benutzer konnte nicht gefunden werden!",
"success": "Spieler wurde mit dem Mitglied verlinkt :D"
},
"technician_command_error_message": "Es gab ein Fehler mit dem Befehl: {} ausgelöst von {} -> {}\nDatum und Zeit: {}\nSchau bitte ins Log für Details.\nUUID: {}",
"technician_error_message": "Es gab ein Fehler mit dem Event: {}\nDatum und Zeit: {}\nSchau bitte ins Log für Details.\nUUID: {}",
"unregister": {
"success": "Verlinkung wurde entfernt :D"
},
"user": {
"birthday": {
"has_birthday": "Alles Gute zum Geburtag {} :D",
"success": "Dein Geburtstag wurde eingetragen.",
"success_team": "{} hat seinen Geburtstag eingetragen: {}"
},
"add": {
"xp": "Die {} von {} wurden um {} erhöht"
},
"atr": {
"discord_join": "Discord beigetreten am",
"id": "Id",
"joins": "Beitritte",
"last_join": "Server beigetreten am",
"lefts": "Abgänge",
"name": "Name",
"ontime": "Ontime",
"roles": "Rollen",
"warnings": "Verwarnungen",
"xp": "XP"
},
"error": {
"atr_not_found": "Das Attribut {} konnte nicht gefunden werden :("
},
"get": {
"ontime": "{} war insgesamt {} Stunden aktiv in einem Sprachkanal",
"xp": "{} hat {} xp"
},
"info": {
"footer": ""
},
"remove": {
"xp": "Die {} von {} wurden um {} verringert"
},
"reset": {
"ontime": "Die {} von {} wurden entfernt",
"xp": "Die {} von {} wurden entfernt"
},
"set": {
"error": {
"type_error": "Der angegebene Wert ist keine Zahl! :(",
"value_type_not_numeric": "Der angegebende Wert ist keine Ganzzahl! :("
},
"xp": "{} hat nun {} xp"
}
},
"warnings": {
"add": {
"failed": "Verwarnung konnte nicht hinzugefügt werden :(",
"success": "Verwarnung wurde hinzugefügt :)"
},
"first": "Bei der nächsten Verwarnung wirst du auf das vorherige Level zurückgesetzt!",
"kick": "Ich musste {} aufgrund zu vieler Verwarnungen kicken",
"remove": {
"failed": "Verwarnung konnte nicht entfernt werden :(",
"success": "Verwarnung wurde entfernt :)"
},
"removed": "Die Verwarnung '{}' wurde entfernt.",
"second": "Bei der nächsten verwarnung wirst du auf das erste Level zurückgesetzt!",
"show": {
"description": "Beschreibung",
"id": "Id"
},
"team_removed": "Die Verwarnung '{}' an {} wurde entfernt.",
"team_warned": "{} wurde verwarnt. Der Grund ist: {}",
"third": "Bei der nächsten verwarnung wirst du gekickt und zurückgesetzt!",
"warned": "Du wurdest verwarnt. Der Grund ist: {}"
},
"welcome_message": "Hello There!\nIch heiße dich bei {} herzlichst Willkommen!",
"welcome_message_for_team": "{} hat gerade das Irrenhaus betreten."
},
"boot_log": {
"login_message": "Ich bin on the line :D\nDer Scheiß hat {} Sekunden gedauert"
},
"level": {
"create": {
"created": "Level {} mit Berechtigungen {} wurde erstellt :D"
},
"down": {
"already_first": "{} hat bereits das erste Level.",
"failed": "{} konnte nicht runtergesetzt werden :(",
"success": "{} wurde auf Level {} runtergesetzt :)"
},
"edit": {
"color_invalid": "Die Farbe {} ist ungültig!",
"edited": "Level {} wurde bearbeitet :D",
"not_found": "Level {} nicht gefunden!",
"permission_invalid": "Der Berechtigungswert {} ist ungültig!"
},
"error": {
"level_with_name_already_exists": "Ein Level mit dem Namen {} existiert bereits!",
"level_with_xp_already_exists": "Das Level {} hat bereits die Mindest-XP {}!",
"nothing_found": "Keine Einträge gefunden."
},
"list": {
"description": "Konfigurierte Level:",
"min_xp": "Mindest-XP",
"name": "Name",
"permission_int": "Berechtigungen",
"title": "Level:"
},
"new_level_message": "{} ist nun Level {}",
"remove": {
"error": {
"not_found": "Level {} nicht gefunden!"
},
"success": "Level {} wurde entfernt :D"
},
"seeding_failed": "Levelsystem konnte nicht neu geladen werden :(",
"seeding_finished": "Levelsystem wurde erfolgreich neu geladen :)",
"seeding_started": "Levelsystem wird neu geladen...",
"set": {
"already_level": "{} hat bereits das Level {} :/",
"failed": "Das Level von {} konnte nicht auf {} gesetzt werden :(",
"not_found": "Das Level {} konnte nicht gefunden werden :(",
"success": "{} ist nun Level {} :)"
},
"up": {
"already_last": "{} hat bereits das höchste Level.",
"failed": "{} konnte nicht hochgesetzt werden :(",
"success": "{} wurde auf Level {} hochgesetzt :)"
}
},
"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": {
"success": "API-Schlüssel für {} wurde erstellt: {}"
},
"get": "API-Schlüssel für {}: {}",
"remove": {
"not_found": "API-Schlüssel konnte nicht gefunden werden!",
"success": "API-Schlüssel wurde entfernt :D"
}
},
"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 :)",
"synced_message": "Der Sync wurde abgeschlossen."
}
}
}

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,120 @@
from abc import ABC, abstractmethod
from typing import Optional
from cpl_query.extension import List
from bot_api.filter.auth_user_select_criteria import AuthUserSelectCriteria
from bot_api.model.auth_user_dto import AuthUserDTO
from bot_api.model.auth_user_filtered_result_dto import AuthUserFilteredResultDTO
from bot_api.model.email_string_dto import EMailStringDTO
from bot_api.model.o_auth_dto import OAuthDTO
from bot_api.model.reset_password_dto import ResetPasswordDTO
from bot_api.model.token_dto import TokenDTO
from bot_api.model.update_auth_user_dto import UpdateAuthUserDTO
from bot_data.model.auth_user import AuthUser
class AuthServiceABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def generate_token(self, user: AuthUser) -> str:
pass
@abstractmethod
def decode_token(self, token: str) -> dict:
pass
@abstractmethod
def get_decoded_token_from_request(self) -> dict:
pass
@abstractmethod
def find_decoded_token_from_request(self) -> Optional[dict]:
pass
@abstractmethod
async def get_all_auth_users_async(self) -> List[AuthUserDTO]:
pass
@abstractmethod
async def get_filtered_auth_users_async(self, criteria: AuthUserSelectCriteria) -> AuthUserFilteredResultDTO:
pass
@abstractmethod
async def get_auth_user_by_email_async(self, email: str, with_password: bool = False) -> AuthUserDTO:
pass
@abstractmethod
async def find_auth_user_by_email_async(self, email: str) -> AuthUserDTO:
pass
@abstractmethod
def add_auth_user(self, user_dto: AuthUserDTO):
pass
@abstractmethod
async def add_auth_user_by_oauth_async(self, dto: OAuthDTO):
pass
@abstractmethod
async def update_user_async(self, update_user_dto: UpdateAuthUserDTO):
pass
@abstractmethod
async def update_user_as_admin_async(self, update_user_dto: UpdateAuthUserDTO):
pass
@abstractmethod
async def delete_auth_user_by_email_async(self, email: str):
pass
@abstractmethod
async def delete_auth_user_async(self, user_dto: AuthUserDTO):
pass
@abstractmethod
async def verify_login(self, token_str: str) -> bool:
pass
@abstractmethod
def verify_api_key(self, api_key: str) -> bool:
pass
@abstractmethod
async def login_async(self, user_dto: AuthUserDTO) -> TokenDTO:
pass
@abstractmethod
async def login_discord_async(self, oauth_dto: AuthUserDTO, dc_id: int) -> TokenDTO:
pass
@abstractmethod
async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO:
pass
@abstractmethod
async def revoke_async(self, token_dto: TokenDTO):
pass
@abstractmethod
async def confirm_email_async(self, id: str) -> bool:
pass
@abstractmethod
async def forgot_password_async(self, email: str):
pass
@abstractmethod
async def confirm_forgot_password_async(self, id: str) -> EMailStringDTO:
pass
@abstractmethod
async def reset_password_async(self, rp_dto: ResetPasswordDTO):
pass
@abstractmethod
async def resend_confirmation_email_by_mail(self, mail: str):
pass

View File

@ -0,0 +1,15 @@
from abc import ABC, abstractmethod
class DtoABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def from_dict(self, values: dict):
pass
@abstractmethod
def to_dict(self) -> dict:
pass

View File

@ -0,0 +1,10 @@
from abc import ABC, abstractmethod
class SelectCriteriaABC(ABC):
@abstractmethod
def __init__(self, page_index: int, page_size: int, sort_direction: str, sort_column: str):
self.page_index = page_index
self.page_size = page_size
self.sort_direction = sort_direction
self.sort_column = sort_column

View File

@ -0,0 +1,17 @@
from abc import abstractmethod
from cpl_core.database import TableABC
from bot_api.abc.dto_abc import DtoABC
class TransformerABC:
@staticmethod
@abstractmethod
def to_db(dto: DtoABC) -> TableABC:
pass
@staticmethod
@abstractmethod
def to_dto(db: TableABC) -> DtoABC:
pass

174
bot/src/bot_api/api.py Normal file
View File

@ -0,0 +1,174 @@
import socket
import sys
import textwrap
import uuid
from functools import partial
from typing import Union, Optional
import eventlet
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_core.utils import CredentialManager
from eventlet import wsgi
from flask import Flask, request, jsonify, Response
from flask_cors import CORS
from flask_socketio import SocketIO
from werkzeug.exceptions import NotFound
from bot_api.configuration.api_settings import ApiSettings
from bot_api.configuration.authentication_settings import AuthenticationSettings
from bot_core.exception.service_error_code_enum import ServiceErrorCode
from bot_core.exception.service_exception import ServiceException
from bot_api.logging.api_logger import ApiLogger
from bot_api.model.error_dto import ErrorDTO
from bot_api.route.route import Route
class Api(Flask):
def __init__(
self,
logger: ApiLogger,
services: ServiceProviderABC,
api_settings: ApiSettings,
auth_settings: AuthenticationSettings,
*args,
**kwargs,
):
if not args:
kwargs.setdefault("import_name", __name__)
Flask.__init__(self, *args, **kwargs)
self._logger = logger
self._services = services
self._api_settings = api_settings
self._auth_settings = auth_settings
self._cors = CORS(self, support_credentials=True)
# register hooks
self.before_request(self.before_request_hook)
self.after_request(self.after_request_hook)
# register error handler
exc_class, code = self._get_exc_class_and_code(Exception)
self.register_error_handler(exc_class, self.handle_exception)
# websockets
# Added async_mode see link below
# https://github.com/miguelgrinberg/Flask-SocketIO/discussions/1849
# https://stackoverflow.com/questions/39370848/flask-socket-io-sometimes-client-calls-freeze-the-server
self._socketio = SocketIO(self, cors_allowed_origins="*", path="/api/socket.io", async_mode="eventlet")
self._socketio.on_event("connect", self.on_connect)
self._socketio.on_event("disconnect", self.on_disconnect)
self._socket: Optional[socket] = None
self._requests = {}
@staticmethod
def _get_methods_from_registered_route() -> Union[list[str], str]:
methods = ["Unknown"]
if (
request.path in Route.registered_routes
and len(Route.registered_routes[request.path]) >= 1
and "methods" in Route.registered_routes[request.path][1]
):
methods = Route.registered_routes[request.path][1]["methods"]
if len(methods) == 1:
return methods[0]
return methods
def _register_routes(self):
for path, f in Route.registered_routes.items():
route = f[0]
kwargs = f[1]
cls = None
qual_name_split = route.__qualname__.split(".")
if len(qual_name_split) > 0:
cls_type = vars(sys.modules[route.__module__])[qual_name_split[0]]
cls = self._services.get_service(cls_type)
partial_f = partial(route, self if cls is None else cls)
partial_f.__name__ = route.__name__
self.route(path, **kwargs)(partial_f)
def handle_exception(self, e: Exception):
self._logger.error(__name__, f"Caught error", e)
if isinstance(e, ServiceException):
ex: ServiceException = e
self._logger.error(__name__, ex.get_detailed_message())
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 500
elif isinstance(e, NotFound):
self._logger.error(__name__, e.description)
error = ErrorDTO(ServiceErrorCode.NotFound, e.description)
return jsonify(error.to_dict()), 404
else:
tracking_id = uuid.uuid4()
user_message = f"Tracking Id: {tracking_id}"
self._logger.error(__name__, user_message, e)
error = ErrorDTO(None, user_message)
return jsonify(error.to_dict()), 400
def before_request_hook(self):
request_id = uuid.uuid4()
self._requests[request] = request_id
method = request.access_control_request_method
self._logger.info(
__name__,
f"Received {request_id} @ {self._get_methods_from_registered_route() if method is None else method} {request.url} from {request.remote_addr}",
)
headers = str(request.headers).replace("\n", "\n\t\t")
data = request.get_data()
data = "" if len(data) == 0 else str(data.decode(encoding="utf-8"))
text = textwrap.dedent(
f"Request: {request_id}:\n\tHeader:\n\t\t{headers}\n\tUser-Agent: {request.user_agent.string}\n\tBody: {data}"
)
self._logger.trace(__name__, text)
def after_request_hook(self, response: Response):
method = request.access_control_request_method
request_id = f"{self._get_methods_from_registered_route() if method is None else method} {request.url} from {request.remote_addr}"
if request in self._requests:
request_id = self._requests[request]
self._logger.info(__name__, f"Answered {request_id}")
headers = str(request.headers).replace("\n", "\n\t\t")
data = request.get_data()
data = "" if len(data) == 0 else str(data.decode(encoding="utf-8"))
text = textwrap.dedent(f"Request: {request_id}:\n\tHeader:\n\t\t{headers}\n\tResponse: {data}")
self._logger.trace(__name__, text)
return response
def start(self):
self._logger.info(
__name__,
f"Starting API {self._api_settings.host}:{self._api_settings.port}",
)
self._register_routes()
self.secret_key = CredentialManager.decrypt(self._auth_settings.secret_key)
# from waitress import serve
# https://docs.pylonsproject.org/projects/waitress/en/stable/arguments.html
# serve(self, host=self._apt_settings.host, port=self._apt_settings.port, threads=10, connection_limit=1000, channel_timeout=10)
self._socket = eventlet.listen((self._api_settings.host, self._api_settings.port))
wsgi.server(self._socket, self, log_output=False)
def stop(self):
if self._socket is None:
return
self._socket.shutdown(socket.SHUT_RDWR)
self._socket.close()
def on_connect(self):
self._logger.info(__name__, f"Client connected")
def on_disconnect(self):
self._logger.info(__name__, f"Client disconnected")

View File

@ -0,0 +1,51 @@
import os
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceCollectionABC
from cpl_core.environment import ApplicationEnvironmentABC
from cpl_core.mailing import EMailClientABC, EMailClient
from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum
from cpl_discord.service.discord_collection_abc import DiscordCollectionABC
from flask import Flask
from bot_api.abc.auth_service_abc import AuthServiceABC
from bot_api.api import Api
from bot_api.api_thread import ApiThread
from bot_api.controller.auth_controller import AuthController
from bot_api.controller.auth_discord_controller import AuthDiscordController
from bot_api.controller.graphql_controller import GraphQLController
from bot_api.controller.gui_controller import GuiController
from bot_api.event.bot_api_on_ready_event import BotApiOnReadyEvent
from bot_api.service.auth_service import AuthService
from bot_api.service.discord_service import DiscordService
from bot_core.abc.module_abc import ModuleABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
class ApiModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.api_module)
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
cwd = env.working_directory
env.set_working_directory(os.path.dirname(os.path.realpath(__file__)))
config.add_json_file(f"config/apisettings.json", optional=False)
config.add_json_file(f"config/apisettings.{env.environment_name}.json", optional=True)
config.add_json_file(f"config/apisettings.{env.host_name}.json", optional=True)
env.set_working_directory(cwd)
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_singleton(EMailClientABC, EMailClient)
services.add_singleton(ApiThread)
services.add_singleton(Flask, Api)
services.add_transient(AuthServiceABC, AuthService)
services.add_transient(AuthController)
services.add_transient(AuthDiscordController)
services.add_transient(GuiController)
services.add_transient(DiscordService)
services.add_transient(GraphQLController)
# cpl-discord
services.add_transient(DiscordEventTypesEnum.on_ready.value, BotApiOnReadyEvent)

View File

@ -0,0 +1,26 @@
import threading
from bot_api.api import Api
from bot_api.logging.api_logger import ApiLogger
class ApiThread(threading.Thread):
def __init__(self, logger: ApiLogger, api: Api):
threading.Thread.__init__(self, daemon=True)
self._logger = logger
self._api = api
def run(self) -> None:
try:
self._logger.trace(__name__, f"Try to start {type(self._api).__name__}")
self._api.start()
except Exception as e:
self._logger.error(__name__, "Start failed", e)
def stop(self):
try:
self._logger.trace(__name__, f"Try to stop {type(self._api).__name__}")
self._api.stop()
except Exception as e:
self._logger.error(__name__, "Stop failed", e)

View File

@ -0,0 +1,19 @@
from cpl_core.application import ApplicationExtensionABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from bot_api.route.route import Route
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
class AppApiExtension(ApplicationExtensionABC):
def __init__(self):
ApplicationExtensionABC.__init__(self)
async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings)
if not feature_flags.get_flag(FeatureFlagsEnum.api_module):
return
Route.init_authorize()

View File

@ -0,0 +1,44 @@
{
"ProjectSettings": {
"Name": "bot-api",
"Version": {
"Major": "1",
"Minor": "2",
"Micro": "8"
},
"Author": "",
"AuthorEmail": "",
"Description": "",
"LongDescription": "",
"URL": "",
"CopyrightDate": "",
"CopyrightName": "",
"LicenseName": "",
"LicenseDescription": "",
"Dependencies": [
"cpl-core==2022.12.0"
],
"DevDependencies": [
"cpl-cli==2022.12.0"
],
"PythonVersion": ">=3.10.4",
"PythonPath": {},
"Classifiers": []
},
"BuildSettings": {
"ProjectType": "library",
"SourcePath": "",
"OutputPath": "../../dist",
"Main": "bot_api.main",
"EntryPoint": "bot-api",
"IncludePackageData": false,
"Included": [],
"Excluded": [
"*/__pycache__",
"*/logs",
"*/tests"
],
"PackageData": {},
"ProjectReferences": []
}
}

@ -0,0 +1 @@
Subproject commit 12ffcbcd9b88612251a1e23cb6724e21562f74b8

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.configuration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,22 @@
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
class ApiSettings(ConfigurationModelABC):
def __init__(self, port: int = None, host: str = None, redirect_uri: bool = None):
ConfigurationModelABC.__init__(self)
self._port = 80 if port is None else port
self._host = "" if host is None else host
self._redirect_to_https = False if redirect_uri is None else redirect_uri
@property
def port(self) -> int:
return self._port
@property
def host(self) -> str:
return self._host
@property
def redirect_to_https(self) -> bool:
return self._redirect_to_https

View File

@ -0,0 +1,39 @@
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
class AuthenticationSettings(ConfigurationModelABC):
def __init__(
self,
secret_key: str = None,
issuer: str = None,
audience: str = None,
token_expire_time: int = None,
refresh_token_expire_time: int = None,
):
ConfigurationModelABC.__init__(self)
self._secret_key = "" if secret_key is None else secret_key
self._issuer = "" if issuer is None else issuer
self._audience = "" if audience is None else audience
self._token_expire_time = 0 if token_expire_time is None else token_expire_time
self._refresh_token_expire_time = 0 if refresh_token_expire_time is None else refresh_token_expire_time
@property
def secret_key(self) -> str:
return self._secret_key
@property
def issuer(self) -> str:
return self._issuer
@property
def audience(self) -> str:
return self._audience
@property
def token_expire_time(self) -> int:
return self._token_expire_time
@property
def refresh_token_expire_time(self) -> int:
return self._refresh_token_expire_time

View File

@ -0,0 +1,40 @@
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_query.extension import List
class DiscordAuthenticationSettings(ConfigurationModelABC):
def __init__(
self,
client_secret: str = None,
redirect_uri: str = None,
scope: list = None,
token_url: str = None,
auth_url: str = None,
):
ConfigurationModelABC.__init__(self)
self._client_secret = "" if client_secret is None else client_secret
self._redirect_url = "" if redirect_uri is None else redirect_uri
self._scope = List() if scope is None else List(str, scope)
self._token_url = "" if token_url is None else token_url
self._auth_url = "" if auth_url is None else auth_url
@property
def client_secret(self) -> str:
return self._client_secret
@property
def redirect_url(self) -> str:
return self._redirect_url
@property
def scope(self) -> List[str]:
return self._scope
@property
def token_url(self) -> str:
return self._token_url
@property
def auth_url(self) -> str:
return self._auth_url

View File

@ -0,0 +1,12 @@
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
class FrontendSettings(ConfigurationModelABC):
def __init__(self, url: str = None):
ConfigurationModelABC.__init__(self)
self._url = "" if url is None else url
@property
def url(self) -> str:
return self._url

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.controller"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,184 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.environment import ApplicationEnvironmentABC
from cpl_core.mailing import EMailClientABC, EMailClientSettings
from cpl_translation import TranslatePipe
from flask import request, jsonify, Response
from bot_api.abc.auth_service_abc import AuthServiceABC
from bot_api.api import Api
from bot_api.filter.auth_user_select_criteria import AuthUserSelectCriteria
from bot_api.json_processor import JSONProcessor
from bot_api.logging.api_logger import ApiLogger
from bot_api.model.auth_user_dto import AuthUserDTO
from bot_api.model.reset_password_dto import ResetPasswordDTO
from bot_api.model.token_dto import TokenDTO
from bot_api.model.update_auth_user_dto import UpdateAuthUserDTO
from bot_api.route.route import Route
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.technician_config import TechnicianConfig
class AuthController:
BasePath = "/api/auth"
def __init__(
self,
config: ConfigurationABC,
env: ApplicationEnvironmentABC,
logger: ApiLogger,
t: TranslatePipe,
api: Api,
mail_settings: EMailClientSettings,
mailer: EMailClientABC,
auth_service: AuthServiceABC,
technician_config: TechnicianConfig,
):
self._config = config
self._env = env
self._logger = logger
self._t = t
self._api = api
self._mail_settings = mail_settings
self._mailer = mailer
self._auth_service = auth_service
self._technician_config = technician_config
@Route.get(f"{BasePath}/users")
@Route.authorize(role=AuthRoleEnum.admin)
async def get_all_users(self) -> Response:
result = await self._auth_service.get_all_auth_users_async()
return jsonify(result.select(lambda x: x.to_dict()).to_list())
@Route.post(f"{BasePath}/users/get/filtered")
@Route.authorize(role=AuthRoleEnum.admin)
async def get_filtered_users(self) -> Response:
dto: AuthUserSelectCriteria = JSONProcessor.process(
AuthUserSelectCriteria, request.get_json(force=True, silent=True)
)
result = await self._auth_service.get_filtered_auth_users_async(dto)
result.result = result.result.select(lambda x: x.to_dict()).to_list()
return jsonify(result.to_dict())
@Route.get(f"{BasePath}/users/get/<email>")
@Route.authorize
async def get_user_from_email(self, email: str) -> Response:
result = await self._auth_service.get_auth_user_by_email_async(email)
return jsonify(result.to_dict())
@Route.get(f"{BasePath}/users/find/<email>")
@Route.authorize
async def find_user_from_email(self, email: str) -> Response:
result = await self._auth_service.find_auth_user_by_email_async(email)
return jsonify(result.to_dict())
@Route.post(f"{BasePath}/register")
async def register(self):
if not FeatureFlagsSettings.get_flag_from_dict(
self._technician_config.feature_flags, FeatureFlagsEnum.basic_registration
):
return
dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True))
self._auth_service.add_auth_user(dto)
return "", 200
@Route.post(f"{BasePath}/resend-confirmation-email-by-mail/<mail>")
async def resend_confirmation_email_by_user_id(self, mail: str):
await self._auth_service.resend_confirmation_email_by_mail(mail)
return "", 200
@Route.post(f"{BasePath}/register-by-id/<id>")
async def register_id(self, id: str):
result = await self._auth_service.confirm_email_async(id)
return jsonify(result)
@Route.post(f"{BasePath}/login")
async def login(self) -> Response:
if not FeatureFlagsSettings.get_flag_from_dict(
self._technician_config.feature_flags, FeatureFlagsEnum.basic_login
):
return jsonify({})
dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True))
result = await self._auth_service.login_async(dto)
return jsonify(result.to_dict())
@Route.get(f"{BasePath}/verify-login")
async def verify_login(self):
token = None
result = False
if "Authorization" in request.headers:
bearer = request.headers.get("Authorization")
token = bearer.split()[1]
if token is not None:
result = self._auth_service.verify_login(token)
return jsonify(result)
@Route.post(f"{BasePath}/forgot-password/<email>")
async def forgot_password(self, email: str):
if not FeatureFlagsSettings.get_flag_from_dict(
self._technician_config.feature_flags, FeatureFlagsEnum.basic_login
):
return "", 409
await self._auth_service.forgot_password_async(email)
return "", 200
@Route.post(f"{BasePath}/confirm-forgot-password/<id>")
async def confirm_forgot_password(self, id: str):
result = await self._auth_service.confirm_forgot_password_async(id)
return jsonify(result.to_dict())
@Route.post(f"{BasePath}/reset-password")
async def reset_password(self):
if not FeatureFlagsSettings.get_flag_from_dict(
self._technician_config.feature_flags, FeatureFlagsEnum.basic_login
):
return "", 409
dto: ResetPasswordDTO = JSONProcessor.process(ResetPasswordDTO, request.get_json(force=True, silent=True))
await self._auth_service.reset_password_async(dto)
return "", 200
@Route.post(f"{BasePath}/update-user")
@Route.authorize
async def update_user(self):
dto: UpdateAuthUserDTO = JSONProcessor.process(UpdateAuthUserDTO, request.get_json(force=True, silent=True))
await self._auth_service.update_user_async(dto)
return "", 200
@Route.post(f"{BasePath}/update-user-as-admin")
@Route.authorize(role=AuthRoleEnum.admin)
async def update_user_as_admin(self):
dto: UpdateAuthUserDTO = JSONProcessor.process(UpdateAuthUserDTO, request.get_json(force=True, silent=True))
await self._auth_service.update_user_as_admin_async(dto)
return "", 200
@Route.post(f"{BasePath}/refresh")
async def refresh(self) -> Response:
dto: TokenDTO = JSONProcessor.process(TokenDTO, request.get_json(force=True, silent=True))
result = await self._auth_service.refresh_async(dto)
return jsonify(result.to_dict())
@Route.post(f"{BasePath}/revoke")
async def revoke(self):
dto: TokenDTO = JSONProcessor.process(TokenDTO, request.get_json(force=True, silent=True))
await self._auth_service.revoke_async(dto)
return "", 200
@Route.post(f"{BasePath}/delete-user")
@Route.authorize(role=AuthRoleEnum.admin)
async def delete_user(self):
dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True))
await self._auth_service.delete_auth_user_async(dto)
return "", 200
@Route.post(f"{BasePath}/delete-user-by-mail/<email>")
@Route.authorize(role=AuthRoleEnum.admin)
async def delete_user_by_mail(self, email: str):
await self._auth_service.delete_auth_user_by_email_async(email)
return "", 200

View File

@ -0,0 +1,100 @@
import os
import uuid
from cpl_core.configuration import ConfigurationABC
from cpl_core.environment import ApplicationEnvironmentABC
from cpl_core.mailing import EMailClientABC, EMailClientSettings
from cpl_core.utils import CredentialManager
from cpl_discord.service import DiscordBotServiceABC
from cpl_translation import TranslatePipe
from flask import jsonify, Response
from flask import request
from requests_oauthlib import OAuth2Session
from bot_api.abc.auth_service_abc import AuthServiceABC
from bot_api.api import Api
from bot_api.configuration.discord_authentication_settings import (
DiscordAuthenticationSettings,
)
from bot_core.exception.service_exception import ServiceException
from bot_api.logging.api_logger import ApiLogger
from bot_api.model.auth_user_dto import AuthUserDTO
from bot_api.route.route import Route
from bot_data.model.auth_role_enum import AuthRoleEnum
# Disable SSL requirement
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
class AuthDiscordController:
BasePath = "/api/auth/discord"
def __init__(
self,
auth_settings: DiscordAuthenticationSettings,
config: ConfigurationABC,
env: ApplicationEnvironmentABC,
logger: ApiLogger,
bot: DiscordBotServiceABC,
t: TranslatePipe,
api: Api,
mail_settings: EMailClientSettings,
mailer: EMailClientABC,
auth_service: AuthServiceABC,
):
self._auth_settings = auth_settings
self._config = config
self._env = env
self._logger = logger
self._bot = bot
self._t = t
self._api = api
self._mail_settings = mail_settings
self._mailer = mailer
self._auth_service = auth_service
def _get_user_from_discord_response(self) -> dict:
discord = OAuth2Session(
self._bot.user.id,
redirect_uri=self._auth_settings.redirect_url,
state=request.args.get("state"),
scope=self._auth_settings.scope.to_list(),
)
token = discord.fetch_token(
self._auth_settings.token_url,
client_secret=CredentialManager.decrypt(self._auth_settings.client_secret),
authorization_response=request.url,
)
discord = OAuth2Session(self._bot.user.id, token=token)
return discord.get("https://discordapp.com/api" + "/users/@me").json()
@Route.get(f"{BasePath}/get-url")
async def get_url(self):
oauth = OAuth2Session(
self._bot.user.id,
redirect_uri=self._auth_settings.redirect_url,
scope=self._auth_settings.scope.to_list(),
)
login_url, state = oauth.authorization_url(self._auth_settings.auth_url)
return jsonify({"loginUrl": login_url})
@Route.get(f"{BasePath}/login")
async def discord_login(self) -> Response:
response = self._get_user_from_discord_response()
dto = AuthUserDTO(
0,
response["username"],
response["discriminator"],
response["email"],
str(uuid.uuid4()),
None,
AuthRoleEnum.normal,
)
try:
result = await self._auth_service.login_discord_async(dto, response["id"])
return jsonify(result.to_dict())
except ServiceException as e:
r = jsonify({"email": dto.email})
r.status_code = 403
return r

View File

@ -0,0 +1,44 @@
from ariadne import graphql_sync
from ariadne.explorer import ExplorerPlayground
from cpl_core.configuration import ConfigurationABC
from cpl_core.environment import ApplicationEnvironmentABC
from flask import request, jsonify
from bot_api.logging.api_logger import ApiLogger
from bot_api.route.route import Route
from bot_graphql.schema import Schema
class GraphQLController:
BasePath = f"/api/graphql"
def __init__(
self,
config: ConfigurationABC,
env: ApplicationEnvironmentABC,
logger: ApiLogger,
schema: Schema,
):
self._config = config
self._env = env
self._logger = logger
self._schema = schema
@Route.get(f"{BasePath}/playground")
@Route.authorize(skip_in_dev=True)
async def playground(self):
if self._env.environment_name != "development":
return "", 403
return ExplorerPlayground().html(None), 200
@Route.post(f"{BasePath}")
@Route.authorize(by_api_key=True)
async def graphql(self):
data = request.get_json()
# Note: Passing the request to the context is optional.
# In Flask, the current request is always accessible as flask.request
success, result = graphql_sync(self._schema.schema, data, context_value=request)
return jsonify(result), 200 if success else 400

View File

@ -0,0 +1,95 @@
import os
from cpl_core.configuration import ConfigurationABC
from cpl_core.environment import ApplicationEnvironmentABC
from cpl_core.mailing import EMail, EMailClientABC, EMailClientSettings
from cpl_translation import TranslatePipe
from flask import jsonify
from bot_api.api import Api
from bot_api.configuration.authentication_settings import AuthenticationSettings
from bot_api.logging.api_logger import ApiLogger
from bot_api.model.settings_dto import SettingsDTO
from bot_api.model.version_dto import VersionDTO
from bot_api.route.route import Route
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_data.model.technician_config import TechnicianConfig
class GuiController:
BasePath = f"/api/gui"
def __init__(
self,
config: ConfigurationABC,
env: ApplicationEnvironmentABC,
logger: ApiLogger,
t: TranslatePipe,
api: Api,
mail_settings: EMailClientSettings,
mailer: EMailClientABC,
auth_settings: AuthenticationSettings,
):
self._config = config
self._env = env
self._logger = logger
self._t = t
self._api = api
self._mail_settings = mail_settings
self._mailer = mailer
self._auth_settings = auth_settings
@Route.get(f"{BasePath}/api-version")
async def api_version(self):
import bot_api
version = bot_api.version_info
return VersionDTO(version.major, version.minor, version.micro).to_dict()
@Route.get(f"{BasePath}/settings")
@Route.authorize
async def settings(self):
import bot_api
version = bot_api.version_info
return jsonify(
SettingsDTO(
"",
VersionDTO(version.major, version.minor, version.micro),
os.path.abspath(os.path.join(self._env.working_directory, "config")),
"/",
"/",
self._auth_settings.token_expire_time,
self._auth_settings.refresh_token_expire_time,
self._mail_settings.user_name,
self._mail_settings.port,
self._mail_settings.host,
self._mail_settings.user_name,
self._mail_settings.user_name,
).to_dict()
)
@Route.post(f"{BasePath}/send-test-mail/<email>")
@Route.authorize
async def send_test_mail(self, email: str):
mail = EMail()
mail.add_header("Mime-Version: 1.0")
mail.add_header("Content-Type: text/plain; charset=utf-8")
mail.add_header("Content-Transfer-Encoding: quoted-printable")
mail.add_receiver(email)
mail.subject = self._t.transform("api.api.test_mail.subject")
mail.body = self._t.transform("api.api.test_mail.message").format(
self._env.host_name, self._env.environment_name
)
self._mailer.send_mail(mail)
return "", 200
@Route.get(f"{BasePath}/has-feature-flag/<flag>")
async def has_feature_flag(self, flag: str):
settings: TechnicianConfig = self._config.get_configuration(TechnicianConfig)
return {
"key": flag,
"value": FeatureFlagsSettings.get_flag_from_dict(settings.feature_flags, FeatureFlagsEnum(flag)),
}

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.event"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,12 @@
from cpl_discord.events import OnReadyABC
from bot_api.api_thread import ApiThread
class BotApiOnReadyEvent(OnReadyABC):
def __init__(self, api: ApiThread):
OnReadyABC.__init__(self)
self._api = api
async def on_ready(self):
self._api.start()

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.filter"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,21 @@
from bot_api.abc.select_criteria_abc import SelectCriteriaABC
class AuthUserSelectCriteria(SelectCriteriaABC):
def __init__(
self,
page_index: int,
page_size: int,
sort_direction: str,
sort_column: str,
first_name: str,
last_name: str,
email: str,
auth_role: int,
):
SelectCriteriaABC.__init__(self, page_index, page_size, sort_direction, sort_column)
self.first_name = first_name
self.last_name = last_name
self.email = email
self.auth_role = auth_role

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.filter.discord"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,15 @@
from bot_api.abc.select_criteria_abc import SelectCriteriaABC
class ServerSelectCriteria(SelectCriteriaABC):
def __init__(
self,
page_index: int,
page_size: int,
sort_direction: str,
sort_column: str,
name: str,
):
SelectCriteriaABC.__init__(self, page_index, page_size, sort_direction, sort_column)
self.name = name

View File

@ -0,0 +1,42 @@
import enum
from inspect import signature, Parameter
from cpl_core.utils import String
class JSONProcessor:
@staticmethod
def process(_t: type, values: dict) -> object:
args = []
sig = signature(_t.__init__)
for param in sig.parameters.items():
parameter = param[1]
if parameter.name == "self" or parameter.annotation == Parameter.empty:
continue
name = String.convert_to_camel_case(parameter.name)
name = name.replace("Dto", "DTO")
name_first_lower = String.first_to_lower(name)
if name in values or name_first_lower in values:
value = ""
if name in values:
value = values[name]
else:
value = values[name_first_lower]
if isinstance(value, dict):
value = JSONProcessor.process(parameter.annotation, value)
if issubclass(parameter.annotation, enum.Enum):
value = parameter.annotation(value)
args.append(value)
elif parameter.default != Parameter.empty:
args.append(parameter.default)
else:
args.append(None)
return _t(*args)

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.logging"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,15 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.environment import ApplicationEnvironmentABC
from cpl_core.time import TimeFormatSettings
from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC
class ApiLogger(CustomFileLoggerABC):
def __init__(
self,
config: ConfigurationABC,
time_format: TimeFormatSettings,
env: ApplicationEnvironmentABC,
):
CustomFileLoggerABC.__init__(self, "Api", config, time_format, env)

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.model"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,136 @@
from datetime import datetime
from typing import Optional
from cpl_query.extension import List
from bot_api.abc.dto_abc import DtoABC
from bot_api.model.user_dto import UserDTO
from bot_data.model.auth_role_enum import AuthRoleEnum
class AuthUserDTO(DtoABC):
def __init__(
self,
id: int = None,
first_name: str = None,
last_name: str = None,
email: str = None,
password: str = None,
confirmation_id: Optional[str] = None,
auth_role: AuthRoleEnum = None,
users: List[UserDTO] = None,
created_at: datetime = None,
modified_at: datetime = None,
):
DtoABC.__init__(self)
self._id = id
self._first_name = first_name
self._last_name = last_name
self._email = email
self._password = password
self._is_confirmed = confirmation_id is None
self._auth_role = auth_role
self._created_at = created_at
self._modified_at = modified_at
if users is None:
self._users = List(UserDTO)
else:
self._users = users
@property
def id(self) -> int:
return self._id
@property
def first_name(self) -> str:
return self._first_name
@first_name.setter
def first_name(self, value: str):
self._first_name = value
@property
def last_name(self) -> str:
return self._last_name
@last_name.setter
def last_name(self, value: str):
self._last_name = value
@property
def email(self) -> str:
return self._email
@email.setter
def email(self, value: str):
self._email = value
@property
def password(self) -> str:
return self._password
@password.setter
def password(self, value: str):
self._password = value
@property
def is_confirmed(self) -> Optional[str]:
return self._is_confirmed
@is_confirmed.setter
def is_confirmed(self, value: Optional[str]):
self._is_confirmed = value
@property
def auth_role(self) -> AuthRoleEnum:
return self._auth_role
@auth_role.setter
def auth_role(self, value: AuthRoleEnum):
self._auth_role = value
@property
def users(self) -> List[UserDTO]:
return self._users
@property
def created_at(self) -> datetime:
return self._created_at
@property
def modified_at(self) -> datetime:
return self._modified_at
def from_dict(self, values: dict):
self._id = values["id"]
self._first_name = values["firstName"]
self._last_name = values["lastName"]
self._email = values["email"]
self._password = values["password"]
self._is_confirmed = values["isConfirmed"]
self._auth_role = AuthRoleEnum(values["authRole"])
if "users" in values:
self._users = List(UserDTO)
for u in values["users"]:
user = UserDTO()
user.from_dict(u)
self._users.add(user)
self._created_at = values["createdAt"]
self._modified_at = values["modifiedAt"]
def to_dict(self) -> dict:
return {
"id": self._id,
"firstName": self._first_name,
"lastName": self._last_name,
"email": self._email,
"password": self._password,
"isConfirmed": self._is_confirmed,
"authRole": self._auth_role.value,
"users": self._users.select(lambda u: u.to_dict()).to_list(),
"createdAt": self._created_at,
"modifiedAt": self._modified_at,
}

View File

@ -0,0 +1,17 @@
from cpl_query.extension import List
from bot_api.abc.dto_abc import DtoABC
from bot_data.filtered_result import FilteredResult
class AuthUserFilteredResultDTO(DtoABC, FilteredResult):
def __init__(self, result: List = None, total_count: int = 0):
DtoABC.__init__(self)
FilteredResult.__init__(self, result, total_count)
def from_dict(self, values: dict):
self._result = values["users"]
self._total_count = values["totalCount"]
def to_dict(self) -> dict:
return {"users": self.result, "totalCount": self.total_count}

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.model.discord"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,56 @@
from typing import Optional
from bot_api.abc.dto_abc import DtoABC
class ServerDTO(DtoABC):
def __init__(
self,
server_id: int,
discord_id: int,
name: str,
member_count: int,
icon_url: Optional[str],
):
DtoABC.__init__(self)
self._server_id = server_id
self._discord_id = discord_id
self._name = name
self._member_count = member_count
self._icon_url = icon_url
@property
def server_id(self) -> int:
return self._server_id
@property
def discord_id(self) -> int:
return self._discord_id
@property
def name(self) -> str:
return self._name
@property
def member_count(self) -> int:
return self._member_count
@property
def icon_url(self) -> Optional[str]:
return self._icon_url
def from_dict(self, values: dict):
self._server_id = int(values["serverId"])
self._discord_id = int(values["discordId"])
self._name = values["name"]
self._icon_url = values["iconURL"]
def to_dict(self) -> dict:
return {
"serverId": self._server_id,
"discordId": self._discord_id,
"name": self._name,
"memberCount": self._member_count,
"iconURL": self._icon_url,
}

View File

@ -0,0 +1,17 @@
from cpl_query.extension import List
from bot_api.abc.dto_abc import DtoABC
from bot_data.filtered_result import FilteredResult
class ServerFilteredResultDTO(DtoABC, FilteredResult):
def __init__(self, result: List = None, total_count: int = 0):
DtoABC.__init__(self)
FilteredResult.__init__(self, result, total_count)
def from_dict(self, values: dict):
self._result = values["servers"]
self._total_count = values["totalCount"]
def to_dict(self) -> dict:
return {"servers": self.result, "totalCount": self.total_count}

View File

@ -0,0 +1,18 @@
import traceback
from cpl_core.console import Console
from bot_api.abc.dto_abc import DtoABC
class EMailStringDTO(DtoABC):
def __init__(self, email: str):
DtoABC.__init__(self)
self._email = email
def from_dict(self, values: dict):
self._email = values["email"]
def to_dict(self) -> dict:
return {"email": self._email}

View File

@ -0,0 +1,27 @@
from typing import Optional
from bot_api.abc.dto_abc import DtoABC
from bot_core.exception.service_error_code_enum import ServiceErrorCode
class ErrorDTO(DtoABC):
def __init__(self, error_code: Optional[ServiceErrorCode], message: str):
DtoABC.__init__(self)
self._error_code = ServiceErrorCode.Unknown if error_code is None else error_code
self._message = message
@property
def error_code(self) -> ServiceErrorCode:
return self._error_code
@property
def message(self) -> str:
return self._message
def from_dict(self, values: dict):
self._error_code = values["ErrorCode"]
self._message = values["Message"]
def to_dict(self) -> dict:
return {"errorCode": int(self._error_code.value), "message": self._message}

View File

@ -0,0 +1,40 @@
from typing import Optional
from bot_api.abc.dto_abc import DtoABC
from bot_api.model.auth_user_dto import AuthUserDTO
from bot_data.model.auth_role_enum import AuthRoleEnum
class OAuthDTO(DtoABC):
def __init__(
self,
user: AuthUserDTO,
o_auth_id: Optional[str],
):
DtoABC.__init__(self)
self._user = user
self._oauth_id = o_auth_id
@property
def user(self) -> AuthUserDTO:
return self._user
@user.setter
def user(self, value: AuthUserDTO):
self._user = value
@property
def oauth_id(self) -> Optional[str]:
return self._oauth_id
@oauth_id.setter
def oauth_id(self, value: Optional[str]):
self._oauth_id = value
def from_dict(self, values: dict):
self._user = AuthUserDTO().from_dict(values["user"])
self._oauth_id = values["oAuthId"]
def to_dict(self) -> dict:
return {"user": self._user.to_dict(), "oAuthId": self._oauth_id}

View File

@ -0,0 +1,28 @@
import traceback
from cpl_core.console import Console
from bot_api.abc.dto_abc import DtoABC
class ResetPasswordDTO(DtoABC):
def __init__(self, id: str, password: str):
DtoABC.__init__(self)
self._id = id
self._password = password
@property
def id(self) -> str:
return self._id
@property
def password(self) -> str:
return self._password
def from_dict(self, values: dict):
self._id = values["id"]
self._password = values["password"]
def to_dict(self) -> dict:
return {"id": self._id, "password": self._password}

View File

@ -0,0 +1,66 @@
from bot_api.abc.dto_abc import DtoABC
from bot_api.model.version_dto import VersionDTO
class SettingsDTO(DtoABC):
def __init__(
self,
web_version: str,
api_version: VersionDTO,
config_path: str,
web_base_url: str,
api_base_url: str,
token_expire_time: int,
refresh_token_expire_time: int,
mail_user: str,
mail_port: int,
mail_host: str,
mail_transceiver: str,
mail_transceiver_address: str,
):
DtoABC.__init__(self)
self._web_version = web_version
self._api_version = api_version
self._config_path = config_path
self._web_base_url = web_base_url
self._api_base_url = api_base_url
self._token_expire_time = token_expire_time
self._refresh_token_expire_time = refresh_token_expire_time
self._mail_user = mail_user
self._mail_port = mail_port
self._mail_host = mail_host
self._mail_transceiver = mail_transceiver
self._mail_transceiver_address = mail_transceiver_address
def from_dict(self, values: dict):
self._web_version = values["webVersion"]
self._api_version.from_dict(values["apiVersion"])
self._config_path = values["configPath"]
self._web_base_url = values["webBaseURL"]
self._api_base_url = values["apiBaseURL"]
self._token_expire_time = values["tokenExpireTime"]
self._refresh_token_expire_time = values["refreshTokenExpireTime"]
self._mail_user = values["mailUser"]
self._mail_port = values["mailPort"]
self._mail_host = values["mailHost"]
self._mail_transceiver = values["mailTransceiver"]
self._mail_transceiver_address = values["mailTransceiverAddress"]
def to_dict(self) -> dict:
return {
"webVersion": self._web_version,
"apiVersion": self._api_version.str,
"configPath": self._config_path,
"webBaseURL": self._web_base_url,
"apiBaseURL": self._api_base_url,
"tokenExpireTime": self._token_expire_time,
"refreshTokenExpireTime": self._refresh_token_expire_time,
"mailUser": self._mail_user,
"mailPort": self._mail_port,
"mailHost": self._mail_host,
"mailTransceiver": self._mail_transceiver,
"mailTransceiverAddress": self._mail_transceiver_address,
}

View File

@ -0,0 +1,34 @@
from bot_api.abc.dto_abc import DtoABC
class TokenDTO(DtoABC):
def __init__(self, token: str, refresh_token: str, first_login: bool = False):
DtoABC.__init__(self)
self._token = token
self._refresh_token = refresh_token
self._first_login = first_login
@property
def token(self) -> str:
return self._token
@property
def refresh_token(self) -> str:
return self._refresh_token
@property
def first_login(self) -> bool:
return self._first_login
def from_dict(self, values: dict):
self._token = values["token"]
self._refresh_token = values["refreshToken"]
self._first_login = values["firstLogin"]
def to_dict(self) -> dict:
return {
"token": self._token,
"refreshToken": self._refresh_token,
"firstLogin": self._first_login,
}

View File

@ -0,0 +1,44 @@
import traceback
from cpl_core.console import Console
from bot_api.abc.dto_abc import DtoABC
from bot_api.model.auth_user_dto import AuthUserDTO
class UpdateAuthUserDTO(DtoABC):
def __init__(
self,
auth_user_dto: AuthUserDTO,
new_auth_user_dto: AuthUserDTO,
change_password: bool = False,
):
DtoABC.__init__(self)
self._auth_user = auth_user_dto
self._new_auth_user = new_auth_user_dto
self._change_password = change_password
@property
def auth_user(self) -> AuthUserDTO:
return self._auth_user
@property
def new_auth_user(self) -> AuthUserDTO:
return self._new_auth_user
@property
def change_password(self) -> bool:
return self._change_password
def from_dict(self, values: dict):
self._auth_user = AuthUserDTO().from_dict(values["authUser"])
self._new_auth_user = AuthUserDTO().from_dict(values["newAuthUser"])
self._change_password = False if "changePassword" not in values else bool(values["changePassword"])
def to_dict(self) -> dict:
return {
"authUser": self._auth_user,
"newAuthUser": self._new_auth_user,
"changePassword": self._change_password,
}

View File

@ -0,0 +1,76 @@
from typing import Optional
from bot_api.abc.dto_abc import DtoABC
from bot_data.model.server import Server
class UserDTO(DtoABC):
def __init__(
self,
id: int = None,
dc_id: int = None,
xp: int = None,
server: Optional[Server] = None,
is_technician: Optional[bool] = None,
is_admin: Optional[bool] = None,
is_moderator: Optional[bool] = None,
):
DtoABC.__init__(self)
self._user_id = id
self._discord_id = dc_id
self._xp = xp
self._server = server
self._is_technician = is_technician
self._is_admin = is_admin
self._is_moderator = is_moderator
@property
def user_id(self) -> int:
return self._user_id
@property
def discord_id(self) -> int:
return self._discord_id
@property
def xp(self) -> int:
return self._xp
@xp.setter
def xp(self, value: int):
self._xp = value
@property
def server(self) -> Optional[Server]:
return self._server
@property
def is_technician(self) -> bool:
return self._is_technician if self._is_technician is not None else False
@property
def is_admin(self) -> bool:
return self._is_admin if self._is_admin is not None else False
@property
def is_moderator(self) -> bool:
return self._is_moderator if self._is_moderator is not None else False
def from_dict(self, values: dict):
self._user_id = values["id"]
self._discord_id = values["dcId"]
self._xp = values["xp"]
self._server = values["server"]
def to_dict(self) -> dict:
return {
"id": self._user_id,
"dcId": self._discord_id,
"xp": self._xp,
"server": self._server.id,
"isTechnician": self.is_technician,
"isAdmin": self.is_admin,
"isModerator": self.is_moderator,
}

View File

@ -0,0 +1,42 @@
import traceback
from cpl_core.console import Console
from bot_api.abc.dto_abc import DtoABC
class VersionDTO(DtoABC):
def __init__(self, major: str = None, minor: str = None, micro: str = None):
DtoABC.__init__(self)
self._major = major
self._minor = minor
self._micro = micro
@property
def major(self) -> str:
return self._major
@property
def minor(self) -> str:
return self._minor
@property
def micro(self) -> str:
return self._micro
@property
def str(self) -> str:
return f"{self._major}.{self._minor}.{self._micro}"
def from_dict(self, values: dict):
self._major = values["major"]
self._minor = values["minor"]
self._micro = values["micro"]
def to_dict(self) -> dict:
return {
"major": self._major,
"minor": self._minor,
"micro": self._micro,
}

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.route"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,171 @@
import functools
from functools import wraps
from typing import Optional, Callable, Union
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_core.environment import ApplicationEnvironmentABC
from flask import request, jsonify
from flask_cors import cross_origin
from bot_api.abc.auth_service_abc import AuthServiceABC
from bot_core.exception.service_error_code_enum import ServiceErrorCode
from bot_core.exception.service_exception import ServiceException
from bot_api.model.error_dto import ErrorDTO
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.auth_user import AuthUser
class Route:
registered_routes = {}
_auth_users: Optional[AuthUserRepositoryABC] = None
_auth: Optional[AuthServiceABC] = None
_env = "production"
@classmethod
@ServiceProviderABC.inject
def init_authorize(
cls,
env: ApplicationEnvironmentABC,
auth_users: AuthUserRepositoryABC,
auth: AuthServiceABC,
):
cls._auth_users = auth_users
cls._auth = auth
cls._env = env.environment_name
@classmethod
def get_user(cls) -> Optional[Union[str, AuthUser]]:
token = None
api_key = None
authorization = request.headers.get("Authorization").split()
match authorization[0]:
case "Bearer":
token = authorization[1]
case "API-Key":
api_key = authorization[1]
if api_key is not None:
return "system"
if token is None:
return None
jwt = cls._auth.decode_token(token)
user = cls._auth_users.get_auth_user_by_email(jwt["email"])
return user
@classmethod
def authorize(
cls,
f: Callable = None,
role: AuthRoleEnum = None,
skip_in_dev=False,
by_api_key=False,
):
if f is None:
return functools.partial(cls.authorize, role=role, skip_in_dev=skip_in_dev, by_api_key=by_api_key)
@wraps(f)
async def decorator(*args, **kwargs):
if skip_in_dev and cls._env == "development":
return await f(*args, **kwargs)
token = None
api_key = None
if "Authorization" in request.headers:
if " " not in request.headers.get("Authorization"):
ex = ServiceException(ServiceErrorCode.Unauthorized, f"Token not set")
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 401
authorization = request.headers.get("Authorization").split()
match authorization[0]:
case "Bearer":
token = authorization[1]
case "API-Key":
api_key = authorization[1]
if api_key is not None:
valid = False
try:
valid = cls._auth.verify_api_key(api_key)
except ServiceException as e:
error = ErrorDTO(e.error_code, e.message)
return jsonify(error.to_dict()), 403
except Exception as e:
return jsonify(e), 500
if not valid:
ex = ServiceException(ServiceErrorCode.Unauthorized, f"API-Key invalid")
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 401
return await f(*args, **kwargs)
if token is None:
ex = ServiceException(ServiceErrorCode.Unauthorized, f"Token not set")
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 401
if cls._auth_users is None or cls._auth is None:
ex = ServiceException(ServiceErrorCode.Unauthorized, f"Authorize is not initialized")
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 401
if not cls._auth.verify_login(token):
ex = ServiceException(ServiceErrorCode.Unauthorized, f"Token expired")
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 401
token = cls._auth.decode_token(token)
if token is None or "email" not in token:
ex = ServiceException(ServiceErrorCode.Unauthorized, f"Token invalid")
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 401
user = cls._auth_users.get_auth_user_by_email(token["email"])
if user is None:
ex = ServiceException(ServiceErrorCode.Unauthorized, f"Token invalid")
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 401
if role is not None and user.auth_role.value < role.value:
ex = ServiceException(ServiceErrorCode.Unauthorized, f"Role {role} required")
error = ErrorDTO(ex.error_code, ex.message)
return jsonify(error.to_dict()), 403
return await f(*args, **kwargs)
return decorator
@classmethod
def route(cls, path=None, **kwargs):
# simple decorator for class based views
def inner(fn):
cross_origin(fn)
cls.registered_routes[path] = (fn, kwargs)
return fn
return inner
@classmethod
def get(cls, path=None, **kwargs):
return cls.route(path, methods=["GET"], **kwargs)
@classmethod
def post(cls, path=None, **kwargs):
return cls.route(path, methods=["POST"], **kwargs)
@classmethod
def head(cls, path=None, **kwargs):
return cls.route(path, methods=["HEAD"], **kwargs)
@classmethod
def put(cls, path=None, **kwargs):
return cls.route(path, methods=["PUT"], **kwargs)
@classmethod
def delete(cls, path=None, **kwargs):
return cls.route(path, methods=["DELETE"], **kwargs)

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.service"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,605 @@
import hashlib
import re
import uuid
from datetime import datetime, timedelta, timezone
from threading import Thread
from typing import Optional
import jwt
from cpl_core.database.context import DatabaseContextABC
from cpl_core.environment import ApplicationEnvironmentABC
from cpl_core.mailing import EMail, EMailClientABC
from cpl_core.utils import CredentialManager
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from cpl_translation import TranslatePipe
from flask import request
from bot_api.abc.auth_service_abc import AuthServiceABC
from bot_api.configuration.authentication_settings import AuthenticationSettings
from bot_api.configuration.frontend_settings import FrontendSettings
from bot_core.exception.service_error_code_enum import ServiceErrorCode
from bot_core.exception.service_exception import ServiceException
from bot_api.filter.auth_user_select_criteria import AuthUserSelectCriteria
from bot_api.logging.api_logger import ApiLogger
from bot_api.model.auth_user_dto import AuthUserDTO
from bot_api.model.auth_user_filtered_result_dto import AuthUserFilteredResultDTO
from bot_api.model.email_string_dto import EMailStringDTO
from bot_api.model.o_auth_dto import OAuthDTO
from bot_api.model.reset_password_dto import ResetPasswordDTO
from bot_api.model.token_dto import TokenDTO
from bot_api.model.update_auth_user_dto import UpdateAuthUserDTO
from bot_api.transformer.auth_user_transformer import AuthUserTransformer as AUT
from bot_data.abc.api_key_repository_abc import ApiKeyRepositoryABC
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.api_key import ApiKey
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.auth_user import AuthUser
from bot_data.model.auth_user_users_relation import AuthUserUsersRelation
_email_regex = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
class AuthService(AuthServiceABC):
def __init__(
self,
env: ApplicationEnvironmentABC,
logger: ApiLogger,
bot: DiscordBotServiceABC,
db: DatabaseContextABC,
auth_users: AuthUserRepositoryABC,
api_keys: ApiKeyRepositoryABC,
users: UserRepositoryABC,
servers: ServerRepositoryABC,
mailer: EMailClientABC,
t: TranslatePipe,
auth_settings: AuthenticationSettings,
frontend_settings: FrontendSettings,
):
AuthServiceABC.__init__(self)
self._environment = env
self._logger = logger
self._bot = bot
self._db = db
self._auth_users = auth_users
self._api_keys = api_keys
self._users = users
self._servers = servers
self._mailer = mailer
self._t = t
self._auth_settings = auth_settings
self._frontend_settings = frontend_settings
@staticmethod
def _hash_sha256(password: str, salt: str) -> str:
return hashlib.sha256(f"{password}{salt}".encode("utf-8")).hexdigest()
@staticmethod
def _is_email_valid(email: str) -> bool:
if email is None:
raise False
if re.fullmatch(_email_regex, email) is not None:
return True
return False
def _get_api_key_str(self, api_key: ApiKey) -> str:
return hashlib.sha256(
f"{api_key.identifier}:{api_key.key}+{self._auth_settings.secret_key}".encode("utf-8")
).hexdigest()
def generate_token(self, user: AuthUser) -> str:
token = jwt.encode(
payload={
"user_id": user.id,
"email": user.email,
"role": user.auth_role.value,
"exp": datetime.now(tz=timezone.utc) + timedelta(days=self._auth_settings.token_expire_time),
"iss": self._auth_settings.issuer,
"aud": self._auth_settings.audience,
},
key=CredentialManager.decrypt(self._auth_settings.secret_key),
)
return token
def decode_token(self, token: str) -> dict:
return jwt.decode(
token,
key=CredentialManager.decrypt(self._auth_settings.secret_key),
issuer=self._auth_settings.issuer,
audience=self._auth_settings.audience,
algorithms=["HS256"],
)
def get_decoded_token_from_request(self) -> dict:
token = None
if "Authorization" in request.headers:
bearer = request.headers.get("Authorization")
token = bearer.split()[1]
if token is None:
raise ServiceException(ServiceErrorCode.Unauthorized, f"Token not set")
return jwt.decode(
token,
key=CredentialManager.decrypt(self._auth_settings.secret_key),
issuer=self._auth_settings.issuer,
audience=self._auth_settings.audience,
algorithms=["HS256"],
)
def find_decoded_token_from_request(self) -> Optional[dict]:
token = None
if "Authorization" in request.headers:
bearer = request.headers.get("Authorization")
token = bearer.split()[1]
return (
jwt.decode(
token,
key=CredentialManager.decrypt(self._auth_settings.secret_key),
issuer=self._auth_settings.issuer,
audience=self._auth_settings.audience,
algorithms=["HS256"],
)
if token is not None
else None
)
def _create_and_save_refresh_token(self, user: AuthUser) -> str:
token = str(uuid.uuid4())
user.refresh_token = token
user.refresh_token_expire_time = datetime.now() + timedelta(days=self._auth_settings.refresh_token_expire_time)
self._auth_users.update_auth_user(user)
self._db.save_changes()
return token
def _send_link_mail(self, email: str, subject: str, message: str):
url = self._frontend_settings.url
if not url.endswith("/"):
url = f"{url}/"
self._mailer.connect()
mail = EMail()
mail.add_header("Mime-Version: 1.0")
mail.add_header("Content-Type: text/plain; charset=utf-8")
mail.add_header("Content-Transfer-Encoding: quoted-printable")
mail.add_receiver(str(email))
mail.subject = subject
mail.body = f"{message}\r\n{self._t.transform('api.mail.automatic_mail').format(self._environment.application_name, self._environment.environment_name, self._environment.host_name)}"
thr = Thread(target=self._mailer.send_mail, args=[mail])
thr.start()
def _send_confirmation_id_to_user(self, user: AuthUser):
url = self._frontend_settings.url
if not url.endswith("/"):
url = f"{url}/"
self._send_link_mail(
user.email,
self._t.transform("api.auth.confirmation.subject").format(user.first_name, user.last_name),
self._t.transform("api.auth.confirmation.message").format(url, user.confirmation_id),
)
def _send_forgot_password_id_to_user(self, user: AuthUser):
url = self._frontend_settings.url
if not url.endswith("/"):
url = f"{url}/"
self._send_link_mail(
user.email,
self._t.transform("api.auth.forgot_password.subject").format(user.first_name, user.last_name),
self._t.transform("api.auth.forgot_password.message").format(url, user.forgot_password_id),
)
async def get_all_auth_users_async(self) -> List[AuthUserDTO]:
result = self._auth_users.get_all_auth_users().select(lambda x: AUT.to_dto(x))
return List(AuthUserDTO, result)
async def get_filtered_auth_users_async(self, criteria: AuthUserSelectCriteria) -> AuthUserFilteredResultDTO:
users = self._auth_users.get_filtered_auth_users(criteria)
result = users.result.select(lambda x: AUT.to_dto(x))
return AuthUserFilteredResultDTO(List(AuthUserDTO, result), users.total_count)
async def get_auth_user_by_email_async(self, email: str, with_password: bool = False) -> AuthUserDTO:
try:
# todo: check if logged in user is admin then send mail
user = self._auth_users.get_auth_user_by_email(email)
return AUT.to_dto(user, password=user.password if with_password else None)
except Exception as e:
self._logger.error(__name__, f"AuthUser not found", e)
raise ServiceException(ServiceErrorCode.InvalidData, f"User not found {email}")
async def find_auth_user_by_email_async(self, email: str) -> Optional[AuthUser]:
user = self._auth_users.find_auth_user_by_email(email)
return AUT.to_dto(user) if user is not None else None
def add_auth_user(self, user_dto: AuthUserDTO):
db_user = self._auth_users.find_auth_user_by_email(user_dto.email)
if db_user is not None:
raise ServiceException(ServiceErrorCode.InvalidUser, "User already exists")
user = AUT.to_db(user_dto)
if self._auth_users.get_all_auth_users().count() == 0:
user.auth_role = AuthRoleEnum.admin
user.password_salt = uuid.uuid4()
user.password = self._hash_sha256(user_dto.password, user.password_salt)
if not self._is_email_valid(user.email):
raise ServiceException(ServiceErrorCode.InvalidData, "Invalid E-Mail address")
try:
user.confirmation_id = uuid.uuid4()
self._auth_users.add_auth_user(user)
self._send_confirmation_id_to_user(user)
self._db.save_changes()
self._logger.info(__name__, f"Added auth user with E-Mail: {user_dto.email}")
except Exception as e:
self._logger.error(__name__, f"Cannot add user with E-Mail {user_dto.email}", e)
raise ServiceException(ServiceErrorCode.UnableToAdd, "Invalid E-Mail")
async def add_auth_user_by_oauth_async(self, dto: OAuthDTO):
db_user = self._auth_users.find_auth_user_by_email(dto.user.email)
if db_user is None:
raise ServiceException(ServiceErrorCode.InvalidUser, "User not found")
if db_user.oauth_id != dto.oauth_id:
raise ServiceException(ServiceErrorCode.InvalidUser, "Wrong OAuthId")
try:
db_user.first_name = dto.user.first_name
db_user.last_name = dto.user.last_name
db_user.password_salt = uuid.uuid4()
db_user.password = self._hash_sha256(dto.user.password, db_user.password_salt)
db_user.oauth_id = None
db_user.confirmation_id = uuid.uuid4()
self._send_confirmation_id_to_user(db_user)
self._auth_users.update_auth_user(db_user)
self._logger.info(__name__, f"Added auth user with E-Mail: {dto.user.email}")
except Exception as e:
self._logger.error(__name__, f"Cannot add user with E-Mail {dto.user.email}", e)
raise ServiceException(ServiceErrorCode.UnableToAdd, "Invalid E-Mail")
self._db.save_changes()
async def update_user_async(self, update_user_dto: UpdateAuthUserDTO):
if update_user_dto is None:
raise ServiceException(ServiceErrorCode.InvalidData, f"User is empty")
if update_user_dto.auth_user is None:
raise ServiceException(ServiceErrorCode.InvalidData, f"Existing user is empty")
if update_user_dto.new_auth_user is None:
raise ServiceException(ServiceErrorCode.InvalidData, f"New user is empty")
if not self._is_email_valid(update_user_dto.auth_user.email) or not self._is_email_valid(
update_user_dto.new_auth_user.email
):
raise ServiceException(ServiceErrorCode.InvalidData, f"Invalid E-Mail")
user = self._auth_users.find_auth_user_by_email(update_user_dto.auth_user.email)
if user is None:
raise ServiceException(ServiceErrorCode.InvalidUser, "User not found")
if user.confirmation_id is not None:
raise ServiceException(ServiceErrorCode.InvalidUser, "E-Mail not confirmed")
# update first name
if (
update_user_dto.new_auth_user.first_name is not None
and update_user_dto.auth_user.first_name != update_user_dto.new_auth_user.first_name
):
user.first_name = update_user_dto.new_auth_user.first_name
# update last name
if (
update_user_dto.new_auth_user.last_name is not None
and update_user_dto.new_auth_user.last_name != ""
and update_user_dto.auth_user.last_name != update_user_dto.new_auth_user.last_name
):
user.last_name = update_user_dto.new_auth_user.last_name
# update E-Mail
if (
update_user_dto.new_auth_user.email is not None
and update_user_dto.new_auth_user.email != ""
and update_user_dto.auth_user.email != update_user_dto.new_auth_user.email
):
user_by_new_e_mail = self._auth_users.find_auth_user_by_email(update_user_dto.new_auth_user.email)
if user_by_new_e_mail is not None:
raise ServiceException(ServiceErrorCode.InvalidUser, "User already exists")
user.email = update_user_dto.new_auth_user.email
update_user_dto.auth_user.password = self._hash_sha256(update_user_dto.auth_user.password, user.password_salt)
if update_user_dto.auth_user.password != user.password:
raise ServiceException(ServiceErrorCode.InvalidUser, "Wrong password")
# update password
if (
update_user_dto.new_auth_user.password is not None
and self._hash_sha256(update_user_dto.new_auth_user.password, user.password_salt) != user.password
):
user.password_salt = uuid.uuid4()
user.password = self._hash_sha256(update_user_dto.new_auth_user.password, user.password_salt)
self._auth_users.update_auth_user(user)
self._db.save_changes()
async def update_user_as_admin_async(self, update_user_dto: UpdateAuthUserDTO):
if update_user_dto is None:
raise ServiceException(ServiceErrorCode.InvalidData, f"User is empty")
if update_user_dto.auth_user is None:
raise ServiceException(ServiceErrorCode.InvalidData, f"Existing user is empty")
if update_user_dto.new_auth_user is None:
raise ServiceException(ServiceErrorCode.InvalidData, f"New user is empty")
if not self._is_email_valid(update_user_dto.auth_user.email) or not self._is_email_valid(
update_user_dto.new_auth_user.email
):
raise ServiceException(ServiceErrorCode.InvalidData, f"Invalid E-Mail")
user = self._auth_users.find_auth_user_by_email(update_user_dto.auth_user.email)
if user is None:
raise ServiceException(ServiceErrorCode.InvalidUser, "User not found")
if user.confirmation_id is not None and update_user_dto.new_auth_user.is_confirmed:
user.confirmation_id = None
elif user.confirmation_id is None and not update_user_dto.new_auth_user.is_confirmed:
user.confirmation_id = uuid.uuid4()
# else
# raise ServiceException(ServiceErrorCode.InvalidUser, 'E-Mail not confirmed')
# update first name
if (
update_user_dto.new_auth_user.first_name is not None
and update_user_dto.auth_user.first_name != update_user_dto.new_auth_user.first_name
):
user.first_name = update_user_dto.new_auth_user.first_name
# update last name
if (
update_user_dto.new_auth_user.last_name is not None
and update_user_dto.new_auth_user.last_name != ""
and update_user_dto.auth_user.last_name != update_user_dto.new_auth_user.last_name
):
user.last_name = update_user_dto.new_auth_user.last_name
# update E-Mail
if (
update_user_dto.new_auth_user.email is not None
and update_user_dto.new_auth_user.email != ""
and update_user_dto.auth_user.email != update_user_dto.new_auth_user.email
):
user_by_new_e_mail = self._auth_users.find_auth_user_by_email(update_user_dto.new_auth_user.email)
if user_by_new_e_mail is not None:
raise ServiceException(ServiceErrorCode.InvalidUser, "User already exists")
user.email = update_user_dto.new_auth_user.email
# update password
if (
update_user_dto.new_auth_user.password is not None
and update_user_dto.change_password
and user.password != self._hash_sha256(update_user_dto.new_auth_user.password, user.password_salt)
):
user.password_salt = uuid.uuid4()
user.password = self._hash_sha256(update_user_dto.new_auth_user.password, user.password_salt)
# update role
if (
user.auth_role == update_user_dto.auth_user.auth_role
and user.auth_role != update_user_dto.new_auth_user.auth_role
):
user.auth_role = update_user_dto.new_auth_user.auth_role
self._auth_users.update_auth_user(user)
self._db.save_changes()
async def delete_auth_user_by_email_async(self, email: str):
try:
user = self._auth_users.get_auth_user_by_email(email)
self._auth_users.delete_auth_user(user)
self._db.save_changes()
except Exception as e:
self._logger.error(__name__, f"Cannot delete user", e)
raise ServiceException(ServiceErrorCode.UnableToDelete, f"Cannot delete user by mail {email}")
async def delete_auth_user_async(self, user_dto: AuthUser):
try:
self._auth_users.delete_auth_user(AUT.to_db(user_dto))
self._db.save_changes()
except Exception as e:
self._logger.error(__name__, f"Cannot delete user", e)
raise ServiceException(
ServiceErrorCode.UnableToDelete,
f"Cannot delete user by mail {user_dto.email}",
)
def verify_login(self, token_str: str) -> bool:
try:
token = self.decode_token(token_str)
if token is None or "email" not in token:
raise ServiceException(ServiceErrorCode.InvalidData, "Token invalid")
user = self._auth_users.find_auth_user_by_email(token["email"])
if user is None:
raise ServiceException(ServiceErrorCode.InvalidData, "Token expired")
except Exception as e:
self._logger.error(__name__, f"Token invalid", e)
return False
return True
def verify_api_key(self, api_key: str) -> bool:
try:
keys = self._api_keys.get_api_keys().select(self._get_api_key_str)
if not keys.contains(api_key):
raise ServiceException(ServiceErrorCode.InvalidData, "API-Key invalid")
except Exception as e:
self._logger.error(__name__, f"API-Key invalid", e)
return False
return True
async def login_async(self, user_dto: AuthUser) -> TokenDTO:
if user_dto is None:
raise ServiceException(ServiceErrorCode.InvalidData, "User not set")
db_user = self._auth_users.find_auth_user_by_email(user_dto.email)
if db_user is None:
raise ServiceException(ServiceErrorCode.InvalidUser, f"User not found")
user_dto.password = self._hash_sha256(user_dto.password, db_user.password_salt)
if db_user.password != user_dto.password:
raise ServiceException(ServiceErrorCode.InvalidUser, "Wrong password")
if db_user.confirmation_id is not None:
raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified")
token = self.generate_token(db_user)
refresh_token = self._create_and_save_refresh_token(db_user)
if db_user.forgot_password_id is not None:
db_user.forgot_password_id = None
self._db.save_changes()
return TokenDTO(token, refresh_token)
async def login_discord_async(self, user_dto: AuthUserDTO, dc_id: int) -> TokenDTO:
if user_dto is None:
raise ServiceException(ServiceErrorCode.InvalidData, "User not set")
members = self._users.get_users_by_discord_id(dc_id)
if members.count() == 0:
raise ServiceException(ServiceErrorCode.InvalidUser, f"Member not found")
added_user = False
db_user = self._auth_users.find_auth_user_by_email(user_dto.email)
if db_user is None:
self.add_auth_user(user_dto)
added_user = True
db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
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")
token = self.generate_token(db_user)
refresh_token = self._create_and_save_refresh_token(db_user)
if db_user.forgot_password_id is not None:
db_user.forgot_password_id = None
self._db.save_changes()
return TokenDTO(token, refresh_token, first_login=added_user)
async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO:
if token_dto is None:
raise ServiceException(ServiceErrorCode.InvalidData, f"Token not set")
try:
token = self.decode_token(token_dto.token)
if token is None or "email" not in token:
raise ServiceException(ServiceErrorCode.InvalidData, "Token invalid")
user = self._auth_users.get_auth_user_by_email(token["email"])
if (
user is None
or user.refresh_token != token_dto.refresh_token
or user.refresh_token_expire_time <= datetime.now()
):
raise ServiceException(ServiceErrorCode.InvalidData, "Token expired")
return TokenDTO(self.generate_token(user), self._create_and_save_refresh_token(user))
except Exception as e:
self._logger.error(__name__, f"Refreshing token failed", e)
return TokenDTO("", "")
async def revoke_async(self, token_dto: TokenDTO):
if token_dto is None or token_dto.token is None or token_dto.refresh_token is None:
raise ServiceException(ServiceErrorCode.InvalidData, "Token not set")
try:
token = self.decode_token(token_dto.token)
user = self._auth_users.get_auth_user_by_email(token["email"])
if (
user is None
or user.refresh_token != token_dto.refresh_token
or user.refresh_token_expire_time <= datetime.now()
):
raise ServiceException(ServiceErrorCode.InvalidData, "Token expired")
user.refresh_token = None
self._auth_users.update_auth_user(user)
self._db.save_changes()
except Exception as e:
self._logger.error(__name__, f"Refreshing token failed", e)
async def confirm_email_async(self, id: str) -> bool:
user = self._auth_users.find_auth_user_by_confirmation_id(id)
if user is None:
return False
user.confirmation_id = None
self._auth_users.update_auth_user(user)
self._db.save_changes()
return True
async def forgot_password_async(self, email: str):
user = self._auth_users.find_auth_user_by_email(email)
if user is None:
return
user.forgot_password_id = uuid.uuid4()
self._auth_users.update_auth_user(user)
self._send_forgot_password_id_to_user(user)
self._db.save_changes()
async def confirm_forgot_password_async(self, id: str) -> EMailStringDTO:
user = self._auth_users.find_auth_user_by_forgot_password_id(id)
return EMailStringDTO(user.email)
async def reset_password_async(self, rp_dto: ResetPasswordDTO):
user = self._auth_users.find_auth_user_by_forgot_password_id(rp_dto.id)
if user is None:
raise ServiceException(
ServiceErrorCode.InvalidUser,
f"User by forgot password id {rp_dto.id} not found",
)
if user.confirmation_id is not None:
raise ServiceException(ServiceErrorCode.InvalidUser, f"E-Mail not confirmed")
if user.password is None or rp_dto.password == "":
raise ServiceException(ServiceErrorCode.InvalidData, f"Password not set")
user.password_salt = uuid.uuid4()
user.password = self._hash_sha256(rp_dto.password, user.password_salt)
user.forgot_password_id = None
self._auth_users.update_auth_user(user)
self._db.save_changes()
async def resend_confirmation_email_by_mail(self, mail: str):
user = self._auth_users.find_auth_user_by_email(mail)
if user is None:
raise ServiceException(ServiceErrorCode.InvalidUser, f"User not found")
if user.confirmation_id is None:
raise ServiceException(ServiceErrorCode.DataAlreadyExists, f"User already confirmed")
self._send_confirmation_id_to_user(user)

View File

@ -0,0 +1,91 @@
from typing import Optional
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_api.abc.auth_service_abc import AuthServiceABC
from bot_core.exception.service_error_code_enum import ServiceErrorCode
from bot_core.exception.service_exception import ServiceException
from bot_api.filter.discord.server_select_criteria import ServerSelectCriteria
from bot_api.model.discord.server_dto import ServerDTO
from bot_api.model.discord.server_filtered_result_dto import ServerFilteredResultDTO
from bot_api.transformer.server_transformer import ServerTransformer
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.server import Server
class DiscordService:
def __init__(
self,
bot: DiscordBotServiceABC,
servers: ServerRepositoryABC,
auth: AuthServiceABC,
auth_users: AuthUserRepositoryABC,
users: UserRepositoryABC,
):
self._bot = bot
self._servers = servers
self._auth = auth
self._auth_users = auth_users
self._users = users
def _to_dto(self, x: Server) -> Optional[ServerDTO]:
guild = self._bot.get_guild(x.discord_id)
if guild is None:
return ServerTransformer.to_dto(x, "", 0, None)
return ServerTransformer.to_dto(x, guild.name, guild.member_count, guild.icon)
async def get_all_servers(self) -> List[ServerDTO]:
servers = List(ServerDTO, self._servers.get_servers())
return servers.select(self._to_dto).where(lambda x: x.name != "")
async def get_all_servers_by_user(self) -> List[ServerDTO]:
token = self._auth.get_decoded_token_from_request()
if token is None or "email" not in token or "role" not in token:
raise ServiceException(ServiceErrorCode.InvalidData, "Token invalid")
role = AuthRoleEnum(token["role"])
servers = self._servers.get_servers()
if role != AuthRoleEnum.admin:
auth_user = self._auth_users.find_auth_user_by_email(token["email"])
if auth_user is not None:
user_ids = auth_user.users.select(lambda x: x.server is not None and x.server.id)
servers = servers.where(lambda x: x.id in user_ids)
servers = List(ServerDTO, servers)
return servers.select(self._to_dto).where(lambda x: x.name != "")
async def get_filtered_servers_async(self, criteria: ServerSelectCriteria) -> ServerFilteredResultDTO:
token = self._auth.get_decoded_token_from_request()
if token is None or "email" not in token or "role" not in token:
raise ServiceException(ServiceErrorCode.InvalidData, "Token invalid")
role = AuthRoleEnum(token["role"])
filtered_result = self._servers.get_filtered_servers(criteria)
# filter out servers, where the user not exists
if role != AuthRoleEnum.admin:
auth_user = self._auth_users.find_auth_user_by_email(token["email"])
if auth_user is not None:
user_ids = auth_user.users.select(lambda x: x.server is not None and x.server.id)
filtered_result.result = filtered_result.result.where(lambda x: x.id in user_ids)
servers: List = filtered_result.result.select(self._to_dto).where(lambda x: x.name != "")
result = List(ServerDTO, servers)
if criteria.name is not None and criteria.name != "":
result = result.where(
lambda x: criteria.name.lower() in x.name.lower() or x.name.lower() == criteria.name.lower()
)
return ServerFilteredResultDTO(List(ServerDTO, result), servers.count())
async def get_server_by_id_async(self, id: int) -> ServerDTO:
server = self._servers.get_server_by_id(id)
guild = self._bot.get_guild(server.discord_id)
server_dto = ServerTransformer.to_dto(server, guild.name, guild.member_count, guild.icon)
return server_dto

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_api.transformer"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,97 @@
from datetime import datetime
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_api.abc.transformer_abc import TransformerABC
from bot_api.model.auth_user_dto import AuthUserDTO
from bot_api.model.user_dto import UserDTO
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.auth_user import AuthUser
from bot_data.model.user import User
from bot_core.abc.permission_service_abc import PermissionServiceABC
class AuthUserTransformer(TransformerABC):
@staticmethod
def to_db(dto: AuthUserDTO) -> AuthUser:
return AuthUser(
dto.first_name,
dto.last_name,
dto.email,
dto.password,
None,
None,
None,
None,
None,
datetime.now(),
AuthRoleEnum.normal if dto.auth_role is None else AuthRoleEnum(dto.auth_role),
auth_user_id=0 if dto.id is None else dto.id,
)
@staticmethod
@ServiceProviderABC.inject
def _is_technician(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
guild = bot.get_guild(user.server.discord_id)
if guild is None:
return permissions.is_member_technician_by_id(user.discord_id)
member = guild.get_member(user.discord_id)
if member is None:
return permissions.is_member_technician_by_id(user.discord_id)
return permissions.is_member_technician(member)
@staticmethod
@ServiceProviderABC.inject
def _is_admin(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
guild = bot.get_guild(user.server.discord_id)
if guild is None:
return False
member = guild.get_member(user.discord_id)
if member is None:
return False
return permissions.is_member_admin(member)
@staticmethod
@ServiceProviderABC.inject
def _is_moderator(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
guild = bot.get_guild(user.server.discord_id)
if guild is None:
return False
member = guild.get_member(user.discord_id)
if member is None:
return False
return permissions.is_member_moderator(member)
@classmethod
def to_dto(cls, db: AuthUser, password: str = None) -> AuthUserDTO:
return AuthUserDTO(
db.id,
db.first_name,
db.last_name,
db.email,
"" if password is None else password,
db.confirmation_id,
db.auth_role,
List(
UserDTO,
db.users.select(
lambda u: UserDTO(
u.id,
u.discord_id,
u.xp,
u.server,
cls._is_technician(u),
cls._is_admin(u),
cls._is_moderator(u),
)
),
),
db.created_at,
db.modified_at,
)

View File

@ -0,0 +1,23 @@
from typing import Optional
import discord
from bot_api.abc.transformer_abc import TransformerABC
from bot_api.model.discord.server_dto import ServerDTO
from bot_data.model.server import Server
class ServerTransformer(TransformerABC):
@staticmethod
def to_db(dto: ServerDTO) -> Server:
return Server(dto.discord_id)
@staticmethod
def to_dto(db: Server, name: str, member_count: int, icon_url: Optional[discord.Asset]) -> ServerDTO:
return ServerDTO(
db.id,
db.discord_id,
name,
member_count,
icon_url.url if icon_url is not None else None,
)

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_core"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_core.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,91 @@
from abc import ABC, abstractmethod
from datetime import datetime
from typing import Callable, Union
import discord
from cpl_query.extension import List
from discord.ext.commands import Context
from bot_data.model.auto_role_rule import AutoRoleRule
from bot_data.model.server_config import ServerConfig
from bot_data.model.user import User
class ClientUtilsABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def received_command(self, guild_id: int):
pass
@abstractmethod
def moved_user(self, guild_id: int):
pass
@abstractmethod
def moved_users(self, guild_id: int, count: int):
pass
@abstractmethod
def get_client(self, dc_ic: int, guild_id: int):
pass
@abstractmethod
async def check_if_bot_is_ready_yet(self) -> bool:
pass
@abstractmethod
async def check_if_bot_is_ready_yet_and_respond(self, ctx: Context) -> bool:
pass
@abstractmethod
async def presence_game(self, t_key: str):
pass
@abstractmethod
def get_auto_complete_list(self, _l: List, current: str, select: Callable = None) -> List:
pass
@abstractmethod
def update_user_message_xp_count_by_hour(
self,
created_at: datetime,
user: User,
settings: ServerConfig,
is_reaction: bool = False,
):
pass
@abstractmethod
def is_message_xp_count_by_hour_higher_that_max_message_count_per_hour(
self,
created_at: datetime,
user: User,
settings: ServerConfig,
is_reaction: bool = False,
) -> bool:
pass
@abstractmethod
def get_ontime_for_user(self, user: User) -> float:
pass
@abstractmethod
async def react_to_message_by_auto_role_rule(
self,
discord_channel_id: int,
discord_message_id: int,
rule: AutoRoleRule,
guild: discord.Guild,
):
pass
@abstractmethod
async def check_default_role(self, member: Union[discord.User, discord.Member]):
pass
@abstractmethod
async def set_maintenance_mode(self, state: bool):
pass

View File

@ -9,52 +9,61 @@ from bot_core.configuration.file_logging_settings import FileLoggingSettings
class CustomFileLoggerABC(Logger, ABC):
@abstractmethod
def __init__(self, key: str, config: ConfigurationABC, time_format: TimeFormatSettings, env: ApplicationEnvironmentABC):
def __init__(
self,
key: str,
config: ConfigurationABC,
time_format: TimeFormatSettings,
env: ApplicationEnvironmentABC,
):
self._key = key
settings: LoggingSettings = config.get_configuration(f'{FileLoggingSettings.__name__}_{key}')
Logger.__init__(self, settings, time_format, env)
self._settings: LoggingSettings = config.get_configuration(f"{FileLoggingSettings.__name__}_{key}")
Logger.__init__(self, self._settings, time_format, env)
self._begin_log()
@property
def settings(self) -> LoggingSettings:
return self._settings
def _begin_log(self):
console_level = self._console.value
self._console = LoggingLevelEnum.OFF
self.info(__name__, f'Starting...')
self.info(__name__, f"Starting...")
self._console = LoggingLevelEnum(console_level)
def _get_string(self, name_list_as_str: str, level: LoggingLevelEnum, message: str) -> str:
names = name_list_as_str.split(' ')
names = name_list_as_str.split(" ")
log_level = level.name
string = f'<{self._get_datetime_now()}> [ {log_level} ]'
string = f"<{self._get_datetime_now()}> [ {log_level} ]"
for name in names:
string += f' [ {name} ]'
string += f': {message}'
string += f" [ {name} ]"
string += f": {message}"
return string
def header(self, string: str):
super().header(string)
def trace(self, name: str, message: str):
name = f'{name} {self._key}'
name = f"{name} {self._key}"
super().trace(name, message)
def debug(self, name: str, message: str):
name = f'{name} {self._key}'
name = f"{name} {self._key}"
super().debug(name, message)
def info(self, name: str, message: str):
name = f'{name} {self._key}'
name = f"{name} {self._key}"
super().info(name, message)
def warn(self, name: str, message: str):
name = f'{name} {self._key}'
name = f"{name} {self._key}"
super().warn(name, message)
def error(self, name: str, message: str, ex: Exception = None):
name = f'{name} {self._key}'
name = f"{name} {self._key}"
super().error(name, message, ex)
def fatal(self, name: str, message: str, ex: Exception = None):
name = f'{name} {self._key}'
name = f"{name} {self._key}"
super().fatal(name, message, ex)

View File

@ -0,0 +1,67 @@
from abc import ABC, abstractmethod
from typing import Union, Optional
import discord
from cpl_query.extension import List
from discord import Interaction
from discord.ext.commands import Context
class MessageServiceABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
async def delete_messages(self, messages: List[discord.Message], guild_id: int, without_tracking=False):
pass
@abstractmethod
async def delete_message(self, message: discord.Message, without_tracking=False):
pass
@abstractmethod
async def send_channel_message(
self,
channel: discord.TextChannel,
message: Union[str, discord.Embed],
is_persistent: bool = False,
wait_before_delete: int = None,
without_tracking=False,
):
pass
@abstractmethod
async def send_dm_message(
self,
message: Union[str, discord.Embed],
receiver: Union[discord.User, discord.Member],
without_tracking=False,
):
pass
@abstractmethod
async def send_ctx_msg(
self,
ctx: Context,
message: Union[str, discord.Embed],
file: discord.File = None,
is_persistent: bool = False,
is_public: bool = False,
wait_before_delete: int = None,
without_tracking=True,
) -> Optional[discord.Message]:
pass
@abstractmethod
async def send_interaction_msg(
self,
interaction: Interaction,
message: Union[str, discord.Embed],
is_persistent: bool = False,
is_public: bool = False,
wait_before_delete: int = None,
without_tracking=True,
**kwargs
):
pass

View File

@ -7,7 +7,6 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
class ModuleABC(StartupExtensionABC):
@abstractmethod
def __init__(self, dc: DiscordCollectionABC, feature_flag: FeatureFlagsEnum):
StartupExtensionABC.__init__(self)

View File

@ -0,0 +1,25 @@
from abc import ABC, abstractmethod
import discord
class PermissionServiceABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def is_member_admin(self, member: discord.Member) -> bool:
pass
@abstractmethod
def is_member_moderator(self, member: discord.Member) -> bool:
pass
@abstractmethod
def is_member_technician(self, member: discord.Member) -> bool:
pass
@abstractmethod
def is_member_technician_by_id(self, member_id: int) -> bool:
pass

View File

@ -0,0 +1,33 @@
import asyncio
from abc import abstractmethod
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from discord.ext import commands
from bot_core.environment_variables import MAINTENANCE
from bot_core.logging.task_logger import TaskLogger
class TaskABC(commands.Cog):
@abstractmethod
def __init__(self):
commands.Cog.__init__(self)
@ServiceProviderABC.inject
def _is_maintenance(self, config: ConfigurationABC) -> bool:
return config.get_configuration(MAINTENANCE) is True
@ServiceProviderABC.inject
async def _wait_until_ready(self, config: ConfigurationABC, logger: TaskLogger, bot: DiscordBotServiceABC):
logger.debug(__name__, f"Waiting before ready {type(self).__name__}")
await bot.wait_until_ready()
async def wait():
is_ready = config.get_configuration("IS_READY") is True
if not is_ready:
await asyncio.sleep(1)
await wait()
await wait()

View File

@ -3,8 +3,8 @@
"Name": "bot-core",
"Version": {
"Major": "1",
"Minor": "0",
"Micro": "0"
"Minor": "2",
"Micro": "8"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",
@ -16,15 +16,13 @@
"LicenseName": "MIT",
"LicenseDescription": "MIT, see LICENSE for more details.",
"Dependencies": [
"cpl-core>=2022.10.0"
"cpl-core==2022.12.0"
],
"DevDependencies": [
"cpl-cli>=2022.10.0"
"cpl-cli==2022.12.0"
],
"PythonVersion": ">=3.10.4",
"PythonPath": {
"linux": ""
},
"PythonPath": {},
"Classifiers": []
},
"BuildSettings": {

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_core.configuration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

View File

@ -0,0 +1,25 @@
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.utils.json_processor import JSONProcessor
from cpl_query.extension import List
from bot_core.configuration.file_logging_settings import FileLoggingSettings
class BotLoggingSettings(ConfigurationModelABC):
def __init__(self, **kwargs: dict):
ConfigurationModelABC.__init__(self)
self._files: List[FileLoggingSettings] = List(FileLoggingSettings)
if kwargs is not None:
self._files_from_dict(kwargs)
@property
def files(self) -> List[FileLoggingSettings]:
return self._files
def _files_from_dict(self, settings: dict):
files = List(FileLoggingSettings)
for s in settings:
settings[s]["Key"] = s
files.append(JSONProcessor.process(FileLoggingSettings, settings[s]))
self._files = files

View File

@ -0,0 +1,31 @@
from enum import Enum
class FeatureFlagsEnum(Enum):
# modules
achievements_module = "AchievementsModule"
api_module = "ApiModule"
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"
short_role_name_module = "ShortRoleNameModule"
steam_special_offers_module = "SteamSpecialOffersModule"
# features
api_only = "ApiOnly"
presence = "Presence"
version_in_presence = "VersionInPresence"
game_server = "GameServer"
sync_xp = "SyncXp"
short_role_name = "ShortRoleName"
technician_full_access = "TechnicianFullAccess"
steam_special_offers = "SteamSpecialOffers"
scheduled_events = "ScheduledEvents"
basic_registration = "BasicRegistration"
basic_login = "BasicLogin"

View File

@ -0,0 +1,65 @@
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
class FeatureFlagsSettings(ConfigurationModelABC):
_flags = {
# modules
FeatureFlagsEnum.achievements_module.value: False, # 14.06.2023 #268
FeatureFlagsEnum.api_module.value: False, # 13.10.2022 #70
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
FeatureFlagsEnum.core_extension_module.value: True, # 03.10.2022 #56
FeatureFlagsEnum.data_module.value: True, # 03.10.2022 #56
FeatureFlagsEnum.database_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.moderator_module.value: False, # 02.10.2022 #48
FeatureFlagsEnum.config_module.value: True, # 19.07.2023 #127
FeatureFlagsEnum.short_role_name_module.value: True, # 28.09.2023 #378
FeatureFlagsEnum.steam_special_offers_module.value: True, # 11.10.2023 #188
# 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
FeatureFlagsEnum.steam_special_offers.value: False, # 11.10.2023 #188
FeatureFlagsEnum.scheduled_events.value: False, # 14.11.2023 #410
FeatureFlagsEnum.basic_registration.value: False, # 19.11.2023 #440
FeatureFlagsEnum.basic_login.value: False, # 19.11.2023 #440
}
def __init__(self, **kwargs: dict):
ConfigurationModelABC.__init__(self)
if len(kwargs.keys()) == 0:
return
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
return self._flags[key.value]
def _load_flag(self, settings: dict, key: FeatureFlagsEnum):
if key.value not in settings:
return
self._flags[key.value] = bool(settings[key.value])

View File

@ -0,0 +1,19 @@
from cpl_core.logging import LoggingSettings, LoggingLevelEnum
class FileLoggingSettings(LoggingSettings):
def __init__(
self,
key: str,
path: str = None,
filename: str = None,
console_log_level: LoggingLevelEnum = None,
file_log_level: LoggingLevelEnum = None,
):
LoggingSettings.__init__(self, path, filename, console_log_level, file_log_level)
self._key = key
@property
def key(self) -> str:
return self._key

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
bot sh-edraft.de Discord bot
~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de
:copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "bot_core.core_extension"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.2.8"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="2", micro="8")

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