Compare commits
21 commits
#21_Normal
...
main
Author | SHA1 | Date | |
---|---|---|---|
bab6e4fdec | |||
f00db7ef5d | |||
37ea38f516 | |||
93359698f0 | |||
dda05d7ca1 | |||
5dee9acbaa | |||
96a61e6fc8 | |||
94292fa388 | |||
2daa010d25 | |||
da4d006bc0 | |||
80c9191eee | |||
1c3ccbecf5 | |||
d1af8a7c1f | |||
0d9ce2de7f | |||
5e7964ae26 | |||
32292a3c0b | |||
ffce78a10d | |||
7980739627 | |||
2aad895bb3 | |||
ec74dc0aa7 | |||
42f301455a |
14 changed files with 854 additions and 134 deletions
|
@ -19,6 +19,10 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
# get the repo first
|
# get the repo first
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
- uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v3
|
||||||
|
with:
|
||||||
|
repository: ${{ gitea.repository }}
|
||||||
|
ref_name: ${{ gitea.ref_name }}
|
||||||
- run: nix build .#fmt --verbose
|
- run: nix build .#fmt --verbose
|
||||||
|
|
||||||
# clippy is incredibly useful for making yer code better
|
# clippy is incredibly useful for making yer code better
|
||||||
|
@ -30,6 +34,10 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
# get the repo first
|
# get the repo first
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
- uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v3
|
||||||
|
with:
|
||||||
|
repository: ${{ gitea.repository }}
|
||||||
|
ref_name: ${{ gitea.ref_name }}
|
||||||
- run: nix build .#clippy --verbose
|
- run: nix build .#clippy --verbose
|
||||||
|
|
||||||
build:
|
build:
|
||||||
|
@ -39,6 +47,10 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
# get the repo first
|
# get the repo first
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
- uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v3
|
||||||
|
with:
|
||||||
|
repository: ${{ gitea.repository }}
|
||||||
|
ref_name: ${{ gitea.ref_name }}
|
||||||
- name: "Build it locally"
|
- name: "Build it locally"
|
||||||
run: nix build --verbose
|
run: nix build --verbose
|
||||||
|
|
||||||
|
@ -49,7 +61,7 @@ jobs:
|
||||||
needs: [ build ]
|
needs: [ build ]
|
||||||
steps:
|
steps:
|
||||||
- name: "Deploy to Skynet"
|
- name: "Deploy to Skynet"
|
||||||
uses: https://forgejo.skynet.ie/Skynet/actions-deploy-to-skynet@v2
|
uses: https://forgejo.skynet.ie/Skynet/actions/deploy@v3
|
||||||
with:
|
with:
|
||||||
input: 'skynet_discord_bot'
|
input: 'skynet_discord_bot'
|
||||||
token: ${{ secrets.API_TOKEN_FORGEJO }}
|
token: ${{ secrets.API_TOKEN_FORGEJO }}
|
37
.gitattributes
vendored
Normal file
37
.gitattributes
vendored
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# Git config here
|
||||||
|
* text eol=lf
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Git lfs stuff
|
||||||
|
# Documents
|
||||||
|
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.doc filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.docx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
# Excel
|
||||||
|
*.xls filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xlsx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xlsm filter=lfs diff=lfs merge=lfs -text
|
||||||
|
# Powerpoints
|
||||||
|
*.ppt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pptx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ppsx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
# Images
|
||||||
|
*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jpg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
# Video
|
||||||
|
*.mkv filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mp4 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.wmv filter=lfs diff=lfs merge=lfs -text
|
||||||
|
# Misc
|
||||||
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
# ET4011
|
||||||
|
*.cbe filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pbs filter=lfs diff=lfs merge=lfs -text
|
||||||
|
# Open/Libre office
|
||||||
|
# from https://www.libreoffice.org/discover/what-is-opendocument/
|
||||||
|
*.odt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ods filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.odp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.odg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
# QT
|
||||||
|
*.ui filter=lfs diff=lfs merge=lfs -text
|
413
Cargo.lock
generated
413
Cargo.lock
generated
|
@ -218,6 +218,28 @@ dependencies = [
|
||||||
"wasm-bindgen-futures",
|
"wasm-bindgen-futures",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "async-stream"
|
||||||
|
version = "0.3.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476"
|
||||||
|
dependencies = [
|
||||||
|
"async-stream-impl",
|
||||||
|
"futures-core",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "async-stream-impl"
|
||||||
|
version = "0.3.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn 2.0.89",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-task"
|
name = "async-task"
|
||||||
version = "4.7.1"
|
version = "4.7.1"
|
||||||
|
@ -232,7 +254,7 @@ checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -920,7 +942,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1024,7 +1046,26 @@ dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"http",
|
"http 0.2.12",
|
||||||
|
"indexmap",
|
||||||
|
"slab",
|
||||||
|
"tokio",
|
||||||
|
"tokio-util",
|
||||||
|
"tracing",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "h2"
|
||||||
|
version = "0.4.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
|
||||||
|
dependencies = [
|
||||||
|
"atomic-waker",
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"fnv",
|
||||||
|
"futures-core",
|
||||||
|
"futures-sink",
|
||||||
|
"http 1.1.0",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"slab",
|
"slab",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
@ -1147,6 +1188,17 @@ dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "http"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
|
||||||
|
dependencies = [
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"fnv",
|
||||||
|
"itoa",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "http-body"
|
name = "http-body"
|
||||||
version = "0.4.6"
|
version = "0.4.6"
|
||||||
|
@ -1154,7 +1206,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
|
checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 1.7.1",
|
"bytes 1.7.1",
|
||||||
"http",
|
"http 0.2.12",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "http-body"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
|
||||||
|
dependencies = [
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"http 1.1.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "http-body-util"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
|
||||||
|
dependencies = [
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"futures-util",
|
||||||
|
"http 1.1.0",
|
||||||
|
"http-body 1.0.1",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1216,9 +1291,9 @@ dependencies = [
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"h2",
|
"h2 0.3.26",
|
||||||
"http",
|
"http 0.2.12",
|
||||||
"http-body",
|
"http-body 0.4.6",
|
||||||
"httparse",
|
"httparse",
|
||||||
"httpdate",
|
"httpdate",
|
||||||
"itoa",
|
"itoa",
|
||||||
|
@ -1230,6 +1305,26 @@ dependencies = [
|
||||||
"want",
|
"want",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyper"
|
||||||
|
version = "1.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f"
|
||||||
|
dependencies = [
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"futures-channel",
|
||||||
|
"futures-util",
|
||||||
|
"h2 0.4.7",
|
||||||
|
"http 1.1.0",
|
||||||
|
"http-body 1.0.1",
|
||||||
|
"httparse",
|
||||||
|
"itoa",
|
||||||
|
"pin-project-lite",
|
||||||
|
"smallvec",
|
||||||
|
"tokio",
|
||||||
|
"want",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper-rustls"
|
name = "hyper-rustls"
|
||||||
version = "0.24.2"
|
version = "0.24.2"
|
||||||
|
@ -1237,13 +1332,65 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
|
checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"http",
|
"http 0.2.12",
|
||||||
"hyper",
|
"hyper 0.14.30",
|
||||||
"rustls 0.21.12",
|
"rustls 0.21.12",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls 0.24.1",
|
"tokio-rustls 0.24.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyper-rustls"
|
||||||
|
version = "0.27.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333"
|
||||||
|
dependencies = [
|
||||||
|
"futures-util",
|
||||||
|
"http 1.1.0",
|
||||||
|
"hyper 1.5.1",
|
||||||
|
"hyper-util",
|
||||||
|
"rustls 0.23.18",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"tokio",
|
||||||
|
"tokio-rustls 0.26.0",
|
||||||
|
"tower-service",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyper-tls"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
|
||||||
|
dependencies = [
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"http-body-util",
|
||||||
|
"hyper 1.5.1",
|
||||||
|
"hyper-util",
|
||||||
|
"native-tls",
|
||||||
|
"tokio",
|
||||||
|
"tokio-native-tls",
|
||||||
|
"tower-service",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyper-util"
|
||||||
|
version = "0.1.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
|
||||||
|
dependencies = [
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"futures-channel",
|
||||||
|
"futures-util",
|
||||||
|
"http 1.1.0",
|
||||||
|
"http-body 1.0.1",
|
||||||
|
"hyper 1.5.1",
|
||||||
|
"pin-project-lite",
|
||||||
|
"socket2 0.5.7",
|
||||||
|
"tokio",
|
||||||
|
"tower-service",
|
||||||
|
"tracing",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iana-time-zone"
|
name = "iana-time-zone"
|
||||||
version = "0.1.61"
|
version = "0.1.61"
|
||||||
|
@ -1330,7 +1477,7 @@ dependencies = [
|
||||||
"curl-sys",
|
"curl-sys",
|
||||||
"flume 0.9.2",
|
"flume 0.9.2",
|
||||||
"futures-lite 1.13.0",
|
"futures-lite 1.13.0",
|
||||||
"http",
|
"http 0.2.12",
|
||||||
"log",
|
"log",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"slab",
|
"slab",
|
||||||
|
@ -1678,7 +1825,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1775,7 +1922,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1901,9 +2048,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.86"
|
version = "1.0.92"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
|
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
@ -2014,11 +2161,11 @@ dependencies = [
|
||||||
"encoding_rs",
|
"encoding_rs",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"h2",
|
"h2 0.3.26",
|
||||||
"http",
|
"http 0.2.12",
|
||||||
"http-body",
|
"http-body 0.4.6",
|
||||||
"hyper",
|
"hyper 0.14.30",
|
||||||
"hyper-rustls",
|
"hyper-rustls 0.24.2",
|
||||||
"ipnet",
|
"ipnet",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"log",
|
"log",
|
||||||
|
@ -2028,12 +2175,12 @@ dependencies = [
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rustls 0.21.12",
|
"rustls 0.21.12",
|
||||||
"rustls-pemfile",
|
"rustls-pemfile 1.0.4",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_urlencoded",
|
"serde_urlencoded",
|
||||||
"sync_wrapper",
|
"sync_wrapper 0.1.2",
|
||||||
"system-configuration",
|
"system-configuration 0.5.1",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls 0.24.1",
|
"tokio-rustls 0.24.1",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
|
@ -2047,6 +2194,49 @@ dependencies = [
|
||||||
"winreg",
|
"winreg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "reqwest"
|
||||||
|
version = "0.12.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f"
|
||||||
|
dependencies = [
|
||||||
|
"base64 0.22.1",
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"encoding_rs",
|
||||||
|
"futures-core",
|
||||||
|
"futures-util",
|
||||||
|
"h2 0.4.7",
|
||||||
|
"http 1.1.0",
|
||||||
|
"http-body 1.0.1",
|
||||||
|
"http-body-util",
|
||||||
|
"hyper 1.5.1",
|
||||||
|
"hyper-rustls 0.27.3",
|
||||||
|
"hyper-tls",
|
||||||
|
"hyper-util",
|
||||||
|
"ipnet",
|
||||||
|
"js-sys",
|
||||||
|
"log",
|
||||||
|
"mime",
|
||||||
|
"native-tls",
|
||||||
|
"once_cell",
|
||||||
|
"percent-encoding",
|
||||||
|
"pin-project-lite",
|
||||||
|
"rustls-pemfile 2.2.0",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"serde_urlencoded",
|
||||||
|
"sync_wrapper 1.0.2",
|
||||||
|
"system-configuration 0.6.1",
|
||||||
|
"tokio",
|
||||||
|
"tokio-native-tls",
|
||||||
|
"tower-service",
|
||||||
|
"url",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"wasm-bindgen-futures",
|
||||||
|
"web-sys",
|
||||||
|
"windows-registry",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ring"
|
name = "ring"
|
||||||
version = "0.16.20"
|
version = "0.16.20"
|
||||||
|
@ -2145,10 +2335,23 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"ring 0.17.8",
|
"ring 0.17.8",
|
||||||
"rustls-webpki",
|
"rustls-webpki 0.101.7",
|
||||||
"sct",
|
"sct",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls"
|
||||||
|
version = "0.23.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f"
|
||||||
|
dependencies = [
|
||||||
|
"once_cell",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"rustls-webpki 0.102.8",
|
||||||
|
"subtle",
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustls-pemfile"
|
name = "rustls-pemfile"
|
||||||
version = "1.0.4"
|
version = "1.0.4"
|
||||||
|
@ -2158,6 +2361,21 @@ dependencies = [
|
||||||
"base64 0.21.7",
|
"base64 0.21.7",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls-pemfile"
|
||||||
|
version = "2.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
|
||||||
|
dependencies = [
|
||||||
|
"rustls-pki-types",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls-pki-types"
|
||||||
|
version = "1.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustls-webpki"
|
name = "rustls-webpki"
|
||||||
version = "0.101.7"
|
version = "0.101.7"
|
||||||
|
@ -2168,6 +2386,17 @@ dependencies = [
|
||||||
"untrusted 0.9.0",
|
"untrusted 0.9.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls-webpki"
|
||||||
|
version = "0.102.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
|
||||||
|
dependencies = [
|
||||||
|
"ring 0.17.8",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"untrusted 0.9.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.18"
|
version = "1.0.18"
|
||||||
|
@ -2239,9 +2468,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.210"
|
version = "1.0.215"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
|
checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
@ -2258,13 +2487,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.210"
|
version = "1.0.215"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
|
checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2321,7 +2550,7 @@ dependencies = [
|
||||||
"mime_guess",
|
"mime_guess",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"reqwest",
|
"reqwest 0.11.27",
|
||||||
"serde",
|
"serde",
|
||||||
"serde-value",
|
"serde-value",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -2423,6 +2652,7 @@ dependencies = [
|
||||||
"sqlx",
|
"sqlx",
|
||||||
"surf",
|
"surf",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"wolves_oxidised",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2819,9 +3049,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.77"
|
version = "2.0.89"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
|
checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -2834,6 +3064,15 @@ version = "0.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sync_wrapper"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "system-configuration"
|
name = "system-configuration"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
|
@ -2842,7 +3081,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 1.3.2",
|
"bitflags 1.3.2",
|
||||||
"core-foundation",
|
"core-foundation",
|
||||||
"system-configuration-sys",
|
"system-configuration-sys 0.5.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "system-configuration"
|
||||||
|
version = "0.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.6.0",
|
||||||
|
"core-foundation",
|
||||||
|
"system-configuration-sys 0.6.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2855,6 +3105,16 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "system-configuration-sys"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
|
||||||
|
dependencies = [
|
||||||
|
"core-foundation-sys",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempfile"
|
name = "tempfile"
|
||||||
version = "3.12.0"
|
version = "3.12.0"
|
||||||
|
@ -2885,7 +3145,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2996,7 +3256,17 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-native-tls"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
|
||||||
|
dependencies = [
|
||||||
|
"native-tls",
|
||||||
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3020,6 +3290,17 @@ dependencies = [
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-rustls"
|
||||||
|
version = "0.26.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
|
||||||
|
dependencies = [
|
||||||
|
"rustls 0.23.18",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-stream"
|
name = "tokio-stream"
|
||||||
version = "0.1.16"
|
version = "0.1.16"
|
||||||
|
@ -3031,6 +3312,19 @@ dependencies = [
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-test"
|
||||||
|
version = "0.4.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7"
|
||||||
|
dependencies = [
|
||||||
|
"async-stream",
|
||||||
|
"bytes 1.7.1",
|
||||||
|
"futures-core",
|
||||||
|
"tokio",
|
||||||
|
"tokio-stream",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-util"
|
name = "tokio-util"
|
||||||
version = "0.7.12"
|
version = "0.7.12"
|
||||||
|
@ -3070,7 +3364,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3107,7 +3401,7 @@ dependencies = [
|
||||||
"base64 0.13.1",
|
"base64 0.13.1",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
"bytes 1.7.1",
|
"bytes 1.7.1",
|
||||||
"http",
|
"http 0.2.12",
|
||||||
"httparse",
|
"httparse",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
|
@ -3298,7 +3592,7 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3332,7 +3626,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
"wasm-bindgen-backend",
|
"wasm-bindgen-backend",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
@ -3432,6 +3726,36 @@ dependencies = [
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-registry"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
|
||||||
|
dependencies = [
|
||||||
|
"windows-result",
|
||||||
|
"windows-strings",
|
||||||
|
"windows-targets 0.52.6",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-result"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets 0.52.6",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-strings"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
|
||||||
|
dependencies = [
|
||||||
|
"windows-result",
|
||||||
|
"windows-targets 0.52.6",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.48.0"
|
version = "0.48.0"
|
||||||
|
@ -3590,6 +3914,17 @@ dependencies = [
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wolves_oxidised"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#eee6a76c695a36f1fe220fdeafd5a43757e50527"
|
||||||
|
dependencies = [
|
||||||
|
"reqwest 0.12.9",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"tokio-test",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy"
|
name = "zerocopy"
|
||||||
version = "0.7.35"
|
version = "0.7.35"
|
||||||
|
@ -3608,7 +3943,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.77",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -19,6 +19,9 @@ name = "update_minecraft"
|
||||||
serenity = { version = "0.11.6", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache"] }
|
serenity = { version = "0.11.6", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache"] }
|
||||||
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
|
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
|
||||||
|
|
||||||
|
# wolves api
|
||||||
|
wolves_oxidised = { git = "https://forgejo.skynet.ie/Skynet/wolves-oxidised.git" }
|
||||||
|
|
||||||
# to make the http requests
|
# to make the http requests
|
||||||
surf = "2.3.2"
|
surf = "2.3.2"
|
||||||
|
|
||||||
|
@ -37,4 +40,4 @@ chrono = "0.4.26"
|
||||||
lettre = "0.10.4"
|
lettre = "0.10.4"
|
||||||
maud = "0.25.0"
|
maud = "0.25.0"
|
||||||
|
|
||||||
serde = "1.0.188"
|
serde = "1.0"
|
89
README.md
89
README.md
|
@ -1,26 +1,58 @@
|
||||||
# Skynet Discord Bot
|
# Skynet Discord Bot
|
||||||
This bots core purpose is to give members roles based on their status on <ulwolves.ie>.
|
This bots core purpose is to give members roles based on their status on <https://ulwolves.ie>.
|
||||||
It uses an api key provided by wolves to get member lists.
|
It uses an api key provided by wolves to get member lists.
|
||||||
|
|
||||||
Users are able to link their wolves account to the bot and that works across discord servers.
|
Users are able to link their wolves account to the bot and that works across discord servers.
|
||||||
For example is a user links on the CompSoc Discord then they will also get their roles (automagically) on Games Dev if they are a member there.
|
For example is a user links on the CompSoc Discord then they will also get their roles (automagically) on Games Dev if they are a member there.
|
||||||
|
|
||||||
## Commands - Admin
|
## Setup - Committee
|
||||||
|
|
||||||
You need admin access to run any of the commands in this section.
|
You need admin access to run any of the commands in this section.
|
||||||
Either the server owner or a suer with the ``Administrator`` permission
|
Either the server owner or a user with the ``Administrator`` permission.
|
||||||
|
|
||||||
### Getting the Skynet Discord bot
|
### Get the API Key
|
||||||
1. Email ``keith@assurememberships.com`` from committee email and say ye want an api key for ``193.1.99.74``
|
The ``api_key`` is used by the Bot in order to request information, it will be used later in the process.
|
||||||
2. Create a role for current members (maybe call it ``current-member`` ?)
|
|
||||||
3. (Optional) create a role for all past and current members (ye can use the existing ``member`` role for this, )
|
1. Email ``keith@assurememberships.com`` from committee email and say you want an ``api_key`` for ``193.1.99.74``
|
||||||
4. Invite the bot https://discord.com/api/oauth2/authorize?client_id=1145761669256069270&permissions=139855185984&scope=bot
|
* The committee email is the one here: <https://cp.ulwolves.ie/mailbox/>
|
||||||
5. Make sure the bot role ``@skynet`` is above these two roles (so it can manage them)
|
* This may take up to a week to get the key.
|
||||||
6. Make sure that you have a role that gives ye administrator powers
|
|
||||||
7. Use the command ``/add`` and insert the api key, role current and role all (desktop recommended)
|
### Setup Server
|
||||||
|
The Bot reason for existing is being able to give members Roles.
|
||||||
|
So we have to create those.
|
||||||
|
|
||||||
|
1. Create a role for Current Members.
|
||||||
|
* You can call it whatever you want.
|
||||||
|
* ``member-current`` is a good choice.
|
||||||
|
* This should be a new role
|
||||||
|
2. **Optional**: you can create a role that is given to folks who were but no longer a member.
|
||||||
|
* ``member`` would be a good choice for this
|
||||||
|
* If you have an existing member role this is also a good fit.
|
||||||
|
|
||||||
The reason for both roles is ye have one for active members while the second is for all current and past members.
|
The reason for both roles is ye have one for active members while the second is for all current and past members.
|
||||||
|
|
||||||
|
### Invite Bot
|
||||||
|
1. Invite the bot https://discord.com/api/oauth2/authorize?client_id=1145761669256069270&permissions=139855185984&scope=bot
|
||||||
|
2. Make sure the bot role ``@skynet`` is above these two roles created in the previous step
|
||||||
|
* This is so it can manage the roles (give and remove them from users)
|
||||||
|
|
||||||
|
### Setup Bot
|
||||||
|
This is where the bot is configured.
|
||||||
|
You will need the ``api_key`` from the start of the process.
|
||||||
|
You (personally) will need a role with ``Administrator`` permission to be able to do this.
|
||||||
|
|
||||||
|
1. Use the command ``/add`` and a list of options will pop up.
|
||||||
|
2. ``api_key`` is the key you got from Keith earlier.
|
||||||
|
3. ``role_current`` is the ``member-current`` that you created earlier.
|
||||||
|
4. ``role_past`` (optional) is the role for all current and past members.
|
||||||
|
5. ``bot_channel`` is a channel that folks are recommended to use the bot.
|
||||||
|
* You can have it so folks cannot see message history
|
||||||
|
6. ``server_name`` For example ``UL Computer Society``
|
||||||
|
* Will be removed in the future
|
||||||
|
7. ``wolves_link`` for example <https://ulwolves.ie/society/computer>
|
||||||
|
* Will be removed in the future
|
||||||
|
|
||||||
|
At this point the bot is set up and no further action is required.
|
||||||
|
|
||||||
### Minecraft
|
### Minecraft
|
||||||
The bot is able to manage the whitelist of a Minecraft server managed by the Computer Society.
|
The bot is able to manage the whitelist of a Minecraft server managed by the Computer Society.
|
||||||
Talk to us to get a server.
|
Talk to us to get a server.
|
||||||
|
@ -42,29 +74,24 @@ This unlinks a minecraft server from your club/society.
|
||||||
|
|
||||||
``/minecraft_delete SERVER_ID``
|
``/minecraft_delete SERVER_ID``
|
||||||
|
|
||||||
## Commands - User
|
## Setup - Users
|
||||||
|
This is to link your Discord account with your UL Wolves account.
|
||||||
|
**You will only need to do this once**.
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
* Start the process using ``/link_wolves WOLVES_EMAIL``
|
1. In a Discord server with the Skynet Bot enter ``/link_wolves YOUR_WOLVES_CONTACT_EMAIL``
|
||||||
* The email that is in the Contact Email here: <https://ulwolves.ie/memberships/profile>
|
<img src="media/setup_user_01.png" alt="link process start" width="50%" height="50%">
|
||||||
* An email will be sent to them that they need to verify using ``/verify CODE``
|
* Your ``YOUR_WOLVES_CONTACT_EMAIL`` is the email in the Contact Email here: <https://ulwolves.ie/memberships/profile>
|
||||||
* This will only have to be done once.
|
* This is most likely your student mail
|
||||||
|
2. An email will be sent to you with a verification code.
|
||||||
|
<img src="media/setup_user_02.png" alt="signup email" width="50%" height="50%">
|
||||||
|
3. Verify the code using ``/verify CODE_FROM_EMAIL`` in Discord.
|
||||||
|
<img src="media/setup_user_03.png" alt="verify in discord" width="50%" height="50%">
|
||||||
|
4. Once complete your Wolves and Discord accounts will be linked.
|
||||||
|
|
||||||
* If the user is an active member on wolves
|
You will get member roles on any Discord that is using the bot that you are a member of.
|
||||||
* If they are in any servers with teh Skynet Bot
|
|
||||||
* They will get relevant roles.
|
|
||||||
* If they Join a server with teh bot enabled.
|
|
||||||
* They will be granted the roles automatically
|
|
||||||
* If the user is **not** an active member on wolves.
|
|
||||||
* If they have no Roles
|
|
||||||
* No change
|
|
||||||
* If they have Past Member Role
|
|
||||||
* No change
|
|
||||||
* If they have both Roles
|
|
||||||
* The current-member role will be removed from them
|
|
||||||
* Past Member role will remain unchanged
|
|
||||||
|
|
||||||
### Minecraft
|
### Minecraft
|
||||||
Users can link their Minecraft username to grant them access to any servers where teh whitelist is managed by teh bot.
|
You can link your Minecraft username to grant you access to any Minecraft server run by UL Computer Society.
|
||||||
|
|
||||||
``/link_minecraft MINECRAFT_USERNAME``
|
``/link_minecraft MINECRAFT_USERNAME``
|
||||||
|
|
11
db/migrations/6_role-adder.sql
Normal file
11
db/migrations/6_role-adder.sql
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
CREATE TABLE IF NOT EXISTS roles_adder (
|
||||||
|
server integer not null,
|
||||||
|
role_a integer not null,
|
||||||
|
role_b integer not null,
|
||||||
|
role_c integer not null,
|
||||||
|
PRIMARY KEY(server,role_a,role_b,role_c)
|
||||||
|
);
|
||||||
|
CREATE INDEX IF NOT EXISTS index_roles_adder_server ON roles_adder (server);
|
||||||
|
CREATE INDEX IF NOT EXISTS index_roles_adder_from ON roles_adder (role_a,role_b);
|
||||||
|
CREATE INDEX IF NOT EXISTS index_roles_adder_to ON roles_adder (role_c);
|
||||||
|
CREATE INDEX IF NOT EXISTS index_roles_adder_search ON roles_adder (server,role_a,role_b);
|
BIN
media/setup_user_01.png
(Stored with Git LFS)
Normal file
BIN
media/setup_user_01.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
media/setup_user_02.png
(Stored with Git LFS)
Normal file
BIN
media/setup_user_02.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
media/setup_user_03.png
(Stored with Git LFS)
Normal file
BIN
media/setup_user_03.png
(Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -59,7 +59,34 @@ pub mod link {
|
||||||
// check if email exists
|
// check if email exists
|
||||||
let details = match get_server_member_email(&db, email).await {
|
let details = match get_server_member_email(&db, email).await {
|
||||||
None => {
|
None => {
|
||||||
return "Please check it matches (including case) your preferred contact on https://ulwolves.ie/memberships/profile and that you are fully paid up.".to_string()
|
let invalid_user = "Please check it matches (including case) your preferred contact on https://ulwolves.ie/memberships/profile and that you are fully paid up.".to_string();
|
||||||
|
|
||||||
|
let wolves = wolves_oxidised::Client::new(&config.wolves_url, Some(&config.wolves_api));
|
||||||
|
|
||||||
|
// see if the user actually exists
|
||||||
|
let id = match wolves.get_member(email).await {
|
||||||
|
None => {
|
||||||
|
return invalid_user;
|
||||||
|
}
|
||||||
|
Some(x) => x,
|
||||||
|
};
|
||||||
|
|
||||||
|
// save teh user id and email to teh db
|
||||||
|
match save_to_db_user(&db, id, email).await {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(x) => {
|
||||||
|
dbg!(x);
|
||||||
|
return "Error: unable to save user to teh database, contact Computer Society".to_string();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// pull it back out (technically could do it in previous step but more explicit)
|
||||||
|
match get_server_member_email(&db, email).await {
|
||||||
|
None => {
|
||||||
|
return "Error: failed to read user from database.".to_string();
|
||||||
|
}
|
||||||
|
Some(x) => x,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Some(x) => x,
|
Some(x) => x,
|
||||||
};
|
};
|
||||||
|
@ -133,7 +160,7 @@ pub mod link {
|
||||||
"h2, h4 { font-family: Arial, Helvetica, sans-serif; }"
|
"h2, h4 { font-family: Arial, Helvetica, sans-serif; }"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
div style="display: flex; flex-direction: column; align-items: center;" {
|
div {
|
||||||
h2 { "Hello from Skynet!" }
|
h2 { "Hello from Skynet!" }
|
||||||
// Substitute in the name of our recipient.
|
// Substitute in the name of our recipient.
|
||||||
p { "Hi " (user) "," }
|
p { "Hi " (user) "," }
|
||||||
|
@ -232,6 +259,20 @@ pub mod link {
|
||||||
.fetch_optional(db)
|
.fetch_optional(db)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn save_to_db_user(db: &Pool<Sqlite>, id_wolves: i64, email: &str) -> Result<Option<Wolves>, sqlx::Error> {
|
||||||
|
sqlx::query_as::<_, Wolves>(
|
||||||
|
"
|
||||||
|
INSERT INTO wolves (id_wolves, email)
|
||||||
|
VALUES ($1, $2)
|
||||||
|
ON CONFLICT(id_wolves) DO UPDATE SET email = $2
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.bind(id_wolves)
|
||||||
|
.bind(email)
|
||||||
|
.fetch_optional(db)
|
||||||
|
.await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod verify {
|
pub mod verify {
|
||||||
|
|
|
@ -2,3 +2,4 @@ pub mod add_server;
|
||||||
pub mod committee;
|
pub mod committee;
|
||||||
pub mod link_email;
|
pub mod link_email;
|
||||||
pub mod minecraft;
|
pub mod minecraft;
|
||||||
|
pub mod role_adder;
|
||||||
|
|
238
src/commands/role_adder.rs
Normal file
238
src/commands/role_adder.rs
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
use serenity::{
|
||||||
|
builder::CreateApplicationCommand,
|
||||||
|
client::Context,
|
||||||
|
model::{
|
||||||
|
application::interaction::application_command::ApplicationCommandInteraction,
|
||||||
|
prelude::{command::CommandOptionType, interaction::application_command::CommandDataOptionValue},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
use skynet_discord_bot::{is_admin, DataBase, RoleAdder};
|
||||||
|
use sqlx::{Error, Pool, Sqlite};
|
||||||
|
|
||||||
|
pub mod edit {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
pub async fn run(command: &ApplicationCommandInteraction, ctx: &Context) -> String {
|
||||||
|
// check if user has high enough permisssions
|
||||||
|
if let Some(msg) = is_admin(command, ctx).await {
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
let role_a = if let CommandDataOptionValue::Role(role) = command
|
||||||
|
.data
|
||||||
|
.options
|
||||||
|
.first()
|
||||||
|
.expect("Expected role option")
|
||||||
|
.resolved
|
||||||
|
.as_ref()
|
||||||
|
.expect("Expected role object")
|
||||||
|
{
|
||||||
|
role.id.to_owned()
|
||||||
|
} else {
|
||||||
|
return "Please provide a valid role for ``Role Current``".to_string();
|
||||||
|
};
|
||||||
|
|
||||||
|
let role_b = if let CommandDataOptionValue::Role(role) = command
|
||||||
|
.data
|
||||||
|
.options
|
||||||
|
.get(1)
|
||||||
|
.expect("Expected role option")
|
||||||
|
.resolved
|
||||||
|
.as_ref()
|
||||||
|
.expect("Expected role object")
|
||||||
|
{
|
||||||
|
role.id.to_owned()
|
||||||
|
} else {
|
||||||
|
return "Please provide a valid role for ``Role Current``".to_string();
|
||||||
|
};
|
||||||
|
|
||||||
|
let role_c = if let CommandDataOptionValue::Role(role) = command
|
||||||
|
.data
|
||||||
|
.options
|
||||||
|
.get(2)
|
||||||
|
.expect("Expected role option")
|
||||||
|
.resolved
|
||||||
|
.as_ref()
|
||||||
|
.expect("Expected role object")
|
||||||
|
{
|
||||||
|
role.id.to_owned()
|
||||||
|
} else {
|
||||||
|
return "Please provide a valid role for ``Role Current``".to_string();
|
||||||
|
};
|
||||||
|
|
||||||
|
if role_a == role_b {
|
||||||
|
return "Roles A and B must be different".to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (role_c == role_a) || (role_c == role_b) {
|
||||||
|
return "Role C cannot be same as A or B".to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut delete = false;
|
||||||
|
|
||||||
|
if let Some(x) = command.data.options.get(3) {
|
||||||
|
let tmp = x.to_owned();
|
||||||
|
if let Some(CommandDataOptionValue::Boolean(z)) = tmp.resolved {
|
||||||
|
delete = z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let db_lock = {
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||||
|
};
|
||||||
|
let db = db_lock.read().await;
|
||||||
|
|
||||||
|
let server = command.guild_id.unwrap_or_default();
|
||||||
|
let server_data = RoleAdder {
|
||||||
|
server,
|
||||||
|
role_a,
|
||||||
|
role_b,
|
||||||
|
role_c,
|
||||||
|
};
|
||||||
|
|
||||||
|
match add_server(&db, &server_data, delete).await {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(e) => {
|
||||||
|
println!("{:?}", e);
|
||||||
|
return format!("Failure to insert into Servers {:?}", server_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut role_a_name = String::new();
|
||||||
|
let mut role_b_name = String::new();
|
||||||
|
let mut role_c_name = String::new();
|
||||||
|
|
||||||
|
if let Ok(x) = server.roles(&ctx).await {
|
||||||
|
if let Some(y) = x.get(&role_a) {
|
||||||
|
role_a_name = y.to_owned().name;
|
||||||
|
}
|
||||||
|
if let Some(y) = x.get(&role_b) {
|
||||||
|
role_b_name = y.to_owned().name;
|
||||||
|
}
|
||||||
|
if let Some(y) = x.get(&role_b) {
|
||||||
|
role_c_name = y.to_owned().name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if delete {
|
||||||
|
format!("Removed {} + {} = {}", role_a_name, role_b_name, role_c_name)
|
||||||
|
} else {
|
||||||
|
format!("Added {} + {} = {}", role_a_name, role_b_name, role_c_name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand {
|
||||||
|
command
|
||||||
|
.name("roles_adder")
|
||||||
|
.description("Combine roles together to an new one")
|
||||||
|
.create_option(|option| {
|
||||||
|
option
|
||||||
|
.name("role_a")
|
||||||
|
.description("A role you want to add to Role B")
|
||||||
|
.kind(CommandOptionType::Role)
|
||||||
|
.required(true)
|
||||||
|
})
|
||||||
|
.create_option(|option| {
|
||||||
|
option
|
||||||
|
.name("role_b")
|
||||||
|
.description("A role you want to add to Role A")
|
||||||
|
.kind(CommandOptionType::Role)
|
||||||
|
.required(true)
|
||||||
|
})
|
||||||
|
.create_option(|option| option.name("role_c").description("Sum of A and B").kind(CommandOptionType::Role).required(true))
|
||||||
|
.create_option(|option| {
|
||||||
|
option
|
||||||
|
.name("delete")
|
||||||
|
.description("Delete this entry.")
|
||||||
|
.kind(CommandOptionType::Boolean)
|
||||||
|
.required(false)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn add_server(db: &Pool<Sqlite>, server: &RoleAdder, delete: bool) -> Result<Option<RoleAdder>, Error> {
|
||||||
|
if delete {
|
||||||
|
sqlx::query_as::<_, RoleAdder>(
|
||||||
|
"
|
||||||
|
DELETE FROM roles_adder
|
||||||
|
WHERE server = ?1 AND role_a = ?2 AND role_b = ?3 AND role_c = ?4
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.bind(*server.server.as_u64() as i64)
|
||||||
|
.bind(*server.role_a.as_u64() as i64)
|
||||||
|
.bind(*server.role_b.as_u64() as i64)
|
||||||
|
.bind(*server.role_c.as_u64() as i64)
|
||||||
|
.fetch_optional(db)
|
||||||
|
.await
|
||||||
|
} else {
|
||||||
|
sqlx::query_as::<_, RoleAdder>(
|
||||||
|
"
|
||||||
|
INSERT OR REPLACE INTO roles_adder (server, role_a, role_b, role_c)
|
||||||
|
VALUES (?1, ?2, ?3, ?4)
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.bind(*server.server.as_u64() as i64)
|
||||||
|
.bind(*server.role_a.as_u64() as i64)
|
||||||
|
.bind(*server.role_b.as_u64() as i64)
|
||||||
|
.bind(*server.role_c.as_u64() as i64)
|
||||||
|
.fetch_optional(db)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
pub mod list {}
|
||||||
|
|
||||||
|
pub mod tools {
|
||||||
|
use serenity::client::Context;
|
||||||
|
use serenity::model::guild::Member;
|
||||||
|
use skynet_discord_bot::RoleAdder;
|
||||||
|
use sqlx::{Pool, Sqlite};
|
||||||
|
|
||||||
|
pub async fn on_role_change(db: &Pool<Sqlite>, ctx: &Context, mut new_data: Member) {
|
||||||
|
// check if the role changed is part of the oens for this server
|
||||||
|
if let Ok(role_adders) = sqlx::query_as::<_, RoleAdder>(
|
||||||
|
r#"
|
||||||
|
SELECT *
|
||||||
|
FROM roles_adder
|
||||||
|
WHERE server = ?
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.bind(*new_data.guild_id.as_u64() as i64)
|
||||||
|
.fetch_all(db)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
let mut roles_add = vec![];
|
||||||
|
let mut roles_remove = vec![];
|
||||||
|
|
||||||
|
for role_adder in role_adders {
|
||||||
|
// if the user has both A dnd B give them C
|
||||||
|
if new_data.roles.contains(&role_adder.role_a) && new_data.roles.contains(&role_adder.role_b) && !new_data.roles.contains(&role_adder.role_c)
|
||||||
|
{
|
||||||
|
roles_add.push(role_adder.role_c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the suer has C but not A or B remove C
|
||||||
|
if new_data.roles.contains(&role_adder.role_c)
|
||||||
|
&& (!new_data.roles.contains(&role_adder.role_a) || !new_data.roles.contains(&role_adder.role_b))
|
||||||
|
{
|
||||||
|
roles_remove.push(role_adder.role_c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !roles_add.is_empty() {
|
||||||
|
if let Err(e) = new_data.add_roles(&ctx, &roles_add).await {
|
||||||
|
println!("{:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !roles_remove.is_empty() {
|
||||||
|
if let Err(e) = new_data.remove_roles(&ctx, &roles_remove).await {
|
||||||
|
println!("{:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
99
src/lib.rs
99
src/lib.rs
|
@ -38,6 +38,8 @@ pub struct Config {
|
||||||
|
|
||||||
// wolves API base for clubs/socs
|
// wolves API base for clubs/socs
|
||||||
pub wolves_url: String,
|
pub wolves_url: String,
|
||||||
|
// API key for accessing more general resources
|
||||||
|
pub wolves_api: String,
|
||||||
}
|
}
|
||||||
impl TypeMapKey for Config {
|
impl TypeMapKey for Config {
|
||||||
type Value = Arc<RwLock<Config>>;
|
type Value = Arc<RwLock<Config>>;
|
||||||
|
@ -63,6 +65,7 @@ pub fn get_config() -> Config {
|
||||||
mail_user: "".to_string(),
|
mail_user: "".to_string(),
|
||||||
mail_pass: "".to_string(),
|
mail_pass: "".to_string(),
|
||||||
wolves_url: "".to_string(),
|
wolves_url: "".to_string(),
|
||||||
|
wolves_api: "".to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Ok(x) = env::var("DATABASE_HOME") {
|
if let Ok(x) = env::var("DATABASE_HOME") {
|
||||||
|
@ -92,6 +95,9 @@ pub fn get_config() -> Config {
|
||||||
if let Ok(x) = env::var("WOLVES_URL") {
|
if let Ok(x) = env::var("WOLVES_URL") {
|
||||||
config.wolves_url = x.trim().to_string();
|
config.wolves_url = x.trim().to_string();
|
||||||
}
|
}
|
||||||
|
if let Ok(x) = env::var("WOLVES_API") {
|
||||||
|
config.wolves_api = x.trim().to_string();
|
||||||
|
}
|
||||||
|
|
||||||
config
|
config
|
||||||
}
|
}
|
||||||
|
@ -293,6 +299,37 @@ impl<'r> FromRow<'r, SqliteRow> for Minecraft {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct RoleAdder {
|
||||||
|
pub server: GuildId,
|
||||||
|
pub role_a: RoleId,
|
||||||
|
pub role_b: RoleId,
|
||||||
|
pub role_c: RoleId,
|
||||||
|
}
|
||||||
|
impl<'r> FromRow<'r, SqliteRow> for RoleAdder {
|
||||||
|
fn from_row(row: &'r SqliteRow) -> Result<Self, Error> {
|
||||||
|
let server_tmp: i64 = row.try_get("server")?;
|
||||||
|
let server = GuildId::from(server_tmp as u64);
|
||||||
|
|
||||||
|
Ok(Self {
|
||||||
|
server,
|
||||||
|
role_a: get_role_from_row(row, "role_a"),
|
||||||
|
role_b: get_role_from_row(row, "role_b"),
|
||||||
|
role_c: get_role_from_row(row, "role_c"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_role_from_row(row: &SqliteRow, col: &str) -> RoleId {
|
||||||
|
match row.try_get(col) {
|
||||||
|
Ok(x) => {
|
||||||
|
let tmp: i64 = x;
|
||||||
|
RoleId(tmp as u64)
|
||||||
|
}
|
||||||
|
_ => RoleId::from(0u64),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn db_init(config: &Config) -> Result<Pool<Sqlite>, Error> {
|
pub async fn db_init(config: &Config) -> Result<Pool<Sqlite>, Error> {
|
||||||
let database = format!("{}/{}", &config.home, &config.database);
|
let database = format!("{}/{}", &config.home, &config.database);
|
||||||
|
|
||||||
|
@ -495,36 +532,8 @@ pub mod get_data {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::set_roles::update_server;
|
use crate::set_roles::update_server;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
use wolves_oxidised::WolvesUser;
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
|
||||||
struct WolvesResultUser {
|
|
||||||
committee: String,
|
|
||||||
member_id: String,
|
|
||||||
first_name: String,
|
|
||||||
last_name: String,
|
|
||||||
contact_email: String,
|
|
||||||
opt_in_email: String,
|
|
||||||
student_id: Option<String>,
|
|
||||||
note: Option<String>,
|
|
||||||
expiry: String,
|
|
||||||
requested: String,
|
|
||||||
approved: String,
|
|
||||||
sitename: String,
|
|
||||||
domain: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
|
||||||
struct WolvesResult {
|
|
||||||
success: i8,
|
|
||||||
result: Vec<WolvesResultUser>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
|
||||||
struct WolvesResultLocal {
|
|
||||||
pub id_wolves: String,
|
|
||||||
pub email: String,
|
|
||||||
pub expiry: String,
|
|
||||||
}
|
|
||||||
pub async fn get_wolves(ctx: &Context) {
|
pub async fn get_wolves(ctx: &Context) {
|
||||||
let db_lock = {
|
let db_lock = {
|
||||||
let data_read = ctx.data.read().await;
|
let data_read = ctx.data.read().await;
|
||||||
|
@ -538,6 +547,9 @@ pub mod get_data {
|
||||||
};
|
};
|
||||||
let config = config_lock.read().await;
|
let config = config_lock.read().await;
|
||||||
|
|
||||||
|
// set up teh client
|
||||||
|
let wolves = wolves_oxidised::Client::new(&config.wolves_url, Some(&config.wolves_api));
|
||||||
|
|
||||||
for server_config in get_server_config_bulk(&db).await {
|
for server_config in get_server_config_bulk(&db).await {
|
||||||
let Servers {
|
let Servers {
|
||||||
server,
|
server,
|
||||||
|
@ -550,7 +562,7 @@ pub mod get_data {
|
||||||
|
|
||||||
// list of users that need to be updated for this server
|
// list of users that need to be updated for this server
|
||||||
let mut user_to_update = vec![];
|
let mut user_to_update = vec![];
|
||||||
for user in get_wolves_sub(&config, wolves_api).await {
|
for user in wolves.get_members(wolves_api).await {
|
||||||
let id = user.member_id.parse::<u64>().unwrap_or_default();
|
let id = user.member_id.parse::<u64>().unwrap_or_default();
|
||||||
match existing.get(&(id as i64)) {
|
match existing.get(&(id as i64)) {
|
||||||
None => {
|
None => {
|
||||||
|
@ -596,30 +608,7 @@ pub mod get_data {
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_wolves_sub(config: &Config, wolves_api: &str) -> Vec<WolvesResultUser> {
|
async fn add_users_wolves(db: &Pool<Sqlite>, user: &WolvesUser) {
|
||||||
if config.wolves_url.is_empty() {
|
|
||||||
return vec![];
|
|
||||||
}
|
|
||||||
|
|
||||||
// get wolves data
|
|
||||||
if let Ok(mut res) = surf::post(&config.wolves_url).header("X-AM-Identity", wolves_api).await {
|
|
||||||
if let Ok(WolvesResult {
|
|
||||||
success,
|
|
||||||
result,
|
|
||||||
}) = res.body_json().await
|
|
||||||
{
|
|
||||||
if success != 1 {
|
|
||||||
return vec![];
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vec![]
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn add_users_wolves(db: &Pool<Sqlite>, user: &WolvesResultUser) {
|
|
||||||
// expiry
|
// expiry
|
||||||
match sqlx::query_as::<_, Wolves>(
|
match sqlx::query_as::<_, Wolves>(
|
||||||
"
|
"
|
||||||
|
@ -640,7 +629,7 @@ pub mod get_data {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async fn add_users_server_members(db: &Pool<Sqlite>, server: &GuildId, user: &WolvesResultUser) {
|
async fn add_users_server_members(db: &Pool<Sqlite>, server: &GuildId, user: &WolvesUser) {
|
||||||
match sqlx::query_as::<_, ServerMembers>(
|
match sqlx::query_as::<_, ServerMembers>(
|
||||||
"
|
"
|
||||||
INSERT OR REPLACE INTO server_members (server, id_wolves, expiry)
|
INSERT OR REPLACE INTO server_members (server, id_wolves, expiry)
|
||||||
|
|
25
src/main.rs
25
src/main.rs
|
@ -1,27 +1,28 @@
|
||||||
pub mod commands;
|
pub mod commands;
|
||||||
|
|
||||||
|
use crate::commands::role_adder::tools::on_role_change;
|
||||||
|
use serenity::model::guild::Member;
|
||||||
use serenity::{
|
use serenity::{
|
||||||
async_trait,
|
async_trait,
|
||||||
client::{Context, EventHandler},
|
client::{Context, EventHandler},
|
||||||
model::{
|
model::{
|
||||||
application::{command::Command, interaction::Interaction},
|
application::{command::Command, interaction::Interaction},
|
||||||
gateway::{GatewayIntents, Ready},
|
gateway::{GatewayIntents, Ready},
|
||||||
guild,
|
|
||||||
prelude::Activity,
|
prelude::Activity,
|
||||||
user::OnlineStatus,
|
user::OnlineStatus,
|
||||||
},
|
},
|
||||||
Client,
|
Client,
|
||||||
};
|
};
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use skynet_discord_bot::{db_init, get_config, get_server_config, get_server_member, Config, DataBase};
|
use skynet_discord_bot::{db_init, get_config, get_server_config, get_server_member, Config, DataBase};
|
||||||
|
use std::sync::Arc;
|
||||||
use tokio::sync::RwLock;
|
use tokio::sync::RwLock;
|
||||||
|
|
||||||
struct Handler;
|
struct Handler;
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl EventHandler for Handler {
|
impl EventHandler for Handler {
|
||||||
async fn guild_member_addition(&self, ctx: Context, mut new_member: guild::Member) {
|
// handles previously linked accounts joining the server
|
||||||
|
async fn guild_member_addition(&self, ctx: Context, mut new_member: Member) {
|
||||||
let db_lock = {
|
let db_lock = {
|
||||||
let data_read = ctx.data.read().await;
|
let data_read = ctx.data.read().await;
|
||||||
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
||||||
|
@ -75,6 +76,7 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
||||||
match Command::set_global_application_commands(&ctx.http, |commands| {
|
match Command::set_global_application_commands(&ctx.http, |commands| {
|
||||||
commands
|
commands
|
||||||
.create_application_command(|command| commands::add_server::register(command))
|
.create_application_command(|command| commands::add_server::register(command))
|
||||||
|
.create_application_command(|command| commands::role_adder::edit::register(command))
|
||||||
.create_application_command(|command| commands::link_email::link::register(command))
|
.create_application_command(|command| commands::link_email::link::register(command))
|
||||||
.create_application_command(|command| commands::link_email::verify::register(command))
|
.create_application_command(|command| commands::link_email::verify::register(command))
|
||||||
.create_application_command(|command| commands::minecraft::server::add::register(command))
|
.create_application_command(|command| commands::minecraft::server::add::register(command))
|
||||||
|
@ -106,6 +108,7 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
||||||
"link_minecraft" => commands::minecraft::user::add::run(&command, &ctx).await,
|
"link_minecraft" => commands::minecraft::user::add::run(&command, &ctx).await,
|
||||||
// admin commands
|
// admin commands
|
||||||
"add" => commands::add_server::run(&command, &ctx).await,
|
"add" => commands::add_server::run(&command, &ctx).await,
|
||||||
|
"roles_adder" => commands::role_adder::edit::run(&command, &ctx).await,
|
||||||
"minecraft_add" => commands::minecraft::server::add::run(&command, &ctx).await,
|
"minecraft_add" => commands::minecraft::server::add::run(&command, &ctx).await,
|
||||||
"minecraft_list" => commands::minecraft::server::list::run(&command, &ctx).await,
|
"minecraft_list" => commands::minecraft::server::list::run(&command, &ctx).await,
|
||||||
"minecraft_delete" => commands::minecraft::server::delete::run(&command, &ctx).await,
|
"minecraft_delete" => commands::minecraft::server::delete::run(&command, &ctx).await,
|
||||||
|
@ -120,6 +123,20 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handles role updates
|
||||||
|
async fn guild_member_update(&self, ctx: Context, _old_data: Option<Member>, new_data: Member) {
|
||||||
|
// get config/db
|
||||||
|
let db_lock = {
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
let db = db_lock.read().await;
|
||||||
|
|
||||||
|
// check if the role changed is part of the oens for this server
|
||||||
|
on_role_change(&db, &ctx, new_data).await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
|
Loading…
Reference in a new issue