From da4d006bc0984893f1a6db9975d5c7696c3a7a9d Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Tue, 29 Oct 2024 14:00:43 +0000 Subject: [PATCH 01/24] doc: update user docs --- README.md | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 068979a..1f5fe3a 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ # Skynet Discord Bot -This bots core purpose is to give members roles based on their status on . -It uses an api key provided by wolves to get member lists. +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. 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. -## Commands - Admin - +## Setup - Committee 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 1. Email ``keith@assurememberships.com`` from committee email and say ye want an api key for ``193.1.99.74`` @@ -42,29 +41,21 @@ This unlinks a minecraft server from your club/society. ``/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 -* Start the process using ``/link_wolves WOLVES_EMAIL`` - * The email that is in the Contact Email here: -* An email will be sent to them that they need to verify using ``/verify CODE`` -* This will only have to be done once. +1. in a server with the Skynet Bot enter ``/link_wolves WOLVES_EMAIL`` + * Your ``WOLVES_EMAIL`` is the email in the Contact Email here: + * This is most likely your student mail +2. An email will be sent to you with a verification code. +3. Verify the code using ``/verify CODE`` +4. Once complete your Wolves and Discord accounts will be linked. -* If the user is an active member on wolves - * 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 +You will get member roles on any Discord that is using the bot that you are a member of. ### 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`` From 2daa010d258f4ac47e2db99bcf3957a9a164af65 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Mon, 4 Nov 2024 12:43:09 +0000 Subject: [PATCH 02/24] doc: updated committee instructions --- README.md | 53 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 1f5fe3a..7c75f3f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Skynet Discord Bot -This bots core purpose is to give members roles based on their status on https://ulwolves.ie. +This bots core purpose is to give members roles based on their status on . 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. @@ -7,19 +7,52 @@ For example is a user links on the CompSoc Discord then they will also get their ## Setup - Committee You need admin access to run any of the commands in this section. -Either the server owner or a user with the ``Administrator`` permission +Either the server owner or a user with the ``Administrator`` permission. -### Getting the Skynet Discord bot -1. Email ``keith@assurememberships.com`` from committee email and say ye want an api key for ``193.1.99.74`` -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, ) -4. Invite the bot https://discord.com/api/oauth2/authorize?client_id=1145761669256069270&permissions=139855185984&scope=bot -5. Make sure the bot role ``@skynet`` is above these two roles (so it can manage them) -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) +### Get the API Key +The ``api_key`` is used by the Bot in order to request information, it will be used later in the process. + +1. Email ``keith@assurememberships.com`` from committee email and say you want an ``api_key`` for ``193.1.99.74`` + * The committee email is the one here: + * This may take up to a week to get the key. + +### 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. +### 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 + * Will be removed in the future + +At this point the bot is set up and no further action is required. + ### Minecraft The bot is able to manage the whitelist of a Minecraft server managed by the Computer Society. Talk to us to get a server. From 94292fa388d9cb484210d0a668a27d0956898e29 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Mon, 18 Nov 2024 16:09:43 +0000 Subject: [PATCH 03/24] fix: style was causing issues --- src/commands/link_email.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/link_email.rs b/src/commands/link_email.rs index 4961dbb..1b462f6 100644 --- a/src/commands/link_email.rs +++ b/src/commands/link_email.rs @@ -133,7 +133,7 @@ pub mod link { "h2, h4 { font-family: Arial, Helvetica, sans-serif; }" } } - div style="display: flex; flex-direction: column; align-items: center;" { + div { h2 { "Hello from Skynet!" } // Substitute in the name of our recipient. p { "Hi " (user) "," } From 96a61e6fc8fdb9b4b59399439b50e63830cb8dc6 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 23 Nov 2024 00:20:24 +0000 Subject: [PATCH 04/24] git: finally added a gitattributes --- .gitattributes | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6c7adef --- /dev/null +++ b/.gitattributes @@ -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 From 5dee9acbaadc7cb499df5c018cd7d531e26ff2f1 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Mon, 18 Nov 2024 16:14:16 +0000 Subject: [PATCH 05/24] doc: added images to suer signup --- README.md | 7 +++++-- media/setup_user_01.png | 3 +++ media/setup_user_02.png | 3 +++ media/setup_user_03.png | 3 +++ 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 media/setup_user_01.png create mode 100644 media/setup_user_02.png create mode 100644 media/setup_user_03.png diff --git a/README.md b/README.md index 7c75f3f..b9aa348 100644 --- a/README.md +++ b/README.md @@ -79,11 +79,14 @@ This is to link your Discord account with your UL Wolves account. **You will only need to do this once**. ### Setup -1. in a server with the Skynet Bot enter ``/link_wolves WOLVES_EMAIL`` +1. In a Discord server with the Skynet Bot enter ``/link_wolves WOLVES_EMAIL`` + ![link start](media/setup_user_01.png) * Your ``WOLVES_EMAIL`` is the email in the Contact Email here: * This is most likely your student mail 2. An email will be sent to you with a verification code. -3. Verify the code using ``/verify CODE`` + ![signup email](media/setup_user_02.png) +3. Verify the code using ``/verify CODE`` in Discord + ![verify in discord](media/setup_user_03.png) 4. Once complete your Wolves and Discord accounts will be linked. You will get member roles on any Discord that is using the bot that you are a member of. diff --git a/media/setup_user_01.png b/media/setup_user_01.png new file mode 100644 index 0000000..b5e207b --- /dev/null +++ b/media/setup_user_01.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6440b2d302c5a7e46493687bb0bbf941c29c5552c71869303397da3c4f0a52b +size 72163 diff --git a/media/setup_user_02.png b/media/setup_user_02.png new file mode 100644 index 0000000..34898b9 --- /dev/null +++ b/media/setup_user_02.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e64d8e2322990dcc6446a34e988c6754edc536c3ee1aa8c330e7dadb899152bc +size 72884 diff --git a/media/setup_user_03.png b/media/setup_user_03.png new file mode 100644 index 0000000..fda3bda --- /dev/null +++ b/media/setup_user_03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f19d24686bb9da8857263d1f146e29413fd6bd316981281c18ef2b4ec3621596 +size 51740 From dda05d7ca15fc34417093dad36ac45be25fdb40a Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Mon, 18 Nov 2024 16:22:40 +0000 Subject: [PATCH 06/24] doc: resized images using html tags --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b9aa348..3fef46a 100644 --- a/README.md +++ b/README.md @@ -79,14 +79,14 @@ This is to link your Discord account with your UL Wolves account. **You will only need to do this once**. ### Setup -1. In a Discord server with the Skynet Bot enter ``/link_wolves WOLVES_EMAIL`` - ![link start](media/setup_user_01.png) +1. In a Discord server with the Skynet Bot enter ``/link_wolves WOLVES_EMAIL`` + link process start * Your ``WOLVES_EMAIL`` is the email in the Contact Email here: * This is most likely your student mail -2. An email will be sent to you with a verification code. - ![signup email](media/setup_user_02.png) -3. Verify the code using ``/verify CODE`` in Discord - ![verify in discord](media/setup_user_03.png) +2. An email will be sent to you with a verification code. + signup email +3. Verify the code using ``/verify CODE`` in Discord. + verify in discord 4. Once complete your Wolves and Discord accounts will be linked. You will get member roles on any Discord that is using the bot that you are a member of. From 93359698f0431a50b9a747adf4bd66b23c02c808 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Mon, 18 Nov 2024 16:38:33 +0000 Subject: [PATCH 07/24] doc: feedback --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3fef46a..5a0630b 100644 --- a/README.md +++ b/README.md @@ -79,13 +79,13 @@ This is to link your Discord account with your UL Wolves account. **You will only need to do this once**. ### Setup -1. In a Discord server with the Skynet Bot enter ``/link_wolves WOLVES_EMAIL`` +1. In a Discord server with the Skynet Bot enter ``/link_wolves YOUR_WOLVES_CONTACT_EMAIL`` link process start - * Your ``WOLVES_EMAIL`` is the email in the Contact Email here: + * Your ``YOUR_WOLVES_CONTACT_EMAIL`` is the email in the Contact Email here: * This is most likely your student mail 2. An email will be sent to you with a verification code. signup email -3. Verify the code using ``/verify CODE`` in Discord. +3. Verify the code using ``/verify CODE_FROM_EMAIL`` in Discord. verify in discord 4. Once complete your Wolves and Discord accounts will be linked. From 37ea38f516e4f86c43b685fd365e078336c6e858 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 23 Nov 2024 22:17:57 +0000 Subject: [PATCH 08/24] feat: backport changes from the #17-automate-onboarding-mk-ii branch --- Cargo.lock | 413 +++++++++++++++++++++++++++++++++---- Cargo.toml | 5 +- src/commands/link_email.rs | 43 +++- src/lib.rs | 68 ++---- 4 files changed, 433 insertions(+), 96 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d8c9113..0f043b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -218,6 +218,28 @@ dependencies = [ "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]] name = "async-task" version = "4.7.1" @@ -232,7 +254,7 @@ checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", ] [[package]] @@ -920,7 +942,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", ] [[package]] @@ -1024,7 +1046,26 @@ dependencies = [ "futures-core", "futures-sink", "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", "slab", "tokio", @@ -1147,6 +1188,17 @@ dependencies = [ "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]] name = "http-body" version = "0.4.6" @@ -1154,7 +1206,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "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", ] @@ -1216,9 +1291,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -1230,6 +1305,26 @@ dependencies = [ "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]] name = "hyper-rustls" version = "0.24.2" @@ -1237,13 +1332,65 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.30", "rustls 0.21.12", "tokio", "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]] name = "iana-time-zone" version = "0.1.61" @@ -1330,7 +1477,7 @@ dependencies = [ "curl-sys", "flume 0.9.2", "futures-lite 1.13.0", - "http", + "http 0.2.12", "log", "once_cell", "slab", @@ -1678,7 +1825,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", ] [[package]] @@ -1775,7 +1922,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", ] [[package]] @@ -1901,9 +2048,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -2014,11 +2161,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-rustls 0.24.2", "ipnet", "js-sys", "log", @@ -2028,12 +2175,12 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.12", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", - "system-configuration", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", "tokio", "tokio-rustls 0.24.1", "tokio-util", @@ -2047,6 +2194,49 @@ dependencies = [ "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]] name = "ring" version = "0.16.20" @@ -2145,10 +2335,23 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring 0.17.8", - "rustls-webpki", + "rustls-webpki 0.101.7", "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]] name = "rustls-pemfile" version = "1.0.4" @@ -2158,6 +2361,21 @@ dependencies = [ "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]] name = "rustls-webpki" version = "0.101.7" @@ -2168,6 +2386,17 @@ dependencies = [ "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]] name = "ryu" version = "1.0.18" @@ -2239,9 +2468,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -2258,13 +2487,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", ] [[package]] @@ -2321,7 +2550,7 @@ dependencies = [ "mime_guess", "parking_lot", "percent-encoding", - "reqwest", + "reqwest 0.11.27", "serde", "serde-value", "serde_json", @@ -2423,6 +2652,7 @@ dependencies = [ "sqlx", "surf", "tokio", + "wolves_oxidised", ] [[package]] @@ -2819,9 +3049,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ "proc-macro2", "quote", @@ -2834,6 +3064,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "system-configuration" version = "0.5.1" @@ -2842,7 +3081,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "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]] @@ -2855,6 +3105,16 @@ dependencies = [ "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]] name = "tempfile" version = "3.12.0" @@ -2885,7 +3145,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", ] [[package]] @@ -2996,7 +3256,17 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "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]] @@ -3020,6 +3290,17 @@ dependencies = [ "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]] name = "tokio-stream" version = "0.1.16" @@ -3031,6 +3312,19 @@ dependencies = [ "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]] name = "tokio-util" version = "0.7.12" @@ -3070,7 +3364,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", ] [[package]] @@ -3107,7 +3401,7 @@ dependencies = [ "base64 0.13.1", "byteorder", "bytes 1.7.1", - "http", + "http 0.2.12", "httparse", "log", "rand 0.8.5", @@ -3298,7 +3592,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", "wasm-bindgen-shared", ] @@ -3332,7 +3626,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3432,6 +3726,36 @@ dependencies = [ "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]] name = "windows-sys" version = "0.48.0" @@ -3590,6 +3914,17 @@ dependencies = [ "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]] name = "zerocopy" version = "0.7.35" @@ -3608,7 +3943,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.89", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a26023a..2dc64c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,9 @@ name = "update_minecraft" serenity = { version = "0.11.6", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache"] } 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 surf = "2.3.2" @@ -37,4 +40,4 @@ chrono = "0.4.26" lettre = "0.10.4" maud = "0.25.0" -serde = "1.0.188" \ No newline at end of file +serde = "1.0" \ No newline at end of file diff --git a/src/commands/link_email.rs b/src/commands/link_email.rs index 1b462f6..a2a6f5d 100644 --- a/src/commands/link_email.rs +++ b/src/commands/link_email.rs @@ -59,7 +59,34 @@ pub mod link { // check if email exists let details = match get_server_member_email(&db, email).await { 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, }; @@ -232,6 +259,20 @@ pub mod link { .fetch_optional(db) .await } + + async fn save_to_db_user(db: &Pool, id_wolves: i64, email: &str) -> Result, 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 { diff --git a/src/lib.rs b/src/lib.rs index 5923151..05f6125 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -38,6 +38,8 @@ pub struct Config { // wolves API base for clubs/socs pub wolves_url: String, + // API key for accessing more general resources + pub wolves_api: String, } impl TypeMapKey for Config { type Value = Arc>; @@ -63,6 +65,7 @@ pub fn get_config() -> Config { mail_user: "".to_string(), mail_pass: "".to_string(), wolves_url: "".to_string(), + wolves_api: "".to_string(), }; 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") { config.wolves_url = x.trim().to_string(); } + if let Ok(x) = env::var("WOLVES_API") { + config.wolves_api = x.trim().to_string(); + } config } @@ -526,36 +532,8 @@ pub mod get_data { use super::*; use crate::set_roles::update_server; 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, - note: Option, - expiry: String, - requested: String, - approved: String, - sitename: String, - domain: String, - } - - #[derive(Deserialize, Serialize, Debug)] - struct WolvesResult { - success: i8, - result: Vec, - } - - #[derive(Deserialize, Serialize, Debug)] - struct WolvesResultLocal { - pub id_wolves: String, - pub email: String, - pub expiry: String, - } pub async fn get_wolves(ctx: &Context) { let db_lock = { let data_read = ctx.data.read().await; @@ -569,6 +547,9 @@ pub mod get_data { }; 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 { let Servers { server, @@ -581,7 +562,7 @@ pub mod get_data { // list of users that need to be updated for this server 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::().unwrap_or_default(); match existing.get(&(id as i64)) { None => { @@ -627,30 +608,7 @@ pub mod get_data { .unwrap_or_default() } - async fn get_wolves_sub(config: &Config, wolves_api: &str) -> Vec { - 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, user: &WolvesResultUser) { + async fn add_users_wolves(db: &Pool, user: &WolvesUser) { // expiry match sqlx::query_as::<_, Wolves>( " @@ -671,7 +629,7 @@ pub mod get_data { } } } - async fn add_users_server_members(db: &Pool, server: &GuildId, user: &WolvesResultUser) { + async fn add_users_server_members(db: &Pool, server: &GuildId, user: &WolvesUser) { match sqlx::query_as::<_, ServerMembers>( " INSERT OR REPLACE INTO server_members (server, id_wolves, expiry) From f00db7ef5d4105ecee51b6893a327c84623867bf Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 23 Nov 2024 22:24:29 +0000 Subject: [PATCH 09/24] ci: update teh actions to take into account git-lfs --- .forgejo/workflows/push.yaml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/push.yaml b/.forgejo/workflows/push.yaml index 28f49f6..e62cb54 100644 --- a/.forgejo/workflows/push.yaml +++ b/.forgejo/workflows/push.yaml @@ -19,6 +19,10 @@ jobs: steps: # get the repo first - uses: https://code.forgejo.org/actions/checkout@v4 + - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v6 + with: + repository: ${{ gitea.repository }} + ref_name: ${{ gitea.ref_name }} - run: nix build .#fmt --verbose # clippy is incredibly useful for making yer code better @@ -30,6 +34,10 @@ jobs: steps: # get the repo first - uses: https://code.forgejo.org/actions/checkout@v4 + - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v6 + with: + repository: ${{ gitea.repository }} + ref_name: ${{ gitea.ref_name }} - run: nix build .#clippy --verbose build: @@ -39,6 +47,10 @@ jobs: steps: # get the repo first - uses: https://code.forgejo.org/actions/checkout@v4 + - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v6 + with: + repository: ${{ gitea.repository }} + ref_name: ${{ gitea.ref_name }} - name: "Build it locally" run: nix build --verbose @@ -49,7 +61,7 @@ jobs: needs: [ build ] steps: - 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: input: 'skynet_discord_bot' token: ${{ secrets.API_TOKEN_FORGEJO }} \ No newline at end of file From bab6e4fdec14b58112b2328bcc9f0ef809022734 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 23 Nov 2024 22:27:20 +0000 Subject: [PATCH 10/24] ci: use the nix compatable version --- .forgejo/workflows/push.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/push.yaml b/.forgejo/workflows/push.yaml index e62cb54..984c5d6 100644 --- a/.forgejo/workflows/push.yaml +++ b/.forgejo/workflows/push.yaml @@ -19,7 +19,7 @@ jobs: steps: # get the repo first - uses: https://code.forgejo.org/actions/checkout@v4 - - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v6 + - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v3 with: repository: ${{ gitea.repository }} ref_name: ${{ gitea.ref_name }} @@ -34,7 +34,7 @@ jobs: steps: # get the repo first - uses: https://code.forgejo.org/actions/checkout@v4 - - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v6 + - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v3 with: repository: ${{ gitea.repository }} ref_name: ${{ gitea.ref_name }} @@ -47,7 +47,7 @@ jobs: steps: # get the repo first - uses: https://code.forgejo.org/actions/checkout@v4 - - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v6 + - uses: https://forgejo.skynet.ie/Skynet/actions/get_lfs@v3 with: repository: ${{ gitea.repository }} ref_name: ${{ gitea.ref_name }} From 1f3c33458e680bfb5ade7e4f5760ffeaff964c77 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 23 Nov 2024 23:50:25 +0000 Subject: [PATCH 11/24] dbg: excessive logging --- Cargo.lock | 4 ++-- src/lib.rs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f043b2..3a31650 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1298,7 +1298,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -3917,7 +3917,7 @@ dependencies = [ [[package]] name = "wolves_oxidised" version = "0.1.0" -source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#eee6a76c695a36f1fe220fdeafd5a43757e50527" +source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#0097761c6973b490ffd0ec5b5ca45d3ab9c7915a" dependencies = [ "reqwest 0.12.9", "serde", diff --git a/src/lib.rs b/src/lib.rs index 05f6125..b449861 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,7 @@ use sqlx::{ use std::{env, str::FromStr, sync::Arc}; use tokio::sync::RwLock; +#[derive(Debug)] pub struct Config { // manages where teh database is stored pub home: String, @@ -98,6 +99,7 @@ pub fn get_config() -> Config { if let Ok(x) = env::var("WOLVES_API") { config.wolves_api = x.trim().to_string(); } + dbg!(&config); config } From ad94b197ae887d8b1ddefd4574b69ebd8d41cc00 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sun, 24 Nov 2024 00:14:42 +0000 Subject: [PATCH 12/24] fix: pretty solid chance that this was due to using teh wrong base url --- Cargo.lock | 2 +- src/lib.rs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3a31650..4375270 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3917,7 +3917,7 @@ dependencies = [ [[package]] name = "wolves_oxidised" version = "0.1.0" -source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#0097761c6973b490ffd0ec5b5ca45d3ab9c7915a" +source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#eee6a76c695a36f1fe220fdeafd5a43757e50527" dependencies = [ "reqwest 0.12.9", "serde", diff --git a/src/lib.rs b/src/lib.rs index b449861..d73b009 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -93,13 +93,12 @@ pub fn get_config() -> Config { config.mail_pass = x.trim().to_string(); } - if let Ok(x) = env::var("WOLVES_URL") { + if let Ok(x) = env::var("WOLVES_URL_BASE") { config.wolves_url = x.trim().to_string(); } if let Ok(x) = env::var("WOLVES_API") { config.wolves_api = x.trim().to_string(); } - dbg!(&config); config } From bf55dfe31e0f2e8e70382e8d00f99c8cd9965682 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Mon, 25 Nov 2024 17:45:04 +0000 Subject: [PATCH 13/24] dbg: excessive logging --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 4375270..799b277 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3917,7 +3917,7 @@ dependencies = [ [[package]] name = "wolves_oxidised" version = "0.1.0" -source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#eee6a76c695a36f1fe220fdeafd5a43757e50527" +source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#1c176d4f7338cb6c98831533a14b7391bce76481" dependencies = [ "reqwest 0.12.9", "serde", From 68d7b53905215d6ad752a57125fb10b2d7a4cda8 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Mon, 25 Nov 2024 18:07:20 +0000 Subject: [PATCH 14/24] dbg: excessive logging - moar --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 799b277..4929efa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3917,7 +3917,7 @@ dependencies = [ [[package]] name = "wolves_oxidised" version = "0.1.0" -source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#1c176d4f7338cb6c98831533a14b7391bce76481" +source = "git+https://forgejo.skynet.ie/Skynet/wolves-oxidised.git#867778128c1ef580ebfded7808bbd4e86f22903b" dependencies = [ "reqwest 0.12.9", "serde", From 4691869ae90839764d7a94cbc94cbc898a0e59ff Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Fri, 29 Nov 2024 22:16:31 +0000 Subject: [PATCH 15/24] doc: split out the documentation --- README.md | 101 ++++------------------------------------------- doc/Committee.md | 75 +++++++++++++++++++++++++++++++++++ doc/User.md | 26 ++++++++++++ 3 files changed, 108 insertions(+), 94 deletions(-) create mode 100644 doc/Committee.md create mode 100644 doc/User.md diff --git a/README.md b/README.md index 5a0630b..01543e6 100644 --- a/README.md +++ b/README.md @@ -1,97 +1,10 @@ # Skynet Discord Bot -This bots core purpose is to give members roles based on their status on . -It uses an api key provided by wolves to get member lists. +The Skynet bot is designed to manage users on Discord. +It allows users to link their UL Wolves account with Wolves in a GDPR compliant manner. +Skynet (bot) is hosted is hosted by the Computer Society on Skynet (computer cluster). -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. +## Documentation +We have split up the documentation into different segments depending on who the user is. -## Setup - Committee -You need admin access to run any of the commands in this section. -Either the server owner or a user with the ``Administrator`` permission. - -### Get the API Key -The ``api_key`` is used by the Bot in order to request information, it will be used later in the process. - -1. Email ``keith@assurememberships.com`` from committee email and say you want an ``api_key`` for ``193.1.99.74`` - * The committee email is the one here: - * This may take up to a week to get the key. - -### 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. - -### 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 - * Will be removed in the future - -At this point the bot is set up and no further action is required. - -### Minecraft -The bot is able to manage the whitelist of a Minecraft server managed by the Computer Society. -Talk to us to get a server. - -#### Add -This links a minecraft server with your club/society. - -``/minecraft_add SERVER_ID`` - - -#### List -List the servers linked to your club/society. -It is possible to have more than one minecraft server - -``/minecraft_list`` - -#### Delete -This unlinks a minecraft server from your club/society. - -``/minecraft_delete SERVER_ID`` - -## Setup - Users -This is to link your Discord account with your UL Wolves account. -**You will only need to do this once**. - -### Setup -1. In a Discord server with the Skynet Bot enter ``/link_wolves YOUR_WOLVES_CONTACT_EMAIL`` - link process start - * Your ``YOUR_WOLVES_CONTACT_EMAIL`` is the email in the Contact Email here: - * This is most likely your student mail -2. An email will be sent to you with a verification code. - signup email -3. Verify the code using ``/verify CODE_FROM_EMAIL`` in Discord. - verify in discord -4. Once complete your Wolves and Discord accounts will be linked. - -You will get member roles on any Discord that is using the bot that you are a member of. - -### Minecraft -You can link your Minecraft username to grant you access to any Minecraft server run by UL Computer Society. - -``/link_minecraft MINECRAFT_USERNAME`` +* [Committees](./doc/Committee.md) +* [Member](./doc/User.md) \ No newline at end of file diff --git a/doc/Committee.md b/doc/Committee.md new file mode 100644 index 0000000..d53be13 --- /dev/null +++ b/doc/Committee.md @@ -0,0 +1,75 @@ +# Skynet Discord Bot +This bots core purpose is to give members roles based on their status on . +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. +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. + +## Setup - Committee +You need admin access to run any of the commands in this section. +Either the server owner or a user with the ``Administrator`` permission. + +### Get the API Key +The ``api_key`` is used by the Bot in order to request information, it will be used later in the process. + +1. Email ``keith@assurememberships.com`` from committee email and say you want an ``api_key`` for ``193.1.99.74`` + * The committee email is the one here: + * This may take up to a week to get the key. + +### 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. + +### 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 + * Will be removed in the future + +At this point the bot is set up and no further action is required. + +### Minecraft +The bot is able to manage the whitelist of a Minecraft server managed by the Computer Society. +Talk to us to get a server. + +#### Add +This links a minecraft server with your club/society. + +``/minecraft_add SERVER_ID`` + + +#### List +List the servers linked to your club/society. +It is possible to have more than one minecraft server + +``/minecraft_list`` + +#### Delete +This unlinks a minecraft server from your club/society. + +``/minecraft_delete SERVER_ID`` diff --git a/doc/User.md b/doc/User.md new file mode 100644 index 0000000..fec6abe --- /dev/null +++ b/doc/User.md @@ -0,0 +1,26 @@ +# Skynet Discord Bot +The Skynet bot is designed to make it easy to verify that you are a member of a Club/Society. +The bot will be able to give you member roles for any partnered servers. +It also provides secondary manifests such as granting access to minecraft servers managed by teh Computer Society. + +## Setup +This is to link your Discord account with your UL Wolves account. +**You will only need to do this once**. + +### Setup +1. In a Discord server with the Skynet Bot enter ``/link_wolves YOUR_WOLVES_CONTACT_EMAIL`` + link process start + * Your ``YOUR_WOLVES_CONTACT_EMAIL`` is the email in the Contact Email here: + * This is most likely your student mail +2. An email will be sent to you with a verification code. + signup email +3. Verify the code using ``/verify CODE_FROM_EMAIL`` in Discord. + verify in discord +4. Once complete your Wolves and Discord accounts will be linked. + +You will get member roles on any Discord that is using the bot that you are a member of. + +### Minecraft +You can link your Minecraft username to grant you access to any Minecraft server run by UL Computer Society. + +``/link_minecraft MINECRAFT_USERNAME`` From b55650b221add58d720f4a69b385a9394605b94b Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Fri, 29 Nov 2024 23:12:52 +0000 Subject: [PATCH 16/24] db: add another col to store the bedrock id For #26 --- db/migrations/7_minecraft-bedrock.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 db/migrations/7_minecraft-bedrock.sql diff --git a/db/migrations/7_minecraft-bedrock.sql b/db/migrations/7_minecraft-bedrock.sql new file mode 100644 index 0000000..71d8976 --- /dev/null +++ b/db/migrations/7_minecraft-bedrock.sql @@ -0,0 +1,3 @@ + +-- Using this col we will be able to see if someone has a bedrock account (as well as a java one) +ALTER TABLE wolves ADD COLUMN minecraft_uid TEXT; \ No newline at end of file From ee0c8f09872d50038afdb7e08b86ed5f33a34986 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 30 Nov 2024 00:44:36 +0000 Subject: [PATCH 17/24] feat; can now handle bedrock in the command For #26 --- Cargo.lock | 48 ++++++++--------- Cargo.toml | 3 ++ src/commands/minecraft.rs | 105 +++++++++++++++++++++++++++++++++----- src/lib.rs | 5 ++ 4 files changed, 124 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4929efa..23bef46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -107,9 +107,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "async-channel" @@ -143,7 +143,7 @@ dependencies = [ "async-task", "concurrent-queue", "fastrand 2.1.1", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "slab", ] @@ -158,21 +158,21 @@ dependencies = [ "async-io", "async-lock", "blocking", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "once_cell", ] [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "parking", "polling", "rustix", @@ -206,7 +206,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "gloo-timers", "kv-log-macro", "log", @@ -381,7 +381,7 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] @@ -586,9 +586,9 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.46" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2161dd6eba090ff1594084e95fd67aeccf04382ffea77999ea94ed42ec67b6" +checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265" dependencies = [ "curl-sys", "libc", @@ -601,9 +601,9 @@ dependencies = [ [[package]] name = "curl-sys" -version = "0.4.75+curl-8.10.0" +version = "0.4.78+curl-8.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4fd752d337342e4314717c0d9b6586b059a120c80029ebe4d49b11fec7875e" +checksum = "8eec768341c5c7789611ae51cf6c459099f22e64a5d5d0ce4892434e33821eaf" dependencies = [ "cc", "libc", @@ -923,9 +923,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "fastrand 2.1.1", "futures-core", @@ -1298,7 +1298,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -1907,18 +1907,18 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", @@ -1977,9 +1977,9 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", @@ -3521,9 +3521,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "value-bag" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" [[package]] name = "vcpkg" diff --git a/Cargo.toml b/Cargo.toml index 2dc64c8..6e60066 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,9 @@ name = "update_users" [[bin]] name = "update_minecraft" +[[bin]] +name = "test" + [dependencies] # discord library serenity = { version = "0.11.6", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache"] } diff --git a/src/commands/minecraft.rs b/src/commands/minecraft.rs index b6b6dd5..52f9a04 100644 --- a/src/commands/minecraft.rs +++ b/src/commands/minecraft.rs @@ -15,18 +15,29 @@ pub(crate) mod user { pub(crate) mod add { use super::*; use crate::commands::link_email::link::get_server_member_discord; + use serde::{Deserialize, Serialize}; use serenity::model::id::UserId; use skynet_discord_bot::{whitelist_update, Config, Minecraft, Wolves}; use sqlx::Error; pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand { - command.name("link_minecraft").description("Link your minecraft account").create_option(|option| { - option - .name("minecraft-username") - .description("Your Minecraft username") - .kind(CommandOptionType::String) - .required(true) - }) + command + .name("link_minecraft") + .description("Link your minecraft account") + .create_option(|option| { + option + .name("minecraft-username") + .description("Your Minecraft username") + .kind(CommandOptionType::String) + .required(true) + }) + .create_option(|option| { + option + .name("java-account") + .description("Is this a Java account?") + .kind(CommandOptionType::Boolean) + .required(false) + }) } pub async fn run(command: &ApplicationCommandInteraction, ctx: &Context) -> String { @@ -61,12 +72,35 @@ pub(crate) mod user { return "Please provide a valid username".to_string(); }; - // insert the username into the database - match add_minecraft(&db, &command.user.id, username).await { - Ok(_) => {} - Err(e) => { - dbg!("{:?}", e); - return format!("Failure to minecraft username {:?}", username); + // this is always true unless they state its not + let mut java = true; + if let Some(x) = command.data.options.get(1) { + if let Some(CommandDataOptionValue::Boolean(z)) = x.to_owned().resolved { + java = z; + } + } + + if java { + // insert the username into the database + match add_minecraft(&db, &command.user.id, username).await { + Ok(_) => {} + Err(e) => { + dbg!("{:?}", e); + return format!("Failure to minecraft username {:?}", username); + } + } + } else { + match get_minecraft_bedrock(username, &config.minecraft_mcprofile).await { + None => { + return format!("No UID found for {:?}", username); + } + Some(x) => match add_minecraft_bedrock(&db, &command.user.id, &x.floodgateuid).await { + Ok(_) => {} + Err(e) => { + dbg!("{:?}", e); + return format!("Failure to minecraft UID {:?}", &x.floodgateuid); + } + }, } } @@ -94,6 +128,51 @@ pub(crate) mod user { .await } + #[derive(Serialize, Deserialize, Debug)] + struct BedrockDetails { + pub gamertag: String, + pub xuid: String, + pub floodgateuid: String, + pub icon: String, + pub gamescore: String, + pub accounttier: String, + pub textureid: String, + pub skin: String, + pub linked: bool, + pub java_uuid: String, + pub java_name: String, + } + + async fn get_minecraft_bedrock(username: &str, api_key: &str) -> Option { + let url = format!("https://mcprofile.io/api/v1/bedrock/gamertag/{username}/"); + match surf::get(url) + .header("x-api-key", api_key) + .header("User-Agent", "UL Computer Society") + .recv_json() + .await + { + Ok(res) => Some(res), + Err(e) => { + dbg!(e); + None + } + } + } + + async fn add_minecraft_bedrock(db: &Pool, user: &UserId, minecraft: &str) -> Result, Error> { + sqlx::query_as::<_, Wolves>( + " + UPDATE wolves + SET minecraft_uid = ?2 + WHERE discord = ?1; + ", + ) + .bind(*user.as_u64() as i64) + .bind(minecraft) + .fetch_optional(db) + .await + } + async fn get_servers(db: &Pool, discord: &UserId) -> Result, Error> { sqlx::query_as::<_, Minecraft>( " diff --git a/src/lib.rs b/src/lib.rs index d73b009..b2e5685 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,6 +31,7 @@ pub struct Config { // tokens for discord and other API's pub discord_token: String, pub discord_token_minecraft: String, + pub minecraft_mcprofile: String, // email settings pub mail_smtp: String, @@ -58,6 +59,7 @@ pub fn get_config() -> Config { let mut config = Config { discord_token: "".to_string(), discord_token_minecraft: "".to_string(), + minecraft_mcprofile: "".to_string(), home: ".".to_string(), database: "database.db".to_string(), @@ -82,6 +84,9 @@ pub fn get_config() -> Config { if let Ok(x) = env::var("DISCORD_TOKEN_MINECRAFT") { config.discord_token_minecraft = x.trim().to_string(); } + if let Ok(x) = env::var("MINECRAFT_MCPROFILE_KEY") { + config.minecraft_mcprofile = x.trim().to_string(); + } if let Ok(x) = env::var("EMAIL_SMTP") { config.mail_smtp = x.trim().to_string(); From 0478f634fa8122aa699695bf590709706eef4d5a Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 30 Nov 2024 00:55:23 +0000 Subject: [PATCH 18/24] feat; modified the command that interacts with teh server to accomodate bedrock players For #26 --- src/commands/minecraft.rs | 2 +- src/lib.rs | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/commands/minecraft.rs b/src/commands/minecraft.rs index 52f9a04..e8f132d 100644 --- a/src/commands/minecraft.rs +++ b/src/commands/minecraft.rs @@ -107,7 +107,7 @@ pub(crate) mod user { // get a list of servers that the user is a member of if let Ok(servers) = get_servers(&db, &command.user.id).await { for server in servers { - whitelist_update(&vec![username.to_string()], &server.minecraft, &config.discord_token_minecraft).await; + whitelist_update(&vec![(username.to_string(), java)], &server.minecraft, &config.discord_token_minecraft).await; } } diff --git a/src/lib.rs b/src/lib.rs index b2e5685..b5a0a4e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -135,6 +135,7 @@ pub struct ServerMembersWolves { pub email: String, pub discord: Option, pub minecraft: Option, + pub minecraft_uid: Option, } impl<'r> FromRow<'r, SqliteRow> for ServerMembersWolves { fn from_row(row: &'r SqliteRow) -> Result { @@ -159,6 +160,7 @@ impl<'r> FromRow<'r, SqliteRow> for ServerMembersWolves { email: row.try_get("email")?, discord, minecraft: row.try_get("minecraft")?, + minecraft_uid: row.try_get("minecraft_uid")?, }) } } @@ -704,7 +706,10 @@ pub async fn update_server(server_id: &str, db: &Pool, g_id: &GuildId, c let mut usernames = vec![]; for member in get_server_member_bulk(db, g_id).await { if let Some(x) = member.minecraft { - usernames.push(x); + usernames.push((x, true)); + } + if let Some(x) = member.minecraft_uid { + usernames.push((x, true)); } } if !usernames.is_empty() { @@ -768,13 +773,19 @@ struct BodyDelete { files: Vec, } -pub async fn whitelist_update(add: &Vec, server: &str, token: &str) { +pub async fn whitelist_update(add: &Vec<(String, bool)>, server: &str, token: &str) { let url_base = format!("http://panel.games.skynet.ie/api/client/servers/{server}"); let bearer = format!("Bearer {token}"); - for name in add { - let data = BodyCommand { - command: format!("whitelist add {name}"), + for (name, java) in add { + let data = if *java { + BodyCommand { + command: format!("whitelist add {name}"), + } + } else { + BodyCommand { + command: format!("fwhitelist add {name}"), + } }; post(&format!("{url_base}/command"), &bearer, &data).await; } From 9b3c71e3215b6f525bc25e91c0dc542f5fe7e9ba Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 30 Nov 2024 01:05:19 +0000 Subject: [PATCH 19/24] fix: had not intednded to leave the test config inthe cargo.toml --- Cargo.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6e60066..2dc64c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,9 +14,6 @@ name = "update_users" [[bin]] name = "update_minecraft" -[[bin]] -name = "test" - [dependencies] # discord library serenity = { version = "0.11.6", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache"] } From 68ffa55dc5b48933e38771983e0f87a11a2b6369 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 30 Nov 2024 01:21:40 +0000 Subject: [PATCH 20/24] fix: improve wording --- src/commands/minecraft.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/commands/minecraft.rs b/src/commands/minecraft.rs index e8f132d..7e96b99 100644 --- a/src/commands/minecraft.rs +++ b/src/commands/minecraft.rs @@ -26,15 +26,15 @@ pub(crate) mod user { .description("Link your minecraft account") .create_option(|option| { option - .name("minecraft-username") + .name("Minecraft Username") .description("Your Minecraft username") .kind(CommandOptionType::String) .required(true) }) .create_option(|option| { option - .name("java-account") - .description("Is this a Java account?") + .name("Bedrock Account") + .description("Is this a Bedrock account?") .kind(CommandOptionType::Boolean) .required(false) }) @@ -76,7 +76,7 @@ pub(crate) mod user { let mut java = true; if let Some(x) = command.data.options.get(1) { if let Some(CommandDataOptionValue::Boolean(z)) = x.to_owned().resolved { - java = z; + java = !z; } } From b7d36de976ca8a0e2e9724043b1890e6eb4d3e10 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sat, 30 Nov 2024 13:49:30 +0000 Subject: [PATCH 21/24] fix: argument names and some logic --- src/commands/minecraft.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/commands/minecraft.rs b/src/commands/minecraft.rs index 7e96b99..5c7772e 100644 --- a/src/commands/minecraft.rs +++ b/src/commands/minecraft.rs @@ -26,14 +26,14 @@ pub(crate) mod user { .description("Link your minecraft account") .create_option(|option| { option - .name("Minecraft Username") + .name("minecraft_username") .description("Your Minecraft username") .kind(CommandOptionType::String) .required(true) }) .create_option(|option| { option - .name("Bedrock Account") + .name("bedrock_account") .description("Is this a Bedrock account?") .kind(CommandOptionType::Boolean) .required(false) @@ -80,6 +80,7 @@ pub(crate) mod user { } } + let username_mc; if java { // insert the username into the database match add_minecraft(&db, &command.user.id, username).await { @@ -89,25 +90,30 @@ pub(crate) mod user { return format!("Failure to minecraft username {:?}", username); } } + username_mc = username.to_string(); } else { match get_minecraft_bedrock(username, &config.minecraft_mcprofile).await { None => { return format!("No UID found for {:?}", username); } - Some(x) => match add_minecraft_bedrock(&db, &command.user.id, &x.floodgateuid).await { - Ok(_) => {} - Err(e) => { - dbg!("{:?}", e); - return format!("Failure to minecraft UID {:?}", &x.floodgateuid); + Some(x) => { + match add_minecraft_bedrock(&db, &command.user.id, &x.floodgateuid).await { + Ok(_) => {} + Err(e) => { + dbg!("{:?}", e); + return format!("Failure to minecraft UID {:?}", &x.floodgateuid); + } } - }, + + username_mc = x.floodgateuid; + } } } // get a list of servers that the user is a member of if let Ok(servers) = get_servers(&db, &command.user.id).await { for server in servers { - whitelist_update(&vec![(username.to_string(), java)], &server.minecraft, &config.discord_token_minecraft).await; + whitelist_update(&vec![(username_mc.to_owned(), java)], &server.minecraft, &config.discord_token_minecraft).await; } } From a9d3af024ea16cc8f0db4acb42d4fdd2106e21b8 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Fri, 3 Jan 2025 19:58:00 +0000 Subject: [PATCH 22/24] feat: added some minor logging --- src/commands/minecraft.rs | 2 +- src/lib.rs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/commands/minecraft.rs b/src/commands/minecraft.rs index 5c7772e..83bb1e4 100644 --- a/src/commands/minecraft.rs +++ b/src/commands/minecraft.rs @@ -328,7 +328,7 @@ pub(crate) mod server { ID: {id} Online: {online} Info: {description} - Link: + Link: "#, name = &x.attributes.name, online = !x.attributes.is_suspended, diff --git a/src/lib.rs b/src/lib.rs index b5a0a4e..b32722b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -774,7 +774,8 @@ struct BodyDelete { } pub async fn whitelist_update(add: &Vec<(String, bool)>, server: &str, token: &str) { - let url_base = format!("http://panel.games.skynet.ie/api/client/servers/{server}"); + println!("Update whitelist for {}", server); + let url_base = format!("https://panel.games.skynet.ie/api/client/servers/{server}"); let bearer = format!("Bearer {token}"); for (name, java) in add { @@ -792,7 +793,8 @@ pub async fn whitelist_update(add: &Vec<(String, bool)>, server: &str, token: &s } pub async fn whitelist_wipe(server: &str, token: &str) { - let url_base = format!("http://panel.games.skynet.ie/api/client/servers/{server}"); + println!("Wiping whitelist for {}", server); + let url_base = format!("https://panel.games.skynet.ie/api/client/servers/{server}"); let bearer = format!("Bearer {token}"); // delete whitelist @@ -813,7 +815,8 @@ pub async fn whitelist_wipe(server: &str, token: &str) { } pub async fn server_information(server: &str, token: &str) -> Option { - let url_base = format!("http://panel.games.skynet.ie/api/client/servers/{server}"); + println!("Get server information for {}", server); + let url_base = format!("https://panel.games.skynet.ie/api/client/servers/{server}"); let bearer = format!("Bearer {token}"); get::(&format!("{url_base}/"), &bearer).await } From 0a4f5281a545281c11c68185836ded2c17453306 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Fri, 3 Jan 2025 21:01:27 +0000 Subject: [PATCH 23/24] fix: typo, always took users as being java --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index b32722b..b7894bf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -709,7 +709,7 @@ pub async fn update_server(server_id: &str, db: &Pool, g_id: &GuildId, c usernames.push((x, true)); } if let Some(x) = member.minecraft_uid { - usernames.push((x, true)); + usernames.push((x, false)); } } if !usernames.is_empty() { From 5fcc24a867c98be772eec8c6a65eddfbe52ab070 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Sun, 26 Jan 2025 20:06:46 +0000 Subject: [PATCH 24/24] feat: run teh data update every 10 min --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index b48d90b..12ae36e 100644 --- a/flake.nix +++ b/flake.nix @@ -119,7 +119,7 @@ # modify these scripts = { # every 20 min - "update_data" = "*:0,20,40"; + "update_data" = "*:0,10,20,30,40,50"; # groups are updated every hour, offset from teh ldap "update_users" = "*:05:00"; # minecraft stuff is updated at 5am