Compare commits
594 Commits
Author | SHA1 | Date | |
---|---|---|---|
9bed89ed60 | |||
35fdeb168f | |||
e785bddf2e | |||
b361a7b685 | |||
bdd0da38ab | |||
179c8a954b | |||
248d47c280 | |||
414720f53b | |||
bb0ff1c560 | |||
521a063fca | |||
dc5ae365bb | |||
3c21b68b0c | |||
df316fd53b | |||
0a18f26a51 | |||
995c498e54 | |||
9353fa749c | |||
dd4b9182f3 | |||
1fc8d441ad | |||
219fffc344 | |||
fbdac4f57a | |||
dfee6b0568 | |||
9eb09fa3b2 | |||
60d81ce18b | |||
a24fefd3e2 | |||
8cd5a0d040 | |||
1b8a67e81b | |||
8318dfe988 | |||
7185b087c9 | |||
07fc512633 | |||
ca5db6d397 | |||
7888783b6a | |||
31c62b4108 | |||
b0990b626c | |||
df9c889c7e | |||
4d386759c0 | |||
3683f5f3d1 | |||
77f759a9ca | |||
f209e45905 | |||
a917803eff | |||
acfa359eeb | |||
baf7b8d7de | |||
ee69ae58d1 | |||
bc528f1474 | |||
d67ba924dc | |||
e054c04c96 | |||
c846614274 | |||
83764b3cee | |||
4553490266 | |||
35aa2574f8 | |||
ccae285b81 | |||
887a02a7af | |||
f484c553b3 | |||
c5eca69db1 | |||
d1a04c537c | |||
72715aac62 | |||
e516def7ef | |||
f1f5954dfc | |||
266dacb301 | |||
280cd9827d | |||
36998470e8 | |||
53c6bf4208 | |||
4e80e3ccb7 | |||
ba173a6743 | |||
84ff2a8a9b | |||
13bc38fea8 | |||
dfdf0555d7 | |||
39299eb11b | |||
dfb6751bf9 | |||
4a75635a55 | |||
f6b2739394 | |||
36d2605655 | |||
af891fa588 | |||
af348b85a4 | |||
7ed621a25b | |||
013f953a7f | |||
4163532696 | |||
b6a1172cc1 | |||
20bdb6bd98 | |||
3f13f65932 | |||
711e184895 | |||
7e3975f4be | |||
d4f4f39522 | |||
af9c55e4b1 | |||
e3172d6f24 | |||
0706579f62 | |||
ad3fc94923 | |||
69882af0bd | |||
560c7650bd | |||
b0fb12f841 | |||
18386339b7 | |||
4d980331e2 | |||
e6667c78c8 | |||
9976c59302 | |||
293c8cd81c | |||
8f4ea56184 | |||
898e005978 | |||
db3e6183ba | |||
0a47393510 | |||
6c5b514b41 | |||
84f994fd58 | |||
3d21123786 | |||
36887f1bdf | |||
0e4419312b | |||
94732b7227 | |||
4233e089f8 | |||
db61a764eb | |||
919eef79f6 | |||
0aa690b984 | |||
b6b9bfabf5 | |||
d927ab8fb7 | |||
a2dd447dbd | |||
8a76b46165 | |||
af3084ad36 | |||
285b8bdbe4 | |||
e2da4f09ee | |||
4ed99da689 | |||
bc94d31a8d | |||
0d3db75190 | |||
090f217f93 | |||
b98828fce3 | |||
5f8ae787f0 | |||
0c807a7de7 | |||
2dc60acaa6 | |||
29ea96a5e5 | |||
026331b397 | |||
bfe74ad1c5 | |||
7c8c2bef70 | |||
4ccb57e6a3 | |||
c8d3bf780d | |||
8788b727c5 | |||
5e9280d972 | |||
bd856d0143 | |||
da57063b68 | |||
171aa63df9 | |||
74dba4b981 | |||
a3ebd07093 | |||
2de5afd648 | |||
e8cc42e155 | |||
20e20969e4 | |||
802d5478d1 | |||
05f718f3ae | |||
7682b966a8 | |||
7cb4f03554 | |||
b1b74b2551 | |||
bbad4100dc | |||
25df0e4876 | |||
4ba40b826a | |||
06a0eba5c5 | |||
fe5b0207c0 | |||
e01c738cf0 | |||
d2d59bdad7 | |||
dd3bfa68c6 | |||
4e12ba5ffe | |||
35a8b8f592 | |||
5c8feed8aa | |||
e018fdcbdf | |||
39b9def76c | |||
2801c617f6 | |||
5461a6d8dc | |||
d93c3ad6c7 | |||
aec7dac4c7 | |||
407ec08463 | |||
4628f31993 | |||
1f2fbc362f | |||
666b20d3a9 | |||
5de6710261 | |||
e99e272029 | |||
650f612a6b | |||
38093ab817 | |||
d2c37a0098 | |||
804aa0b9b8 | |||
692cf8de31 | |||
b15c3b7fa3 | |||
49121fd179 | |||
9bad75e7c2 | |||
7358b67072 | |||
1b0ba01258 | |||
6fc5ee3ed3 | |||
099707446d | |||
d6b7fd73df | |||
6bfb0ddbf9 | |||
e1b76fa628 | |||
e6f98def6a | |||
590479eee2 | |||
d25305be4a | |||
2889a97f17 | |||
b540821a32 | |||
5b43b72838 | |||
46cd33d194 | |||
1287829bdf | |||
c91c8b2bcd | |||
a5b4c4cd66 | |||
1688347367 | |||
6e79811bc9 | |||
e1258151de | |||
a7c833b9db | |||
2f161d2f43 | |||
0a5f23f1af | |||
23a3dbbc5e | |||
8975665407 | |||
90de90684c | |||
d1ecfe9603 | |||
f7f25e9428 | |||
6ae7ab5c5a | |||
315c90cacc | |||
2caa910613 | |||
8e55ebc4b7 | |||
665e524aa9 | |||
ae021ac7ea | |||
dcbb481b10 | |||
e6165caed9 | |||
58fdc9f48f | |||
1c02608410 | |||
5e0b322273 | |||
4f336bed05 | |||
99d476df86 | |||
81062e74d7 | |||
acae8ac891 | |||
e3dc0f725e | |||
40a7919a3f | |||
14d0e38c5d | |||
62649226ba | |||
0a04ad74d8 | |||
467050d87e | |||
e8f2a01851 | |||
f972055ebf | |||
9bbfe498cc | |||
b21c9f894f | |||
7a0f29f557 | |||
ed72620d33 | |||
b8356917b3 | |||
84fedfaa0b | |||
2d358188af | |||
79278d8f4b | |||
b943b9a7ed | |||
1c20bbed66 | |||
33006e3d01 | |||
90ae55c0d4 | |||
626d0891f9 | |||
09cccd1b89 | |||
940a2ed065 | |||
c2fa1a1c00 | |||
1f1b1f7b65 | |||
4b52995143 | |||
6a6d19686c | |||
798162fb62 | |||
74c71abea5 | |||
0e679eda32 | |||
403c169b71 | |||
a113e21e19 | |||
71c091c226 | |||
b8d27cc682 | |||
c9b967b9d0 | |||
410049be6e | |||
be6361f619 | |||
3a7daf8b42 | |||
f435d3dd48 | |||
eb32bec43c | |||
232429a77d | |||
0946734633 | |||
ea1472a9eb | |||
f710f6ad6c | |||
030fedfcfb | |||
bd1d230f67 | |||
dcafa63d74 | |||
3a42b42dbf | |||
4747f23202 | |||
5057cbed16 | |||
7aff767a4b | |||
61bdc8a52a | |||
5afd0fafa8 | |||
eeda0405f3 | |||
0e2b7d03fc | |||
c7f5ab0161 | |||
01e8e4256d | |||
75adc2285e | |||
9e12d84ba0 | |||
d3b503d3ef | |||
dd86c3a657 | |||
aba6e48e2b | |||
73848c3141 | |||
33d6015088 | |||
7e962e05f6 | |||
c73c6876b2 | |||
8e949c3e1a | |||
472a76d563 | |||
f5d88ec94c | |||
2182c021b9 | |||
a9c9880fd4 | |||
d91c76467d | |||
2f10ace27f | |||
3b79a61bb6 | |||
ef0fab1178 | |||
189b6370a9 | |||
0ed93c56d0 | |||
4d18dd3845 | |||
7b7cbb20db | |||
84c2f5c2c4 | |||
c85c6df784 | |||
d5d898fa07 | |||
ef5ebabf81 | |||
f89b4c4ef5 | |||
8b277a2d19 | |||
a84e77e055 | |||
892c983e1e | |||
1d3809c986 | |||
3117f617d9 | |||
7e6053768f | |||
3d9cd0a2fc | |||
8d90768594 | |||
7e8a9482d4 | |||
bf7d29e6ab | |||
608001e0e1 | |||
0dd9558f33 | |||
7acd850e68 | |||
ecd3ea96b1 | |||
d869bcfd3a | |||
818e021761 | |||
b286322247 | |||
661b057e85 | |||
9be4e344f6 | |||
ebc782e266 | |||
887a46fa7f | |||
0cc8d6f2c7 | |||
3546d38f75 | |||
376cb76036 | |||
8e8da46a54 | |||
94e003312d | |||
fe42d46a38 | |||
4c0a4bc1ae | |||
4161d3a38a | |||
4a763e4e03 | |||
9783424066 | |||
290b5f38a7 | |||
5bfd04722c | |||
12f956f4c3 | |||
0b767fcb68 | |||
a303108da2 | |||
5e9cca5b1d | |||
d1c79c95b2 | |||
378d2c3dc9 | |||
a8ea9f5e49 | |||
957a54ccf3 | |||
0037a30c11 | |||
77e079d91c | |||
25137c6923 | |||
0a0401dd87 | |||
74f3ee2f08 | |||
69fc75fc97 | |||
5a85232374 | |||
5892b209d3 | |||
6715ecacd6 | |||
d72715d51b | |||
a7f9fa5818 | |||
c45916aaee | |||
8bbd57e82f | |||
987a1a664b | |||
99bfa9874a | |||
82058bab0e | |||
a566fca01f | |||
e52f5e4186 | |||
c90ede69dd | |||
85ba012b6f | |||
4cc094576d | |||
74ddc238be | |||
b53ddb1351 | |||
ca5a6c81b8 | |||
7b7bbaea50 | |||
d4b40eb52e | |||
ed524c2f64 | |||
8e3c8459f8 | |||
e661ee1489 | |||
9eaeb2df42 | |||
481c0f881a | |||
a065c703eb | |||
f72ea68f66 | |||
9226a1188e | |||
c06cb02cd6 | |||
20747001b0 | |||
b4be6b4ac2 | |||
bd3dd39dbc | |||
9e0905d49e | |||
3c0719f50e | |||
77d3668a06 | |||
e914c7d02b | |||
b40f521212 | |||
d40ca88cd5 | |||
1e63baed97 | |||
cdfd151851 | |||
12fbc972d9 | |||
dca939f025 | |||
2e0c1babe4 | |||
ed9b893c12 | |||
731f80bd5f | |||
85852bf2f0 | |||
2c3ef97a14 | |||
9ec65689ba | |||
44f5de32a5 | |||
c016d5fc84 | |||
306ce2664c | |||
3ce5471ef4 | |||
4cdd6c05bf | |||
d364ea1b4c | |||
6fa08ea828 | |||
296c6e8044 | |||
0541f3dfde | |||
052e0f976a | |||
f41dfc9be2 | |||
74437fdc20 | |||
df2b660b75 | |||
12f231aa41 | |||
2f3ae229c9 | |||
5bbed854a4 | |||
2321c12bc9 | |||
1cdfd1291f | |||
223946ad76 | |||
4ea1b5b94c | |||
919970d199 | |||
19ed164845 | |||
92001a45be | |||
78b761a672 | |||
7bfa39f459 | |||
d586cca672 | |||
efce172c01 | |||
0974325148 | |||
206754919f | |||
b49512e28d | |||
fa71759a20 | |||
9338e35504 | |||
2956dcb9c2 | |||
762bebf416 | |||
f3b5cef253 | |||
6869c5a671 | |||
352b44be0f | |||
5912708d3a | |||
45a3127696 | |||
10c20621a8 | |||
49e0e44461 | |||
ec6b080ba6 | |||
28944755ac | |||
7318239b2d | |||
cf66d246a9 | |||
41fe6faa52 | |||
685c96bb38 | |||
2c3e5268e4 | |||
2d5ce58612 | |||
fe3d67eff5 | |||
4cea31fce5 | |||
aa2c80ec12 | |||
e283a18def | |||
f5b2bec356 | |||
c2b32996fd | |||
195566a2b6 | |||
073c318671 | |||
caeec47b7c | |||
44f6b36347 | |||
4e32414f48 | |||
573c9c999e | |||
825fcff82d | |||
a95bf7bc6c | |||
0bc3bff58e | |||
c3b86fab6b | |||
906602134e | |||
30791f7529 | |||
456d939b47 | |||
1f47636e8d | |||
f4acc2669d | |||
46b5757fd1 | |||
1cd75cd78f | |||
f7f3fea7a7 | |||
5dd2000f10 | |||
1b2bb85b37 | |||
113b188a40 | |||
e549341196 | |||
8a0d939147 | |||
4b57d7f102 | |||
02e0c72a80 | |||
bfc9979961 | |||
8d76f79732 | |||
4add293186 | |||
1fc5ef76a6 | |||
e6c9959381 | |||
9db00516c3 | |||
44e225c273 | |||
99e75ba325 | |||
3a078271ff | |||
1f9991eeda | |||
bfe72668dc | |||
51d95c81c1 | |||
6c39cd1ae1 | |||
5d36f1188a | |||
4c42949516 | |||
8922524f44 | |||
eac367c611 | |||
f02acd7f94 | |||
05ddfb3de3 | |||
5c2c89ca45 | |||
ec1ce4adef | |||
71f1f972c9 | |||
23757bc841 | |||
9671090385 | |||
a03ddf3fc2 | |||
da3538a836 | |||
c782c11b6d | |||
05a2ea9b18 | |||
a482c72a56 | |||
22bdf13835 | |||
0a3affc5d0 | |||
d642322985 | |||
9f63a9c6dd | |||
11a4874bfb | |||
d4dd55944a | |||
23d6216029 | |||
f7297ddf78 | |||
eb3715d00b | |||
aae6472e11 | |||
a71e3e4720 | |||
189128f0d3 | |||
3fb951a748 | |||
2293849d94 | |||
cd5b3b6523 | |||
c8a2ed290b | |||
184d241695 | |||
cab65477b0 | |||
3507623c92 | |||
b99dd1bded | |||
a0d38bec49 | |||
f312a2d776 | |||
bfb816dd17 | |||
d6854d44b7 | |||
fdbba1b89c | |||
7f197a0ea7 | |||
2c9569b75f | |||
607b7d8aee | |||
00db6ac10f | |||
f034413e35 | |||
ff16eae477 | |||
dbd82930d4 | |||
2e9cf0bd97 | |||
8a2edc7228 | |||
6d14ba9d79 | |||
ba5f83f3d0 | |||
9f614e8a31 | |||
6e0d4a5144 | |||
bd8bd40863 | |||
c7a1069c0c | |||
dc0c6ca6a0 | |||
ff009ffb61 | |||
074b03eecf | |||
9201cbf357 | |||
5ea698ef97 | |||
400e54a501 | |||
3c0233e8b3 | |||
8d2ae38d85 | |||
2b866b5ab1 | |||
4da87ae3cb | |||
1ebad89c97 | |||
b8320c83fe | |||
0ee26ccf3d | |||
31ca9cd8f4 | |||
089de53136 | |||
280b22af55 | |||
ebdf375283 | |||
c058312af7 | |||
2befa921ea | |||
1792359e68 | |||
faaf14d63e | |||
49d1ec75c8 | |||
629556b5fc | |||
9ece541e52 | |||
fd51db8cac | |||
2005d93f44 | |||
010dafc655 | |||
bea9dd1590 | |||
ef0da25f11 | |||
c01a6b97fe | |||
059bd3aaf1 | |||
a9d180fdf1 | |||
c71b1092f2 | |||
c1e8274f46 | |||
583218b215 | |||
e05e67785b | |||
72d3ccded3 | |||
f30bd119df | |||
858fc062b3 | |||
6d622a70d3 | |||
4a0a6a4631 | |||
17c2acd77c | |||
27363522d3 | |||
1960b18058 | |||
91034cee09 | |||
a4d3cffa93 | |||
809c6d4cb9 | |||
2fecbf2c31 |
17
.gitea/issue_template.md
Normal file
17
.gitea/issue_template.md
Normal 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
|
7
.gitea/pull_request_template.md
Normal file
7
.gitea/pull_request_template.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#### Ticket Referenz:
|
||||||
|
|
||||||
|
#1
|
||||||
|
|
||||||
|
#### Gibt es etwas beim Review zu beachten?
|
||||||
|
|
||||||
|
Nein
|
129
.gitea/workflows/deploy_dev.yaml
Normal file
129
.gitea/workflows/deploy_dev.yaml
Normal 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: '{}'
|
128
.gitea/workflows/deploy_prod.yaml
Normal file
128
.gitea/workflows/deploy_prod.yaml
Normal 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: '{}'
|
129
.gitea/workflows/deploy_staging.yaml
Normal file
129
.gitea/workflows/deploy_staging.yaml
Normal 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: '{}'
|
18
.gitmodules
vendored
18
.gitmodules
vendored
@ -1,9 +1,9 @@
|
|||||||
[submodule "kdb-bot/src/bot/config"]
|
[submodule "bot/src/bot/config"]
|
||||||
path = kdb-bot/src/bot/config
|
path = bot/src/bot/config
|
||||||
url = https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot.config.git
|
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.config.git
|
||||||
[submodule "kdb-bot/src/bot_api/config"]
|
[submodule "bot/src/bot_api/config"]
|
||||||
path = kdb-bot/src/bot_api/config
|
path = bot/src/bot_api/config
|
||||||
url = https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot.api.config.git
|
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.api.config.git
|
||||||
[submodule "kdb-bot/docker"]
|
[submodule "bot/docker"]
|
||||||
path = kdb-bot/docker
|
path = bot/docker
|
||||||
url = https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot.docker.git
|
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.docker.git
|
||||||
|
9
LICENSE
9
LICENSE
@ -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.
|
100
bot/.cpl/schematic_db_table.py
Normal file
100
bot/.cpl/schematic_db_table.py
Normal 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", [])
|
55
bot/.cpl/schematic_migration.py
Normal file
55
bot/.cpl/schematic_migration.py
Normal 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", [])
|
@ -1,7 +1,7 @@
|
|||||||
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
|
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
|
||||||
|
|
||||||
|
|
||||||
class query(GenerateSchematicABC):
|
class Query(GenerateSchematicABC):
|
||||||
def __init__(self, *args: str):
|
def __init__(self, *args: str):
|
||||||
GenerateSchematicABC.__init__(self, *args)
|
GenerateSchematicABC.__init__(self, *args)
|
||||||
|
|
@ -7,40 +7,37 @@
|
|||||||
"bot-core": "src/bot_core/bot-core.json",
|
"bot-core": "src/bot_core/bot-core.json",
|
||||||
"bot-data": "src/bot_data/bot-data.json",
|
"bot-data": "src/bot_data/bot-data.json",
|
||||||
"bot-graphql": "src/bot_graphql/bot-graphql.json",
|
"bot-graphql": "src/bot_graphql/bot-graphql.json",
|
||||||
|
"achievements": "src/modules/achievements/achievements.json",
|
||||||
"auto-role": "src/modules/auto_role/auto-role.json",
|
"auto-role": "src/modules/auto_role/auto-role.json",
|
||||||
"base": "src/modules/base/base.json",
|
"base": "src/modules/base/base.json",
|
||||||
"boot-log": "src/modules/boot_log/boot-log.json",
|
"boot-log": "src/modules/boot_log/boot-log.json",
|
||||||
|
"config": "src/modules/config/config.json",
|
||||||
"database": "src/modules/database/database.json",
|
"database": "src/modules/database/database.json",
|
||||||
"level": "src/modules/level/level.json",
|
"level": "src/modules/level/level.json",
|
||||||
"permission": "src/modules/permission/permission.json",
|
|
||||||
"technician": "src/modules/technician/technician.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",
|
"checks": "tools/checks/checks.json",
|
||||||
"get-version": "tools/get_version/get-version.json",
|
"get-version": "tools/get_version/get-version.json",
|
||||||
"post-build": "tools/post_build/post-build.json",
|
"post-build": "tools/post_build/post-build.json",
|
||||||
"set-version": "tools/set_version/set-version.json"
|
"set-version": "tools/set_version/set-version.json",
|
||||||
|
"migration-to-sql": "tools/migration_to_sql/migration-to-sql.json"
|
||||||
},
|
},
|
||||||
"Scripts": {
|
"Scripts": {
|
||||||
"format": "black ./",
|
"format": "black ./",
|
||||||
|
|
||||||
"sv": "cpl set-version $ARGS",
|
"sv": "cpl set-version $ARGS",
|
||||||
"set-version": "cpl run set-version $ARGS --dev; echo '';",
|
"set-version": "cpl run set-version $ARGS --dev; echo '';",
|
||||||
|
|
||||||
"gv": "cpl get-version",
|
"gv": "cpl get-version",
|
||||||
"get-version": "export VERSION=$(cpl run get-version --dev); echo $VERSION;",
|
"get-version": "export VERSION=$(cpl run get-version --dev); echo $VERSION;",
|
||||||
|
|
||||||
"pre-build": "cpl set-version $ARGS; black ./;",
|
"pre-build": "cpl set-version $ARGS; black ./;",
|
||||||
"post-build": "cpl run post-build --dev; black ./;",
|
"post-build": "cpl run post-build --dev; black ./;",
|
||||||
|
|
||||||
"pre-prod": "cpl build",
|
"pre-prod": "cpl build",
|
||||||
"prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;",
|
"prod": "export SDB_ENVIRONMENT=production; export SDB_NAME=SDB-Prod; cpl start;",
|
||||||
|
|
||||||
"pre-stage": "cpl build",
|
"pre-stage": "cpl build",
|
||||||
"stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;",
|
"stage": "export SDB_ENVIRONMENT=staging; export SDB_NAME=SDB-Stage; cpl start;",
|
||||||
|
|
||||||
"pre-dev": "cpl build",
|
"pre-dev": "cpl build",
|
||||||
"dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;",
|
"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) .;",
|
||||||
"docker-build": "cpl build $ARGS; docker build -t kdb-bot/kdb-bot:$(cpl gv) .;",
|
|
||||||
"dc-up": "docker-compose up -d",
|
"dc-up": "docker-compose up -d",
|
||||||
"dc-down": "docker-compose down",
|
"dc-down": "docker-compose down",
|
||||||
"docker": "cpl dc-down; cpl docker-build; cpl dc-up;"
|
"docker": "cpl dc-down; cpl docker-build; cpl dc-up;"
|
1
bot/docker
Submodule
1
bot/docker
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit fbcd9226c4d199529fdbce5169b38b1b23074adb
|
@ -2,7 +2,7 @@
|
|||||||
FROM python:3.10.4-alpine
|
FROM python:3.10.4-alpine
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY ./dist/bot/build/kdb-bot/ .
|
COPY ./dist/bot/build/bot/ .
|
||||||
COPY ./dist/bot/build/requirements.txt .
|
COPY ./dist/bot/build/requirements.txt .
|
||||||
|
|
||||||
RUN python -m pip install --upgrade pip
|
RUN python -m pip install --upgrade pip
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -8,8 +8,11 @@ from cpl_discord.service import DiscordBotServiceABC, DiscordBotService
|
|||||||
from cpl_translation import TranslatePipe, TranslationServiceABC, TranslationSettings
|
from cpl_translation import TranslatePipe, TranslationServiceABC, TranslationSettings
|
||||||
|
|
||||||
from bot_api.api_thread import ApiThread
|
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_enum import FeatureFlagsEnum
|
||||||
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
|
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):
|
class Application(DiscordBotApplicationABC):
|
||||||
@ -21,12 +24,15 @@ class Application(DiscordBotApplicationABC):
|
|||||||
|
|
||||||
# cpl-core
|
# cpl-core
|
||||||
self._logger: LoggerABC = services.get_service(LoggerABC)
|
self._logger: LoggerABC = services.get_service(LoggerABC)
|
||||||
|
self._data_integrity: DataIntegrityService = services.get_service(DataIntegrityService)
|
||||||
# cpl-discord
|
# cpl-discord
|
||||||
self._bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
|
self._bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
|
||||||
self._bot_settings: DiscordBotSettings = config.get_configuration(DiscordBotSettings)
|
self._bot_settings: DiscordBotSettings = config.get_configuration(DiscordBotSettings)
|
||||||
# cpl-translation
|
# cpl-translation
|
||||||
self._translation: TranslationServiceABC = services.get_service(TranslationServiceABC)
|
self._translation: TranslationServiceABC = services.get_service(TranslationServiceABC)
|
||||||
self._t: TranslatePipe = services.get_service(TranslatePipe)
|
self._t: TranslatePipe = services.get_service(TranslatePipe)
|
||||||
|
# internal stuff
|
||||||
|
self._tasks = services.get_services(TaskABC)
|
||||||
|
|
||||||
self._feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings)
|
self._feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings)
|
||||||
|
|
||||||
@ -52,7 +58,11 @@ class Application(DiscordBotApplicationABC):
|
|||||||
self._api.join()
|
self._api.join()
|
||||||
return
|
return
|
||||||
|
|
||||||
self._logger.trace(__name__, f"Try to start {DiscordBotService.__name__}")
|
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.start_async()
|
||||||
await self._bot.stop_async()
|
await self._bot.stop_async()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -64,13 +74,17 @@ class Application(DiscordBotApplicationABC):
|
|||||||
|
|
||||||
self._is_stopping = True
|
self._is_stopping = True
|
||||||
try:
|
try:
|
||||||
self._logger.trace(__name__, f"Try to stop {DiscordBotService.__name__}")
|
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._bot.close()
|
||||||
self._logger.trace(__name__, f"Stopped {DiscordBotService.__name__}")
|
await self._data_integrity.check_data_integrity(is_for_shutdown=True)
|
||||||
|
self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.error(__name__, "stop failed", e)
|
self._logger.error(__name__, "stop failed", e)
|
||||||
|
|
||||||
Console.write_line()
|
Console.write_line()
|
||||||
|
|
||||||
def is_restart(self):
|
def is_restart(self):
|
||||||
return True if self._configuration.get_configuration("IS_RESTART") == "true" else False #
|
return True if self._configuration.get_configuration("IS_RESTART") == "true" else False
|
0
kdb-bot/src/bot/bot → bot/src/bot/bot
Normal file → Executable file
0
kdb-bot/src/bot/bot → bot/src/bot/bot
Normal file → Executable file
@ -3,37 +3,43 @@
|
|||||||
"Name": "bot",
|
"Name": "bot",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "0",
|
"Minor": "2",
|
||||||
"Micro": "1"
|
"Micro": "8"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
"Description": "Keksdose bot",
|
"Description": "sh-edraft.de Discord bot",
|
||||||
"LongDescription": "Discord bot for the Keksdose discord Server",
|
"LongDescription": "Discord bot for customers of sh-edraft.de",
|
||||||
"URL": "https://www.sh-edraft.de",
|
"URL": "https://www.sh-edraft.de",
|
||||||
"CopyrightDate": "2022 - 2023",
|
"CopyrightDate": "2022 - 2023",
|
||||||
"CopyrightName": "sh-edraft.de",
|
"CopyrightName": "sh-edraft.de",
|
||||||
"LicenseName": "MIT",
|
"LicenseName": "MIT",
|
||||||
"LicenseDescription": "MIT, see LICENSE for more details.",
|
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core==2022.12.1.post3",
|
"cpl-translation==2023.4.0.post1",
|
||||||
"cpl-translation==2022.12.1",
|
"cpl-query==2023.10.0",
|
||||||
"cpl-query==2022.12.2.post2",
|
"cpl-discord==2023.10.0.post1",
|
||||||
"cpl-discord==2022.12.2.post1",
|
"Flask==3.0.0",
|
||||||
"Flask==2.2.2",
|
"Flask-Classful==0.16.0",
|
||||||
"Flask-Classful==0.14.2",
|
"Flask-Cors==4.0.0",
|
||||||
"Flask-Cors==3.0.10",
|
"PyJWT==2.8.0",
|
||||||
"PyJWT==2.6.0",
|
|
||||||
"waitress==2.1.2",
|
"waitress==2.1.2",
|
||||||
"Flask-SocketIO==5.3.2",
|
"Flask-SocketIO==5.3.6",
|
||||||
"eventlet==0.33.3",
|
"eventlet==0.33.3",
|
||||||
"requests-oauthlib==1.3.1",
|
"requests-oauthlib==1.3.1",
|
||||||
"icmplib==3.0.3",
|
"icmplib==3.0.4",
|
||||||
"ariadne==0.17.1"
|
"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": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.12.1.post3",
|
"cpl-cli==2023.4.0.post3",
|
||||||
"pygount==1.5.1"
|
"pygount==1.6.1",
|
||||||
|
"black==23.10.1"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
@ -58,12 +64,15 @@
|
|||||||
"../bot_core/bot-core.json",
|
"../bot_core/bot-core.json",
|
||||||
"../bot_data/bot-data.json",
|
"../bot_data/bot-data.json",
|
||||||
"../bot_graphql/bot-graphql.json",
|
"../bot_graphql/bot-graphql.json",
|
||||||
|
"../modules/achievements/achievements.json",
|
||||||
"../modules/auto_role/auto-role.json",
|
"../modules/auto_role/auto-role.json",
|
||||||
"../modules/base/base.json",
|
"../modules/base/base.json",
|
||||||
"../modules/boot_log/boot-log.json",
|
"../modules/boot_log/boot-log.json",
|
||||||
|
"../modules/config/config.json",
|
||||||
"../modules/database/database.json",
|
"../modules/database/database.json",
|
||||||
"../modules/level/level.json",
|
"../modules/level/level.json",
|
||||||
"../modules/permission/permission.json",
|
"../modules/short_role_name/short-role-name.json",
|
||||||
|
"../modules/special_offers/special-offers.json",
|
||||||
"../modules/technician/technician.json"
|
"../modules/technician/technician.json"
|
||||||
]
|
]
|
||||||
}
|
}
|
1
bot/src/bot/config
Submodule
1
bot/src/bot/config
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit eeebd13f80c6ceecc922ede5771e55212a884019
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot.extension"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
22
bot/src/bot/extension/clean_logs_extension.py
Normal file
22
bot/src/bot/extension/clean_logs_extension.py
Normal 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}"))
|
||||||
|
)
|
@ -3,7 +3,7 @@ from cpl_core.configuration import ConfigurationABC
|
|||||||
from cpl_core.dependency_injection import ServiceProviderABC
|
from cpl_core.dependency_injection import ServiceProviderABC
|
||||||
from cpl_discord.service import DiscordBotServiceABC
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
|
||||||
from bot_core.configuration.bot_settings import BotSettings
|
from bot_data.model.technician_config import TechnicianConfig
|
||||||
|
|
||||||
|
|
||||||
class InitBotExtension(ApplicationExtensionABC):
|
class InitBotExtension(ApplicationExtensionABC):
|
||||||
@ -11,6 +11,6 @@ class InitBotExtension(ApplicationExtensionABC):
|
|||||||
ApplicationExtensionABC.__init__(self)
|
ApplicationExtensionABC.__init__(self)
|
||||||
|
|
||||||
async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
|
async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
|
||||||
settings = config.get_configuration(BotSettings)
|
settings = config.get_configuration(TechnicianConfig)
|
||||||
|
|
||||||
bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC, max_messages=settings.cache_max_messages)
|
bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC, max_messages=settings.cache_max_messages)
|
@ -6,15 +6,17 @@ from cpl_core.application import ApplicationBuilder
|
|||||||
from cpl_core.console import Console
|
from cpl_core.console import Console
|
||||||
|
|
||||||
from bot.application import Application
|
from bot.application import Application
|
||||||
|
from bot.extension.clean_logs_extension import CleanLogsExtension
|
||||||
from bot.extension.init_bot_extension import InitBotExtension
|
from bot.extension.init_bot_extension import InitBotExtension
|
||||||
from bot.startup import Startup
|
from bot.startup import Startup
|
||||||
from bot.startup_discord_extension import StartupDiscordExtension
|
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_module_extension import StartupModuleExtension
|
||||||
from bot.startup_settings_extension import StartupSettingsExtension
|
from bot.startup_settings_extension import StartupSettingsExtension
|
||||||
from bot_api.app_api_extension import AppApiExtension
|
from bot_api.app_api_extension import AppApiExtension
|
||||||
from bot_core.core_extension.core_extension import CoreExtension
|
from bot_core.core_extension.core_extension import CoreExtension
|
||||||
from modules.boot_log.boot_log_extension import BootLogExtension
|
from modules.boot_log.boot_log_extension import BootLogExtension
|
||||||
|
from modules.config.config_extension import ConfigExtension
|
||||||
from modules.database.database_extension import DatabaseExtension
|
from modules.database.database_extension import DatabaseExtension
|
||||||
|
|
||||||
|
|
||||||
@ -30,15 +32,18 @@ class Program:
|
|||||||
.use_extension(StartupDiscordExtension)
|
.use_extension(StartupDiscordExtension)
|
||||||
.use_extension(StartupModuleExtension)
|
.use_extension(StartupModuleExtension)
|
||||||
.use_extension(StartupMigrationExtension)
|
.use_extension(StartupMigrationExtension)
|
||||||
|
.use_extension(CleanLogsExtension)
|
||||||
|
.use_extension(DatabaseExtension)
|
||||||
|
.use_extension(ConfigExtension)
|
||||||
.use_extension(InitBotExtension)
|
.use_extension(InitBotExtension)
|
||||||
.use_extension(BootLogExtension)
|
.use_extension(BootLogExtension)
|
||||||
.use_extension(DatabaseExtension)
|
|
||||||
.use_extension(AppApiExtension)
|
.use_extension(AppApiExtension)
|
||||||
.use_extension(CoreExtension)
|
.use_extension(CoreExtension)
|
||||||
.use_startup(Startup)
|
.use_startup(Startup)
|
||||||
)
|
)
|
||||||
self.app: Application = await app_builder.build_async()
|
self.app: Application = await app_builder.build_async()
|
||||||
await self.app.run_async()
|
await self.app.run_async()
|
||||||
|
Console.write_line(f"[ INFO ] [ {__name__} ]: Finished app.run_async")
|
||||||
|
|
||||||
async def stop(self):
|
async def stop(self):
|
||||||
if self.app is None:
|
if self.app is None:
|
@ -5,12 +5,15 @@ from bot_core.core_extension.core_extension_module import CoreExtensionModule
|
|||||||
from bot_core.core_module import CoreModule
|
from bot_core.core_module import CoreModule
|
||||||
from bot_data.data_module import DataModule
|
from bot_data.data_module import DataModule
|
||||||
from bot_graphql.graphql_module import GraphQLModule
|
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.auto_role.auto_role_module import AutoRoleModule
|
||||||
from modules.base.base_module import BaseModule
|
from modules.base.base_module import BaseModule
|
||||||
from modules.boot_log.boot_log_module import BootLogModule
|
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.database.database_module import DatabaseModule
|
||||||
from modules.level.level_module import LevelModule
|
from modules.level.level_module import LevelModule
|
||||||
from modules.permission.permission_module import PermissionModule
|
from modules.short_role_name.short_role_name_module import ShortRoleNameModule
|
||||||
|
from modules.special_offers.special_offers_module import SteamSpecialOffersModule
|
||||||
from modules.technician.technician_module import TechnicianModule
|
from modules.technician.technician_module import TechnicianModule
|
||||||
|
|
||||||
|
|
||||||
@ -23,14 +26,17 @@ class ModuleList:
|
|||||||
[
|
[
|
||||||
CoreModule, # has to be first!
|
CoreModule, # has to be first!
|
||||||
DataModule,
|
DataModule,
|
||||||
GraphQLModule,
|
ConfigModule, # has to be before db check
|
||||||
PermissionModule,
|
|
||||||
LevelModule,
|
|
||||||
DatabaseModule,
|
DatabaseModule,
|
||||||
|
GraphQLModule,
|
||||||
AutoRoleModule,
|
AutoRoleModule,
|
||||||
BaseModule,
|
BaseModule,
|
||||||
|
LevelModule,
|
||||||
ApiModule,
|
ApiModule,
|
||||||
TechnicianModule,
|
TechnicianModule,
|
||||||
|
AchievementsModule,
|
||||||
|
ShortRoleNameModule,
|
||||||
|
SteamSpecialOffersModule,
|
||||||
# has to be last!
|
# has to be last!
|
||||||
BootLogModule,
|
BootLogModule,
|
||||||
CoreExtensionModule,
|
CoreExtensionModule,
|
@ -15,7 +15,9 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
|||||||
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
|
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
|
||||||
from bot_core.logging.command_logger import CommandLogger
|
from bot_core.logging.command_logger import CommandLogger
|
||||||
from bot_core.logging.database_logger import DatabaseLogger
|
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.message_logger import MessageLogger
|
||||||
|
from bot_core.logging.task_logger import TaskLogger
|
||||||
from bot_data.db_context import DBContext
|
from bot_data.db_context import DBContext
|
||||||
|
|
||||||
|
|
||||||
@ -43,6 +45,8 @@ class Startup(StartupABC):
|
|||||||
services.add_singleton(CustomFileLoggerABC, CommandLogger)
|
services.add_singleton(CustomFileLoggerABC, CommandLogger)
|
||||||
services.add_singleton(CustomFileLoggerABC, DatabaseLogger)
|
services.add_singleton(CustomFileLoggerABC, DatabaseLogger)
|
||||||
services.add_singleton(CustomFileLoggerABC, MessageLogger)
|
services.add_singleton(CustomFileLoggerABC, MessageLogger)
|
||||||
|
services.add_singleton(CustomFileLoggerABC, TaskLogger)
|
||||||
|
services.add_singleton(CustomFileLoggerABC, EventLogger)
|
||||||
|
|
||||||
if self._feature_flags.get_flag(FeatureFlagsEnum.api_module):
|
if self._feature_flags.get_flag(FeatureFlagsEnum.api_module):
|
||||||
services.add_singleton(CustomFileLoggerABC, ApiLogger)
|
services.add_singleton(CustomFileLoggerABC, ApiLogger)
|
@ -1,6 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Callable, Type, Optional
|
from typing import Optional, Type, Callable
|
||||||
|
|
||||||
from cpl_core.application import StartupExtensionABC
|
from cpl_core.application import StartupExtensionABC
|
||||||
from cpl_core.configuration import ConfigurationABC
|
from cpl_core.configuration import ConfigurationABC
|
||||||
@ -8,11 +8,7 @@ from cpl_core.dependency_injection import ServiceCollectionABC
|
|||||||
from cpl_core.environment import ApplicationEnvironmentABC
|
from cpl_core.environment import ApplicationEnvironmentABC
|
||||||
|
|
||||||
from bot_core.configuration.bot_logging_settings import BotLoggingSettings
|
from bot_core.configuration.bot_logging_settings import BotLoggingSettings
|
||||||
from bot_core.configuration.bot_settings import BotSettings
|
from bot_core.environment_variables import MAINTENANCE, MIGRATION_ONLY
|
||||||
from modules.base.configuration.base_settings import BaseSettings
|
|
||||||
from modules.boot_log.configuration.boot_log_settings import BootLogSettings
|
|
||||||
from modules.level.configuration.level_settings import LevelSettings
|
|
||||||
from modules.permission.configuration.permission_settings import PermissionSettings
|
|
||||||
|
|
||||||
|
|
||||||
class StartupSettingsExtension(StartupExtensionABC):
|
class StartupSettingsExtension(StartupExtensionABC):
|
||||||
@ -22,8 +18,14 @@ class StartupSettingsExtension(StartupExtensionABC):
|
|||||||
def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironmentABC):
|
def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironmentABC):
|
||||||
# this shit has to be done here because we need settings in subsequent startup extensions
|
# 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__)))
|
environment.set_working_directory(os.path.dirname(os.path.realpath(__file__)))
|
||||||
configuration.add_environment_variables("KDB_")
|
configuration.add_environment_variables("SDB_")
|
||||||
configuration.add_environment_variables("DISCORD_")
|
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.json", optional=False)
|
||||||
configuration.add_json_file(f"config/appsettings.{environment.environment_name}.json", optional=True)
|
configuration.add_json_file(f"config/appsettings.{environment.environment_name}.json", optional=True)
|
||||||
@ -34,13 +36,6 @@ class StartupSettingsExtension(StartupExtensionABC):
|
|||||||
configuration.add_json_file(f"config/feature-flags.{environment.host_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))
|
configuration.add_configuration("Startup_StartTime", str(self._start_time))
|
||||||
self._configure_settings_with_sub_settings(configuration, BotSettings, lambda x: x.servers, lambda x: x.id)
|
|
||||||
self._configure_settings_with_sub_settings(configuration, BaseSettings, lambda x: x.servers, lambda x: x.id)
|
|
||||||
self._configure_settings_with_sub_settings(configuration, BootLogSettings, lambda x: x.servers, lambda x: x.id)
|
|
||||||
self._configure_settings_with_sub_settings(configuration, LevelSettings, lambda x: x.servers, lambda x: x.id)
|
|
||||||
self._configure_settings_with_sub_settings(
|
|
||||||
configuration, PermissionSettings, lambda x: x.servers, lambda x: x.id
|
|
||||||
)
|
|
||||||
self._configure_settings_with_sub_settings(
|
self._configure_settings_with_sub_settings(
|
||||||
configuration, BotLoggingSettings, lambda x: x.files, lambda x: x.key
|
configuration, BotLoggingSettings, lambda x: x.files, lambda x: x.key
|
||||||
)
|
)
|
||||||
@ -50,9 +45,9 @@ class StartupSettingsExtension(StartupExtensionABC):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _configure_settings_with_sub_settings(
|
def _configure_settings_with_sub_settings(
|
||||||
config: ConfigurationABC, settings: Type, list_atr: Callable, atr: Callable
|
config: ConfigurationABC, settings_type: Type, list_atr: Callable, atr: Callable
|
||||||
):
|
):
|
||||||
settings: Optional[settings] = config.get_configuration(settings)
|
settings: Optional[settings_type] = config.get_configuration(settings_type)
|
||||||
if settings is None:
|
if settings is None:
|
||||||
return
|
return
|
||||||
|
|
@ -2,22 +2,22 @@
|
|||||||
"api": {
|
"api": {
|
||||||
"api": {
|
"api": {
|
||||||
"test_mail": {
|
"test_mail": {
|
||||||
"message": "Dies ist eine Test-Mail vom Krümelmonster Web Interface\nGesendet von {}-{}",
|
"message": "Dies ist eine Test-Mail vom Krümelmonster Web Interface\r\nGesendet von {}-{}",
|
||||||
"subject": "Krümelmonster Web Interface Test-Mail"
|
"subject": "Krümelmonster Web Interface Test-Mail"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"confirmation": {
|
"confirmation": {
|
||||||
"message": "Öffne den Link, um die E-Mail zu bestätigen:\n{}auth/register/{}",
|
"message": "Öffne den Link, um die E-Mail zu bestätigen:\r\n{}auth/register/{}",
|
||||||
"subject": "E-Mail für {} {} bestätigen"
|
"subject": "E-Mail für {} {} bestätigen"
|
||||||
},
|
},
|
||||||
"forgot_password": {
|
"forgot_password": {
|
||||||
"message": "Öffne den Link, um das Passwort zu ändern:\n{}auth/forgot-password/{}",
|
"message": "Öffne den Link, um das Passwort zu ändern:\r\n{}auth/forgot-password/{}",
|
||||||
"subject": "Passwort für {} {} zurücksetzen"
|
"subject": "Passwort für {} {} zurücksetzen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mail": {
|
"mail": {
|
||||||
"automatic_mail": "\n\nDies ist eine automatische E-Mail.\nGesendet von {}-{}@{}"
|
"automatic_mail": "\r\n\r\nDies ist eine automatische E-Mail.\r\nGesendet von {}-{}@{}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
@ -82,6 +82,7 @@
|
|||||||
"unexpected_quote_error": "Fehler: Unerwarteter Fehler beim Anführungszeichen!",
|
"unexpected_quote_error": "Fehler: Unerwarteter Fehler beim Anführungszeichen!",
|
||||||
"user_input_error": "Fehler: Eingabefehler!"
|
"user_input_error": "Fehler: Eingabefehler!"
|
||||||
},
|
},
|
||||||
|
"feature_not_activated": "Diese Funktion ist deaktiviert",
|
||||||
"hello_world": "Hallo Welt",
|
"hello_world": "Hallo Welt",
|
||||||
"no_permission_message": "Nein!\nIch höre nicht auf dich ¯\\_(ツ)_/¯",
|
"no_permission_message": "Nein!\nIch höre nicht auf dich ¯\\_(ツ)_/¯",
|
||||||
"not_implemented_yet": "Ey Alter, das kann ich noch nicht...",
|
"not_implemented_yet": "Ey Alter, das kann ich noch nicht...",
|
||||||
@ -89,10 +90,22 @@
|
|||||||
"booting": "Ich fahre gerade hoch...",
|
"booting": "Ich fahre gerade hoch...",
|
||||||
"restart": "Muss neue Kekse holen...",
|
"restart": "Muss neue Kekse holen...",
|
||||||
"running": "Ich esse Kekse :D",
|
"running": "Ich esse Kekse :D",
|
||||||
"shutdown": "Ich werde bestimmt wieder kommen..."
|
"shutdown": "Ich werde bestimmt wieder kommen...",
|
||||||
|
"maintenance": "In Wartung!"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"modules": {
|
"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": {
|
"auto_role": {
|
||||||
"add": {
|
"add": {
|
||||||
"error": {
|
"error": {
|
||||||
@ -116,6 +129,9 @@
|
|||||||
},
|
},
|
||||||
"success": "auto-role {} wurde entfernt :D"
|
"success": "auto-role {} wurde entfernt :D"
|
||||||
},
|
},
|
||||||
|
"react": {
|
||||||
|
"success": "Alle Reaktionen wurden hinzugefügt"
|
||||||
|
},
|
||||||
"rule": {
|
"rule": {
|
||||||
"add": {
|
"add": {
|
||||||
"error": {
|
"error": {
|
||||||
@ -147,18 +163,35 @@
|
|||||||
"base": {
|
"base": {
|
||||||
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
|
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
|
||||||
"afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
|
"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": {
|
"game_server": {
|
||||||
|
"add": {
|
||||||
|
"success": "Gameserver {} wurde hinzugefügt :)"
|
||||||
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"nothing_found": "Keine Gameserver gefunden."
|
"nothing_found": "Keine Gameserver gefunden."
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Gameserver",
|
"api_key": "API Key",
|
||||||
"description": "Konfigurierte Gameserver:",
|
"description": "Konfigurierte Gameserver:",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"api_key": "API Key"
|
"title": "Gameserver"
|
||||||
},
|
},
|
||||||
"add": {
|
"list_members": {
|
||||||
"success": "Gameserver {} wurde hinzugefügt :)"
|
"description": "Konfigurierte Mitglieder:",
|
||||||
|
"title": "Mitglieder",
|
||||||
|
"users": "Mitglieder"
|
||||||
},
|
},
|
||||||
"remove": {
|
"remove": {
|
||||||
"success": "Gameserver wurde entfernt :D"
|
"success": "Gameserver wurde entfernt :D"
|
||||||
@ -185,6 +218,7 @@
|
|||||||
"moved": "Alle Personen aus {} wurden nach {} verschoben."
|
"moved": "Alle Personen aus {} wurden nach {} verschoben."
|
||||||
},
|
},
|
||||||
"member_joined_help_voice_channel": "{} braucht Hilfe, bitte kümmere dich drum :D",
|
"member_joined_help_voice_channel": "{} braucht Hilfe, bitte kümmere dich drum :D",
|
||||||
|
"member_left_message": "{} hat uns leider verlassen :(",
|
||||||
"pong": "Pong",
|
"pong": "Pong",
|
||||||
"presence": {
|
"presence": {
|
||||||
"changed": "Presence wurde geändert.",
|
"changed": "Presence wurde geändert.",
|
||||||
@ -201,6 +235,11 @@
|
|||||||
"success": "Verlinkung wurde entfernt :D"
|
"success": "Verlinkung wurde entfernt :D"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
|
"birthday": {
|
||||||
|
"has_birthday": "Alles Gute zum Geburtag {} :D",
|
||||||
|
"success": "Dein Geburtstag wurde eingetragen.",
|
||||||
|
"success_team": "{} hat seinen Geburtstag eingetragen: {}"
|
||||||
|
},
|
||||||
"add": {
|
"add": {
|
||||||
"xp": "Die {} von {} wurden um {} erhöht"
|
"xp": "Die {} von {} wurden um {} erhöht"
|
||||||
},
|
},
|
||||||
@ -321,6 +360,9 @@
|
|||||||
"moderator": {
|
"moderator": {
|
||||||
"purge_message": "Na gut..., ich lösche alle Nachrichten wenns sein muss."
|
"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": {
|
"technician": {
|
||||||
"api_key": {
|
"api_key": {
|
||||||
"add": {
|
"add": {
|
||||||
@ -334,7 +376,8 @@
|
|||||||
},
|
},
|
||||||
"log_message": "Hier sind deine Logdateien! :)",
|
"log_message": "Hier sind deine Logdateien! :)",
|
||||||
"restart_message": "Bin gleich wieder da :D",
|
"restart_message": "Bin gleich wieder da :D",
|
||||||
"shutdown_message": "Trauert nicht um mich, es war eine logische Entscheidung. Das Wohl von Vielen, es wiegt schwerer als das Wohl von Wenigen oder eines Einzelnen. Ich war es und ich werde es immer sein, euer Freund. Lebt lange und in Frieden :)"
|
"shutdown_message": "Trauert nicht um mich, es war eine logische Entscheidung. Das Wohl von Vielen, es wiegt schwerer als das Wohl von Wenigen oder eines Einzelnen. Ich war es und ich werde es immer sein, euer Freund. Lebt lange und in Frieden :)",
|
||||||
|
"synced_message": "Der Sync wurde abgeschlossen."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.abc"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -114,3 +114,7 @@ class AuthServiceABC(ABC):
|
|||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def reset_password_async(self, rp_dto: ResetPasswordDTO):
|
async def reset_password_async(self, rp_dto: ResetPasswordDTO):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def resend_confirmation_email_by_mail(self, mail: str):
|
||||||
|
pass
|
@ -1,8 +1,9 @@
|
|||||||
|
import socket
|
||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
import uuid
|
import uuid
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from typing import Union
|
from typing import Union, Optional
|
||||||
|
|
||||||
import eventlet
|
import eventlet
|
||||||
from cpl_core.dependency_injection import ServiceProviderABC
|
from cpl_core.dependency_injection import ServiceProviderABC
|
||||||
@ -15,8 +16,8 @@ from werkzeug.exceptions import NotFound
|
|||||||
|
|
||||||
from bot_api.configuration.api_settings import ApiSettings
|
from bot_api.configuration.api_settings import ApiSettings
|
||||||
from bot_api.configuration.authentication_settings import AuthenticationSettings
|
from bot_api.configuration.authentication_settings import AuthenticationSettings
|
||||||
from bot_api.exception.service_error_code_enum import ServiceErrorCode
|
from bot_core.exception.service_error_code_enum import ServiceErrorCode
|
||||||
from bot_api.exception.service_exception import ServiceException
|
from bot_core.exception.service_exception import ServiceException
|
||||||
from bot_api.logging.api_logger import ApiLogger
|
from bot_api.logging.api_logger import ApiLogger
|
||||||
from bot_api.model.error_dto import ErrorDTO
|
from bot_api.model.error_dto import ErrorDTO
|
||||||
from bot_api.route.route import Route
|
from bot_api.route.route import Route
|
||||||
@ -53,10 +54,15 @@ class Api(Flask):
|
|||||||
self.register_error_handler(exc_class, self.handle_exception)
|
self.register_error_handler(exc_class, self.handle_exception)
|
||||||
|
|
||||||
# websockets
|
# websockets
|
||||||
self._socketio = SocketIO(self, cors_allowed_origins="*", path="/api/socket.io")
|
# 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("connect", self.on_connect)
|
||||||
self._socketio.on_event("disconnect", self.on_disconnect)
|
self._socketio.on_event("disconnect", self.on_disconnect)
|
||||||
|
|
||||||
|
self._socket: Optional[socket] = None
|
||||||
|
|
||||||
self._requests = {}
|
self._requests = {}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -143,13 +149,23 @@ class Api(Flask):
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
self._logger.info(__name__, f"Starting API {self._api_settings.host}:{self._api_settings.port}")
|
self._logger.info(
|
||||||
|
__name__,
|
||||||
|
f"Starting API {self._api_settings.host}:{self._api_settings.port}",
|
||||||
|
)
|
||||||
self._register_routes()
|
self._register_routes()
|
||||||
self.secret_key = CredentialManager.decrypt(self._auth_settings.secret_key)
|
self.secret_key = CredentialManager.decrypt(self._auth_settings.secret_key)
|
||||||
# from waitress import serve
|
# from waitress import serve
|
||||||
# https://docs.pylonsproject.org/projects/waitress/en/stable/arguments.html
|
# 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)
|
# serve(self, host=self._apt_settings.host, port=self._apt_settings.port, threads=10, connection_limit=1000, channel_timeout=10)
|
||||||
wsgi.server(eventlet.listen((self._api_settings.host, self._api_settings.port)), self, log_output=False)
|
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):
|
def on_connect(self):
|
||||||
self._logger.info(__name__, f"Client connected")
|
self._logger.info(__name__, f"Client connected")
|
@ -48,4 +48,4 @@ class ApiModule(ModuleABC):
|
|||||||
services.add_transient(GraphQLController)
|
services.add_transient(GraphQLController)
|
||||||
|
|
||||||
# cpl-discord
|
# cpl-discord
|
||||||
self._dc.add_event(DiscordEventTypesEnum.on_ready.value, BotApiOnReadyEvent)
|
services.add_transient(DiscordEventTypesEnum.on_ready.value, BotApiOnReadyEvent)
|
@ -17,3 +17,10 @@ class ApiThread(threading.Thread):
|
|||||||
self._api.start()
|
self._api.start()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.error(__name__, "Start failed", 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)
|
@ -3,8 +3,8 @@
|
|||||||
"Name": "bot-api",
|
"Name": "bot-api",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "0",
|
"Minor": "2",
|
||||||
"Micro": "1"
|
"Micro": "8"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
1
bot/src/bot_api/config
Submodule
1
bot/src/bot_api/config
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 12ffcbcd9b88612251a1e23cb6724e21562f74b8
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.configuration"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports
|
# imports
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
22
bot/src/bot_api/configuration/api_settings.py
Normal file
22
bot/src/bot_api/configuration/api_settings.py
Normal 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
|
39
bot/src/bot_api/configuration/authentication_settings.py
Normal file
39
bot/src/bot_api/configuration/authentication_settings.py
Normal 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
|
@ -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
|
12
bot/src/bot_api/configuration/frontend_settings.py
Normal file
12
bot/src/bot_api/configuration/frontend_settings.py
Normal 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
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.controller"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -14,7 +14,10 @@ from bot_api.model.reset_password_dto import ResetPasswordDTO
|
|||||||
from bot_api.model.token_dto import TokenDTO
|
from bot_api.model.token_dto import TokenDTO
|
||||||
from bot_api.model.update_auth_user_dto import UpdateAuthUserDTO
|
from bot_api.model.update_auth_user_dto import UpdateAuthUserDTO
|
||||||
from bot_api.route.route import Route
|
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.auth_role_enum import AuthRoleEnum
|
||||||
|
from bot_data.model.technician_config import TechnicianConfig
|
||||||
|
|
||||||
|
|
||||||
class AuthController:
|
class AuthController:
|
||||||
@ -30,6 +33,7 @@ class AuthController:
|
|||||||
mail_settings: EMailClientSettings,
|
mail_settings: EMailClientSettings,
|
||||||
mailer: EMailClientABC,
|
mailer: EMailClientABC,
|
||||||
auth_service: AuthServiceABC,
|
auth_service: AuthServiceABC,
|
||||||
|
technician_config: TechnicianConfig,
|
||||||
):
|
):
|
||||||
self._config = config
|
self._config = config
|
||||||
self._env = env
|
self._env = env
|
||||||
@ -39,6 +43,7 @@ class AuthController:
|
|||||||
self._mail_settings = mail_settings
|
self._mail_settings = mail_settings
|
||||||
self._mailer = mailer
|
self._mailer = mailer
|
||||||
self._auth_service = auth_service
|
self._auth_service = auth_service
|
||||||
|
self._technician_config = technician_config
|
||||||
|
|
||||||
@Route.get(f"{BasePath}/users")
|
@Route.get(f"{BasePath}/users")
|
||||||
@Route.authorize(role=AuthRoleEnum.admin)
|
@Route.authorize(role=AuthRoleEnum.admin)
|
||||||
@ -70,10 +75,20 @@ class AuthController:
|
|||||||
|
|
||||||
@Route.post(f"{BasePath}/register")
|
@Route.post(f"{BasePath}/register")
|
||||||
async def register(self):
|
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))
|
dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True))
|
||||||
self._auth_service.add_auth_user(dto)
|
self._auth_service.add_auth_user(dto)
|
||||||
return "", 200
|
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>")
|
@Route.post(f"{BasePath}/register-by-id/<id>")
|
||||||
async def register_id(self, id: str):
|
async def register_id(self, id: str):
|
||||||
result = await self._auth_service.confirm_email_async(id)
|
result = await self._auth_service.confirm_email_async(id)
|
||||||
@ -81,6 +96,11 @@ class AuthController:
|
|||||||
|
|
||||||
@Route.post(f"{BasePath}/login")
|
@Route.post(f"{BasePath}/login")
|
||||||
async def login(self) -> Response:
|
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))
|
dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True))
|
||||||
result = await self._auth_service.login_async(dto)
|
result = await self._auth_service.login_async(dto)
|
||||||
return jsonify(result.to_dict())
|
return jsonify(result.to_dict())
|
||||||
@ -100,6 +120,11 @@ class AuthController:
|
|||||||
|
|
||||||
@Route.post(f"{BasePath}/forgot-password/<email>")
|
@Route.post(f"{BasePath}/forgot-password/<email>")
|
||||||
async def forgot_password(self, email: str):
|
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)
|
await self._auth_service.forgot_password_async(email)
|
||||||
return "", 200
|
return "", 200
|
||||||
|
|
||||||
@ -110,6 +135,11 @@ class AuthController:
|
|||||||
|
|
||||||
@Route.post(f"{BasePath}/reset-password")
|
@Route.post(f"{BasePath}/reset-password")
|
||||||
async def reset_password(self):
|
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))
|
dto: ResetPasswordDTO = JSONProcessor.process(ResetPasswordDTO, request.get_json(force=True, silent=True))
|
||||||
await self._auth_service.reset_password_async(dto)
|
await self._auth_service.reset_password_async(dto)
|
||||||
return "", 200
|
return "", 200
|
@ -16,6 +16,7 @@ from bot_api.api import Api
|
|||||||
from bot_api.configuration.discord_authentication_settings import (
|
from bot_api.configuration.discord_authentication_settings import (
|
||||||
DiscordAuthenticationSettings,
|
DiscordAuthenticationSettings,
|
||||||
)
|
)
|
||||||
|
from bot_core.exception.service_exception import ServiceException
|
||||||
from bot_api.logging.api_logger import ApiLogger
|
from bot_api.logging.api_logger import ApiLogger
|
||||||
from bot_api.model.auth_user_dto import AuthUserDTO
|
from bot_api.model.auth_user_dto import AuthUserDTO
|
||||||
from bot_api.route.route import Route
|
from bot_api.route.route import Route
|
||||||
@ -90,5 +91,10 @@ class AuthDiscordController:
|
|||||||
AuthRoleEnum.normal,
|
AuthRoleEnum.normal,
|
||||||
)
|
)
|
||||||
|
|
||||||
result = await self._auth_service.login_discord_async(dto, response["id"])
|
try:
|
||||||
return jsonify(result.to_dict())
|
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
|
@ -1,5 +1,5 @@
|
|||||||
from ariadne import graphql_sync
|
from ariadne import graphql_sync
|
||||||
from ariadne.constants import PLAYGROUND_HTML
|
from ariadne.explorer import ExplorerPlayground
|
||||||
from cpl_core.configuration import ConfigurationABC
|
from cpl_core.configuration import ConfigurationABC
|
||||||
from cpl_core.environment import ApplicationEnvironmentABC
|
from cpl_core.environment import ApplicationEnvironmentABC
|
||||||
from flask import request, jsonify
|
from flask import request, jsonify
|
||||||
@ -30,7 +30,7 @@ class GraphQLController:
|
|||||||
if self._env.environment_name != "development":
|
if self._env.environment_name != "development":
|
||||||
return "", 403
|
return "", 403
|
||||||
|
|
||||||
return PLAYGROUND_HTML, 200
|
return ExplorerPlayground().html(None), 200
|
||||||
|
|
||||||
@Route.post(f"{BasePath}")
|
@Route.post(f"{BasePath}")
|
||||||
@Route.authorize(by_api_key=True)
|
@Route.authorize(by_api_key=True)
|
@ -12,6 +12,9 @@ from bot_api.logging.api_logger import ApiLogger
|
|||||||
from bot_api.model.settings_dto import SettingsDTO
|
from bot_api.model.settings_dto import SettingsDTO
|
||||||
from bot_api.model.version_dto import VersionDTO
|
from bot_api.model.version_dto import VersionDTO
|
||||||
from bot_api.route.route import Route
|
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:
|
class GuiController:
|
||||||
@ -82,3 +85,11 @@ class GuiController:
|
|||||||
)
|
)
|
||||||
self._mailer.send_mail(mail)
|
self._mailer.send_mail(mail)
|
||||||
return "", 200
|
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)),
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.event"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.filter"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.filter.discord"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.logging"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.model"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.model.discord"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,10 +1,7 @@
|
|||||||
import traceback
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from cpl_core.console import Console
|
|
||||||
|
|
||||||
from bot_api.abc.dto_abc import DtoABC
|
from bot_api.abc.dto_abc import DtoABC
|
||||||
from bot_api.exception.service_error_code_enum import ServiceErrorCode
|
from bot_core.exception.service_error_code_enum import ServiceErrorCode
|
||||||
|
|
||||||
|
|
||||||
class ErrorDTO(DtoABC):
|
class ErrorDTO(DtoABC):
|
@ -27,4 +27,8 @@ class TokenDTO(DtoABC):
|
|||||||
self._first_login = values["firstLogin"]
|
self._first_login = values["firstLogin"]
|
||||||
|
|
||||||
def to_dict(self) -> dict:
|
def to_dict(self) -> dict:
|
||||||
return {"token": self._token, "refreshToken": self._refresh_token, "firstLogin": self._first_login}
|
return {
|
||||||
|
"token": self._token,
|
||||||
|
"refreshToken": self._refresh_token,
|
||||||
|
"firstLogin": self._first_login,
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.route"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -8,8 +8,8 @@ from flask import request, jsonify
|
|||||||
from flask_cors import cross_origin
|
from flask_cors import cross_origin
|
||||||
|
|
||||||
from bot_api.abc.auth_service_abc import AuthServiceABC
|
from bot_api.abc.auth_service_abc import AuthServiceABC
|
||||||
from bot_api.exception.service_error_code_enum import ServiceErrorCode
|
from bot_core.exception.service_error_code_enum import ServiceErrorCode
|
||||||
from bot_api.exception.service_exception import ServiceException
|
from bot_core.exception.service_exception import ServiceException
|
||||||
from bot_api.model.error_dto import ErrorDTO
|
from bot_api.model.error_dto import ErrorDTO
|
||||||
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
|
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
|
||||||
from bot_data.model.auth_role_enum import AuthRoleEnum
|
from bot_data.model.auth_role_enum import AuthRoleEnum
|
||||||
@ -25,7 +25,12 @@ class Route:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ServiceProviderABC.inject
|
@ServiceProviderABC.inject
|
||||||
def init_authorize(cls, env: ApplicationEnvironmentABC, auth_users: AuthUserRepositoryABC, auth: AuthServiceABC):
|
def init_authorize(
|
||||||
|
cls,
|
||||||
|
env: ApplicationEnvironmentABC,
|
||||||
|
auth_users: AuthUserRepositoryABC,
|
||||||
|
auth: AuthServiceABC,
|
||||||
|
):
|
||||||
cls._auth_users = auth_users
|
cls._auth_users = auth_users
|
||||||
cls._auth = auth
|
cls._auth = auth
|
||||||
cls._env = env.environment_name
|
cls._env = env.environment_name
|
||||||
@ -52,7 +57,13 @@ class Route:
|
|||||||
return user
|
return user
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def authorize(cls, f: Callable = None, role: AuthRoleEnum = None, skip_in_dev=False, by_api_key=False):
|
def authorize(
|
||||||
|
cls,
|
||||||
|
f: Callable = None,
|
||||||
|
role: AuthRoleEnum = None,
|
||||||
|
skip_in_dev=False,
|
||||||
|
by_api_key=False,
|
||||||
|
):
|
||||||
if f is None:
|
if f is None:
|
||||||
return functools.partial(cls.authorize, role=role, skip_in_dev=skip_in_dev, by_api_key=by_api_key)
|
return functools.partial(cls.authorize, role=role, skip_in_dev=skip_in_dev, by_api_key=by_api_key)
|
||||||
|
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.service"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports
|
# imports
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,6 +1,5 @@
|
|||||||
import hashlib
|
import hashlib
|
||||||
import re
|
import re
|
||||||
import textwrap
|
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime, timedelta, timezone
|
from datetime import datetime, timedelta, timezone
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
@ -19,8 +18,8 @@ from flask import request
|
|||||||
from bot_api.abc.auth_service_abc import AuthServiceABC
|
from bot_api.abc.auth_service_abc import AuthServiceABC
|
||||||
from bot_api.configuration.authentication_settings import AuthenticationSettings
|
from bot_api.configuration.authentication_settings import AuthenticationSettings
|
||||||
from bot_api.configuration.frontend_settings import FrontendSettings
|
from bot_api.configuration.frontend_settings import FrontendSettings
|
||||||
from bot_api.exception.service_error_code_enum import ServiceErrorCode
|
from bot_core.exception.service_error_code_enum import ServiceErrorCode
|
||||||
from bot_api.exception.service_exception import ServiceException
|
from bot_core.exception.service_exception import ServiceException
|
||||||
from bot_api.filter.auth_user_select_criteria import AuthUserSelectCriteria
|
from bot_api.filter.auth_user_select_criteria import AuthUserSelectCriteria
|
||||||
from bot_api.logging.api_logger import ApiLogger
|
from bot_api.logging.api_logger import ApiLogger
|
||||||
from bot_api.model.auth_user_dto import AuthUserDTO
|
from bot_api.model.auth_user_dto import AuthUserDTO
|
||||||
@ -172,11 +171,7 @@ class AuthService(AuthServiceABC):
|
|||||||
mail.add_header("Content-Transfer-Encoding: quoted-printable")
|
mail.add_header("Content-Transfer-Encoding: quoted-printable")
|
||||||
mail.add_receiver(str(email))
|
mail.add_receiver(str(email))
|
||||||
mail.subject = subject
|
mail.subject = subject
|
||||||
mail.body = textwrap.dedent(
|
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)}"
|
||||||
f"""{message}
|
|
||||||
{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 = Thread(target=self._mailer.send_mail, args=[mail])
|
||||||
thr.start()
|
thr.start()
|
||||||
@ -494,8 +489,13 @@ class AuthService(AuthServiceABC):
|
|||||||
added_user = True
|
added_user = True
|
||||||
|
|
||||||
db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
|
db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
|
||||||
if db_user.users.count() == 0:
|
user_ids = db_user.users.select(lambda x: x.id)
|
||||||
members.for_each(lambda x: self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, x)))
|
|
||||||
|
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:
|
if db_user.confirmation_id is not None and not added_user:
|
||||||
raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified")
|
raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified")
|
||||||
@ -594,3 +594,12 @@ class AuthService(AuthServiceABC):
|
|||||||
user.forgot_password_id = None
|
user.forgot_password_id = None
|
||||||
self._auth_users.update_auth_user(user)
|
self._auth_users.update_auth_user(user)
|
||||||
self._db.save_changes()
|
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)
|
@ -4,8 +4,8 @@ from cpl_discord.service import DiscordBotServiceABC
|
|||||||
from cpl_query.extension import List
|
from cpl_query.extension import List
|
||||||
|
|
||||||
from bot_api.abc.auth_service_abc import AuthServiceABC
|
from bot_api.abc.auth_service_abc import AuthServiceABC
|
||||||
from bot_api.exception.service_error_code_enum import ServiceErrorCode
|
from bot_core.exception.service_error_code_enum import ServiceErrorCode
|
||||||
from bot_api.exception.service_exception import ServiceException
|
from bot_core.exception.service_exception import ServiceException
|
||||||
from bot_api.filter.discord.server_select_criteria import ServerSelectCriteria
|
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_dto import ServerDTO
|
||||||
from bot_api.model.discord.server_filtered_result_dto import ServerFilteredResultDTO
|
from bot_api.model.discord.server_filtered_result_dto import ServerFilteredResultDTO
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_api.transformer"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -10,7 +10,7 @@ from bot_api.model.user_dto import UserDTO
|
|||||||
from bot_data.model.auth_role_enum import AuthRoleEnum
|
from bot_data.model.auth_role_enum import AuthRoleEnum
|
||||||
from bot_data.model.auth_user import AuthUser
|
from bot_data.model.auth_user import AuthUser
|
||||||
from bot_data.model.user import User
|
from bot_data.model.user import User
|
||||||
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
from bot_core.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
class AuthUserTransformer(TransformerABC):
|
class AuthUserTransformer(TransformerABC):
|
||||||
@ -35,21 +35,37 @@ class AuthUserTransformer(TransformerABC):
|
|||||||
@ServiceProviderABC.inject
|
@ServiceProviderABC.inject
|
||||||
def _is_technician(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
|
def _is_technician(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
|
||||||
guild = bot.get_guild(user.server.discord_id)
|
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)
|
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)
|
return permissions.is_member_technician(member)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ServiceProviderABC.inject
|
@ServiceProviderABC.inject
|
||||||
def _is_admin(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
|
def _is_admin(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
|
||||||
guild = bot.get_guild(user.server.discord_id)
|
guild = bot.get_guild(user.server.discord_id)
|
||||||
|
if guild is None:
|
||||||
|
return False
|
||||||
|
|
||||||
member = guild.get_member(user.discord_id)
|
member = guild.get_member(user.discord_id)
|
||||||
|
if member is None:
|
||||||
|
return False
|
||||||
return permissions.is_member_admin(member)
|
return permissions.is_member_admin(member)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ServiceProviderABC.inject
|
@ServiceProviderABC.inject
|
||||||
def _is_moderator(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
|
def _is_moderator(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC):
|
||||||
guild = bot.get_guild(user.server.discord_id)
|
guild = bot.get_guild(user.server.discord_id)
|
||||||
|
if guild is None:
|
||||||
|
return False
|
||||||
|
|
||||||
member = guild.get_member(user.discord_id)
|
member = guild.get_member(user.discord_id)
|
||||||
|
if member is None:
|
||||||
|
return False
|
||||||
return permissions.is_member_moderator(member)
|
return permissions.is_member_moderator(member)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_core"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports
|
# imports
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_core.abc"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
@ -1,14 +1,14 @@
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Callable
|
from typing import Callable, Union
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from cpl_query.extension import List
|
from cpl_query.extension import List
|
||||||
from discord.ext.commands import Context
|
from discord.ext.commands import Context
|
||||||
|
|
||||||
from bot_data.model.auto_role_rule import AutoRoleRule
|
from bot_data.model.auto_role_rule import AutoRoleRule
|
||||||
|
from bot_data.model.server_config import ServerConfig
|
||||||
from bot_data.model.user import User
|
from bot_data.model.user import User
|
||||||
from modules.base.configuration.base_server_settings import BaseServerSettings
|
|
||||||
|
|
||||||
|
|
||||||
class ClientUtilsABC(ABC):
|
class ClientUtilsABC(ABC):
|
||||||
@ -48,12 +48,22 @@ class ClientUtilsABC(ABC):
|
|||||||
def get_auto_complete_list(self, _l: List, current: str, select: Callable = None) -> List:
|
def get_auto_complete_list(self, _l: List, current: str, select: Callable = None) -> List:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def update_user_message_xp_count_by_hour(
|
||||||
|
self,
|
||||||
|
created_at: datetime,
|
||||||
|
user: User,
|
||||||
|
settings: ServerConfig,
|
||||||
|
is_reaction: bool = False,
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def is_message_xp_count_by_hour_higher_that_max_message_count_per_hour(
|
def is_message_xp_count_by_hour_higher_that_max_message_count_per_hour(
|
||||||
self,
|
self,
|
||||||
created_at: datetime,
|
created_at: datetime,
|
||||||
user: User,
|
user: User,
|
||||||
settings: BaseServerSettings,
|
settings: ServerConfig,
|
||||||
is_reaction: bool = False,
|
is_reaction: bool = False,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
pass
|
pass
|
||||||
@ -64,6 +74,18 @@ class ClientUtilsABC(ABC):
|
|||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def react_to_message_by_auto_role_rule(
|
async def react_to_message_by_auto_role_rule(
|
||||||
self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild
|
self,
|
||||||
|
discord_channel_id: int,
|
||||||
|
discord_message_id: int,
|
||||||
|
rule: AutoRoleRule,
|
||||||
|
guild: discord.Guild,
|
||||||
):
|
):
|
||||||
pass
|
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
|
25
bot/src/bot_core/abc/permission_service_abc.py
Normal file
25
bot/src/bot_core/abc/permission_service_abc.py
Normal 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
|
33
bot/src/bot_core/abc/task_abc.py
Normal file
33
bot/src/bot_core/abc/task_abc.py
Normal 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()
|
@ -3,8 +3,8 @@
|
|||||||
"Name": "bot-core",
|
"Name": "bot-core",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "0",
|
"Minor": "2",
|
||||||
"Micro": "1"
|
"Micro": "8"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_core.configuration"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
version_info = VersionInfo(major="1", minor="2", micro="8")
|
25
bot/src/bot_core/configuration/bot_logging_settings.py
Normal file
25
bot/src/bot_core/configuration/bot_logging_settings.py
Normal 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
|
@ -3,19 +3,29 @@ from enum import Enum
|
|||||||
|
|
||||||
class FeatureFlagsEnum(Enum):
|
class FeatureFlagsEnum(Enum):
|
||||||
# modules
|
# modules
|
||||||
|
achievements_module = "AchievementsModule"
|
||||||
api_module = "ApiModule"
|
api_module = "ApiModule"
|
||||||
admin_module = "AdminModule"
|
|
||||||
auto_role_module = "AutoRoleModule"
|
auto_role_module = "AutoRoleModule"
|
||||||
base_module = "BaseModule"
|
base_module = "BaseModule"
|
||||||
boot_log_module = "BootLogModule"
|
boot_log_module = "BootLogModule"
|
||||||
core_module = "CoreModule"
|
core_module = "CoreModule"
|
||||||
core_extension_module = "CoreExtensionModule"
|
core_extension_module = "CoreExtensionModule"
|
||||||
|
config_module = "ConfigModule"
|
||||||
data_module = "DataModule"
|
data_module = "DataModule"
|
||||||
database_module = "DatabaseModule"
|
database_module = "DatabaseModule"
|
||||||
level_module = "LevelModule"
|
level_module = "LevelModule"
|
||||||
moderator_module = "ModeratorModule"
|
moderator_module = "ModeratorModule"
|
||||||
permission_module = "PermissionModule"
|
short_role_name_module = "ShortRoleNameModule"
|
||||||
|
steam_special_offers_module = "SteamSpecialOffersModule"
|
||||||
# features
|
# features
|
||||||
api_only = "ApiOnly"
|
api_only = "ApiOnly"
|
||||||
presence = "Presence"
|
presence = "Presence"
|
||||||
version_in_presence = "VersionInPresence"
|
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"
|
65
bot/src/bot_core/configuration/feature_flags_settings.py
Normal file
65
bot/src/bot_core/configuration/feature_flags_settings.py
Normal 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])
|
19
bot/src/bot_core/configuration/file_logging_settings.py
Normal file
19
bot/src/bot_core/configuration/file_logging_settings.py
Normal 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
|
@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bot Keksdose bot
|
bot sh-edraft.de Discord bot
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Discord bot for the Keksdose discord Server
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
:copyright: (c) 2022 - 2023 sh-edraft.de
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
:license: MIT, see LICENSE for more details.
|
:license: MIT, see LICENSE for more details.
|
||||||
@ -15,7 +15,7 @@ __title__ = "bot_core.core_extension"
|
|||||||
__author__ = "Sven Heidemann"
|
__author__ = "Sven Heidemann"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.2.8"
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
version_info = VersionInfo(major="1", minor="0", micro="1")
|
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
Loading…
Reference in New Issue
Block a user