Merge pull request 'Automatically change server icon daily' (#33) from #32_rotating-server-icon into main
Reviewed-on: #33 Closes #32
This commit is contained in:
commit
87dd04e12f
16 changed files with 1507 additions and 22 deletions
12
.forgejo/workflows/check_lfs.yaml
Normal file
12
.forgejo/workflows/check_lfs.yaml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
on:
|
||||||
|
- pull_request
|
||||||
|
- push
|
||||||
|
- workflow_dispatch
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_lfs:
|
||||||
|
# nix/docker
|
||||||
|
runs-on: nix
|
||||||
|
steps:
|
||||||
|
- uses: https://github.com/MPLew-is/lfs-check-action@1
|
|
@ -7,3 +7,4 @@ fn_params_layout = "Compressed"
|
||||||
struct_lit_width = 0
|
struct_lit_width = 0
|
||||||
tab_spaces = 2
|
tab_spaces = 2
|
||||||
use_small_heuristics = "Max"
|
use_small_heuristics = "Max"
|
||||||
|
#imports_granularity="Crate"
|
6
.server-icons.toml
Normal file
6
.server-icons.toml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# this file controls the
|
||||||
|
|
||||||
|
[source]
|
||||||
|
repo = "https://forgejo.skynet.ie/Computer_Society/open-goverance"
|
||||||
|
directory = "Resources/Logo_Variants"
|
||||||
|
file = "_festivals.toml"
|
555
Cargo.lock
generated
555
Cargo.lock
generated
|
@ -1,6 +1,6 @@
|
||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 4
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "addr2line"
|
name = "addr2line"
|
||||||
|
@ -110,6 +110,12 @@ version = "1.0.93"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
|
checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "arrayref"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayvec"
|
name = "arrayvec"
|
||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
|
@ -383,6 +389,12 @@ version = "3.16.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytemuck"
|
||||||
|
version = "1.23.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "byteorder"
|
name = "byteorder"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
|
@ -449,6 +461,39 @@ dependencies = [
|
||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "color-eyre"
|
||||||
|
version = "0.6.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d"
|
||||||
|
dependencies = [
|
||||||
|
"backtrace",
|
||||||
|
"color-spantrace",
|
||||||
|
"eyre",
|
||||||
|
"indenter",
|
||||||
|
"once_cell",
|
||||||
|
"owo-colors",
|
||||||
|
"tracing-error",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "color-spantrace"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427"
|
||||||
|
dependencies = [
|
||||||
|
"once_cell",
|
||||||
|
"owo-colors",
|
||||||
|
"tracing-core",
|
||||||
|
"tracing-error",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "color_quant"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "concurrent-queue"
|
name = "concurrent-queue"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
|
@ -637,6 +682,12 @@ version = "2.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010"
|
checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "data-url"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8d7439c3735f405729d52c3fbbe4de140eaf938a1fe47d227c27f8254d4302a5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "der"
|
name = "der"
|
||||||
version = "0.7.9"
|
version = "0.7.9"
|
||||||
|
@ -790,6 +841,16 @@ dependencies = [
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "eyre"
|
||||||
|
version = "0.6.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
|
||||||
|
dependencies = [
|
||||||
|
"indenter",
|
||||||
|
"once_cell",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastrand"
|
name = "fastrand"
|
||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
|
@ -805,6 +866,15 @@ version = "2.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
|
checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fdeflate"
|
||||||
|
version = "0.3.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
|
||||||
|
dependencies = [
|
||||||
|
"simd-adler32",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flate2"
|
name = "flate2"
|
||||||
version = "1.0.33"
|
version = "1.0.33"
|
||||||
|
@ -815,6 +885,12 @@ dependencies = [
|
||||||
"miniz_oxide",
|
"miniz_oxide",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "float-cmp"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flume"
|
name = "flume"
|
||||||
version = "0.9.2"
|
version = "0.9.2"
|
||||||
|
@ -849,6 +925,27 @@ version = "0.1.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
|
checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fontconfig-parser"
|
||||||
|
version = "0.5.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646"
|
||||||
|
dependencies = [
|
||||||
|
"roxmltree 0.20.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fontdb"
|
||||||
|
version = "0.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ff20bef7942a72af07104346154a70a70b089c572e454b41bef6eb6cb10e9c06"
|
||||||
|
dependencies = [
|
||||||
|
"fontconfig-parser",
|
||||||
|
"log",
|
||||||
|
"memmap2",
|
||||||
|
"ttf-parser",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "foreign-types"
|
name = "foreign-types"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
|
@ -1063,6 +1160,16 @@ dependencies = [
|
||||||
"polyval",
|
"polyval",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gif"
|
||||||
|
version = "0.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"
|
||||||
|
dependencies = [
|
||||||
|
"color_quant",
|
||||||
|
"weezl",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gimli"
|
name = "gimli"
|
||||||
version = "0.31.0"
|
version = "0.31.0"
|
||||||
|
@ -1586,16 +1693,6 @@ dependencies = [
|
||||||
"syn 2.0.89",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "idna"
|
|
||||||
version = "0.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
|
|
||||||
dependencies = [
|
|
||||||
"unicode-bidi",
|
|
||||||
"unicode-normalization",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "idna"
|
name = "idna"
|
||||||
version = "1.0.3"
|
version = "1.0.3"
|
||||||
|
@ -1617,6 +1714,18 @@ dependencies = [
|
||||||
"icu_properties",
|
"icu_properties",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "imagesize"
|
||||||
|
version = "0.11.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b72ad49b554c1728b1e83254a1b1565aea4161e28dabbfa171fc15fe62299caf"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indenter"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
|
@ -1677,6 +1786,12 @@ version = "1.0.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jpeg-decoder"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "js-sys"
|
name = "js-sys"
|
||||||
version = "0.3.70"
|
version = "0.3.70"
|
||||||
|
@ -1686,6 +1801,24 @@ dependencies = [
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kurbo"
|
||||||
|
version = "0.8.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a53776d271cfb873b17c618af0298445c88afc52837f3e948fa3fafd131f449"
|
||||||
|
dependencies = [
|
||||||
|
"arrayvec",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kurbo"
|
||||||
|
version = "0.9.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b"
|
||||||
|
dependencies = [
|
||||||
|
"arrayvec",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kv-log-macro"
|
name = "kv-log-macro"
|
||||||
version = "1.0.7"
|
version = "1.0.7"
|
||||||
|
@ -1718,7 +1851,7 @@ dependencies = [
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"hostname",
|
"hostname",
|
||||||
"httpdate",
|
"httpdate",
|
||||||
"idna 1.0.3",
|
"idna",
|
||||||
"mime",
|
"mime",
|
||||||
"native-tls",
|
"native-tls",
|
||||||
"nom",
|
"nom",
|
||||||
|
@ -1843,6 +1976,15 @@ version = "2.7.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memmap2"
|
||||||
|
version = "0.5.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mime"
|
name = "mime"
|
||||||
version = "0.3.17"
|
version = "0.3.17"
|
||||||
|
@ -1872,6 +2014,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
|
checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"adler2",
|
"adler2",
|
||||||
|
"simd-adler32",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2031,6 +2174,12 @@ dependencies = [
|
||||||
"vcpkg",
|
"vcpkg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "owo-colors"
|
||||||
|
version = "4.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parking"
|
name = "parking"
|
||||||
version = "2.2.1"
|
version = "2.2.1"
|
||||||
|
@ -2075,6 +2224,12 @@ version = "2.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
|
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pico-args"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project"
|
name = "pin-project"
|
||||||
version = "1.1.7"
|
version = "1.1.7"
|
||||||
|
@ -2145,6 +2300,19 @@ version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
|
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "png"
|
||||||
|
version = "0.17.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 1.3.2",
|
||||||
|
"crc32fast",
|
||||||
|
"fdeflate",
|
||||||
|
"flate2",
|
||||||
|
"miniz_oxide",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "polling"
|
name = "polling"
|
||||||
version = "3.7.4"
|
version = "3.7.4"
|
||||||
|
@ -2339,6 +2507,12 @@ dependencies = [
|
||||||
"rand_core 0.5.1",
|
"rand_core 0.5.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rctree"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
|
@ -2435,6 +2609,34 @@ dependencies = [
|
||||||
"windows-registry",
|
"windows-registry",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "resvg"
|
||||||
|
version = "0.29.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "76888219c0881e22b0ceab06fddcfe83163cd81642bd60c7842387f9c968a72e"
|
||||||
|
dependencies = [
|
||||||
|
"gif",
|
||||||
|
"jpeg-decoder",
|
||||||
|
"log",
|
||||||
|
"pico-args",
|
||||||
|
"png",
|
||||||
|
"rgb",
|
||||||
|
"svgfilters",
|
||||||
|
"svgtypes 0.10.0",
|
||||||
|
"tiny-skia",
|
||||||
|
"usvg",
|
||||||
|
"usvg-text-layout",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rgb"
|
||||||
|
version = "0.8.50"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
|
||||||
|
dependencies = [
|
||||||
|
"bytemuck",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ring"
|
name = "ring"
|
||||||
version = "0.17.8"
|
version = "0.17.8"
|
||||||
|
@ -2450,6 +2652,34 @@ dependencies = [
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rosvgtree"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bdc23d1ace03d6b8153c7d16f0708cd80b61ee8e80304954803354e67e40d150"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"roxmltree 0.18.1",
|
||||||
|
"simplecss",
|
||||||
|
"siphasher",
|
||||||
|
"svgtypes 0.9.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "roxmltree"
|
||||||
|
version = "0.18.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "862340e351ce1b271a378ec53f304a5558f7db87f3769dc655a8f6ecbb68b302"
|
||||||
|
dependencies = [
|
||||||
|
"xmlparser",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "roxmltree"
|
||||||
|
version = "0.20.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rsa"
|
name = "rsa"
|
||||||
version = "0.9.6"
|
version = "0.9.6"
|
||||||
|
@ -2582,6 +2812,22 @@ dependencies = [
|
||||||
"untrusted",
|
"untrusted",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustybuzz"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "162bdf42e261bee271b3957691018634488084ef577dddeb6420a9684cab2a6a"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 1.3.2",
|
||||||
|
"bytemuck",
|
||||||
|
"smallvec",
|
||||||
|
"ttf-parser",
|
||||||
|
"unicode-bidi-mirroring",
|
||||||
|
"unicode-ccc",
|
||||||
|
"unicode-general-category",
|
||||||
|
"unicode-script",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.18"
|
version = "1.0.18"
|
||||||
|
@ -2713,6 +2959,15 @@ dependencies = [
|
||||||
"thiserror 1.0.63",
|
"thiserror 1.0.63",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_spanned"
|
||||||
|
version = "0.6.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_urlencoded"
|
name = "serde_urlencoded"
|
||||||
version = "0.7.1"
|
version = "0.7.1"
|
||||||
|
@ -2806,6 +3061,15 @@ dependencies = [
|
||||||
"digest 0.10.7",
|
"digest 0.10.7",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sharded-slab"
|
||||||
|
version = "0.1.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shlex"
|
name = "shlex"
|
||||||
version = "1.3.0"
|
version = "1.3.0"
|
||||||
|
@ -2831,21 +3095,49 @@ dependencies = [
|
||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "simd-adler32"
|
||||||
|
version = "0.3.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "simplecss"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "siphasher"
|
||||||
|
version = "0.3.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "skynet_discord_bot"
|
name = "skynet_discord_bot"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
|
"color-eyre",
|
||||||
"dotenvy",
|
"dotenvy",
|
||||||
|
"eyre",
|
||||||
"lettre",
|
"lettre",
|
||||||
"maud",
|
"maud",
|
||||||
"rand 0.9.0",
|
"rand 0.9.0",
|
||||||
|
"resvg",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serenity",
|
"serenity",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
"surf",
|
"surf",
|
||||||
|
"tiny-skia",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"toml",
|
||||||
|
"usvg",
|
||||||
|
"usvg-text-layout",
|
||||||
"wolves_oxidised",
|
"wolves_oxidised",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3180,6 +3472,15 @@ version = "0.1.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
|
checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strict-num"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
|
||||||
|
dependencies = [
|
||||||
|
"float-cmp",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "stringprep"
|
name = "stringprep"
|
||||||
version = "0.1.5"
|
version = "0.1.5"
|
||||||
|
@ -3220,6 +3521,36 @@ dependencies = [
|
||||||
"web-sys",
|
"web-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "svgfilters"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "639abcebc15fdc2df179f37d6f5463d660c1c79cd552c12343a4600827a04bce"
|
||||||
|
dependencies = [
|
||||||
|
"float-cmp",
|
||||||
|
"rgb",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "svgtypes"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c9ee29c1407a5b18ccfe5f6ac82ac11bab3b14407e09c209a6c1a32098b19734"
|
||||||
|
dependencies = [
|
||||||
|
"kurbo 0.8.3",
|
||||||
|
"siphasher",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "svgtypes"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "98ffacedcdcf1da6579c907279b4f3c5492fbce99fbbf227f5ed270a589c2765"
|
||||||
|
dependencies = [
|
||||||
|
"kurbo 0.9.5",
|
||||||
|
"siphasher",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.109"
|
version = "1.0.109"
|
||||||
|
@ -3363,6 +3694,16 @@ dependencies = [
|
||||||
"syn 2.0.89",
|
"syn 2.0.89",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thread_local"
|
||||||
|
version = "1.1.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"once_cell",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time"
|
name = "time"
|
||||||
version = "0.2.27"
|
version = "0.2.27"
|
||||||
|
@ -3432,6 +3773,31 @@ dependencies = [
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tiny-skia"
|
||||||
|
version = "0.8.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67"
|
||||||
|
dependencies = [
|
||||||
|
"arrayref",
|
||||||
|
"arrayvec",
|
||||||
|
"bytemuck",
|
||||||
|
"cfg-if",
|
||||||
|
"png",
|
||||||
|
"tiny-skia-path",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tiny-skia-path"
|
||||||
|
version = "0.8.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c"
|
||||||
|
dependencies = [
|
||||||
|
"arrayref",
|
||||||
|
"bytemuck",
|
||||||
|
"strict-num",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tinystr"
|
name = "tinystr"
|
||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
|
@ -3581,6 +3947,47 @@ dependencies = [
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.8.23"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"toml_edit",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_datetime"
|
||||||
|
version = "0.6.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_edit"
|
||||||
|
version = "0.22.27"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"toml_write",
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_write"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-service"
|
name = "tower-service"
|
||||||
version = "0.3.3"
|
version = "0.3.3"
|
||||||
|
@ -3617,6 +4024,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
|
checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
"valuable",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tracing-error"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db"
|
||||||
|
dependencies = [
|
||||||
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3629,12 +4047,29 @@ dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tracing-subscriber"
|
||||||
|
version = "0.3.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
|
||||||
|
dependencies = [
|
||||||
|
"sharded-slab",
|
||||||
|
"thread_local",
|
||||||
|
"tracing-core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "try-lock"
|
name = "try-lock"
|
||||||
version = "0.2.5"
|
version = "0.2.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ttf-parser"
|
||||||
|
version = "0.18.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tungstenite"
|
name = "tungstenite"
|
||||||
version = "0.21.0"
|
version = "0.21.0"
|
||||||
|
@ -3683,6 +4118,24 @@ version = "0.3.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
|
checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-bidi-mirroring"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ccc"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-general-category"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.13"
|
version = "1.0.13"
|
||||||
|
@ -3704,6 +4157,18 @@ 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 = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524"
|
checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-script"
|
||||||
|
version = "0.5.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-vo"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "universal-hash"
|
name = "universal-hash"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
|
@ -3722,16 +4187,49 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "url"
|
name = "url"
|
||||||
version = "2.5.2"
|
version = "2.5.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
|
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"form_urlencoded",
|
"form_urlencoded",
|
||||||
"idna 0.5.0",
|
"idna",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "usvg"
|
||||||
|
version = "0.29.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "63b6bb4e62619d9f68aa2d8a823fea2bff302340a1f2d45c264d5b0be170832e"
|
||||||
|
dependencies = [
|
||||||
|
"base64 0.21.7",
|
||||||
|
"data-url",
|
||||||
|
"flate2",
|
||||||
|
"imagesize",
|
||||||
|
"kurbo 0.9.5",
|
||||||
|
"log",
|
||||||
|
"rctree",
|
||||||
|
"rosvgtree",
|
||||||
|
"strict-num",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "usvg-text-layout"
|
||||||
|
version = "0.29.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "195386e01bc35f860db024de275a76e7a31afdf975d18beb6d0e44764118b4db"
|
||||||
|
dependencies = [
|
||||||
|
"fontdb",
|
||||||
|
"kurbo 0.9.5",
|
||||||
|
"log",
|
||||||
|
"rustybuzz",
|
||||||
|
"unicode-bidi",
|
||||||
|
"unicode-script",
|
||||||
|
"unicode-vo",
|
||||||
|
"usvg",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf-8"
|
name = "utf-8"
|
||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
|
@ -3750,6 +4248,12 @@ version = "1.0.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "valuable"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "value-bag"
|
name = "value-bag"
|
||||||
version = "1.10.0"
|
version = "1.10.0"
|
||||||
|
@ -3915,6 +4419,12 @@ dependencies = [
|
||||||
"rustls-pki-types",
|
"rustls-pki-types",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "weezl"
|
||||||
|
version = "0.1.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "whoami"
|
name = "whoami"
|
||||||
version = "1.5.2"
|
version = "1.5.2"
|
||||||
|
@ -4144,6 +4654,15 @@ version = "0.52.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winnow"
|
||||||
|
version = "0.7.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winreg"
|
name = "winreg"
|
||||||
version = "0.50.0"
|
version = "0.50.0"
|
||||||
|
@ -4186,6 +4705,12 @@ version = "0.5.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
|
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xmlparser"
|
||||||
|
version = "0.13.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yoke"
|
name = "yoke"
|
||||||
version = "0.7.5"
|
version = "0.7.5"
|
||||||
|
|
12
Cargo.toml
12
Cargo.toml
|
@ -17,6 +17,9 @@ name = "update_committee"
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "update_minecraft"
|
name = "update_minecraft"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "update_server-icon"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# discord library
|
# discord library
|
||||||
serenity = { version = "0.12", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache"] }
|
serenity = { version = "0.12", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache"] }
|
||||||
|
@ -45,4 +48,13 @@ chrono = "0.4"
|
||||||
lettre = "0.11"
|
lettre = "0.11"
|
||||||
maud = "0.27"
|
maud = "0.27"
|
||||||
|
|
||||||
|
toml = "0.8.23"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
|
|
||||||
|
# for image conversion
|
||||||
|
eyre = "0.6.8"
|
||||||
|
color-eyre = "0.6.2"
|
||||||
|
usvg-text-layout = "0.29.0"
|
||||||
|
usvg = "0.29.0"
|
||||||
|
resvg = "0.29.0"
|
||||||
|
tiny-skia = "0.8.3"
|
9
db/migrations/11_server-icons.sql
Normal file
9
db/migrations/11_server-icons.sql
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS server_icons (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
path TEXT NOT NULL,
|
||||||
|
date TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS index_name ON server_icons (name);
|
12
flake.nix
12
flake.nix
|
@ -27,6 +27,8 @@
|
||||||
desc = "Skynet Discord Bot";
|
desc = "Skynet Discord Bot";
|
||||||
buildInputs = with pkgs; [
|
buildInputs = with pkgs; [
|
||||||
openssl
|
openssl
|
||||||
|
glib
|
||||||
|
gdk-pixbuf
|
||||||
pkg-config
|
pkg-config
|
||||||
rustfmt
|
rustfmt
|
||||||
];
|
];
|
||||||
|
@ -37,6 +39,10 @@
|
||||||
pname = "${package_name}";
|
pname = "${package_name}";
|
||||||
src = ./.;
|
src = ./.;
|
||||||
buildInputs = buildInputs;
|
buildInputs = buildInputs;
|
||||||
|
postInstall = ''
|
||||||
|
mkdir $out/config
|
||||||
|
cp .server-icons.toml $out/config
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
# Run `nix build .#fmt` to run tests
|
# Run `nix build .#fmt` to run tests
|
||||||
fmt = naersk'.buildPackage {
|
fmt = naersk'.buildPackage {
|
||||||
|
@ -63,9 +69,9 @@
|
||||||
|
|
||||||
# `nix develop`
|
# `nix develop`
|
||||||
devShell = pkgs.mkShell {
|
devShell = pkgs.mkShell {
|
||||||
nativeBuildInputs = with pkgs; [rustup rustPlatform.bindgenHook pkg-config openssl];
|
nativeBuildInputs = with pkgs; [rustup rustPlatform.bindgenHook];
|
||||||
# libraries here
|
# libraries here
|
||||||
buildInputs = [ ];
|
buildInputs = buildInputs;
|
||||||
RUSTC_VERSION = overrides.toolchain.channel;
|
RUSTC_VERSION = overrides.toolchain.channel;
|
||||||
# https://github.com/rust-lang/rust-bindgen#environment-variables
|
# https://github.com/rust-lang/rust-bindgen#environment-variables
|
||||||
shellHook = ''
|
shellHook = ''
|
||||||
|
@ -135,6 +141,8 @@
|
||||||
"update_committee" = "*:15:00";
|
"update_committee" = "*:15:00";
|
||||||
# minecraft stuff is updated at 5am
|
# minecraft stuff is updated at 5am
|
||||||
"update_minecraft" = "5:10:00";
|
"update_minecraft" = "5:10:00";
|
||||||
|
# server icon gets updated daily at midnight
|
||||||
|
"update_server-icon" = "0:01:00";
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
options.services."${package_name}" = {
|
options.services."${package_name}" = {
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
[toolchain]
|
[toolchain]
|
||||||
channel = "1.80"
|
channel = "1.87"
|
||||||
|
|
69
src/bin/update_server-icon.rs
Normal file
69
src/bin/update_server-icon.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
use serenity::{
|
||||||
|
async_trait,
|
||||||
|
client::{Context, EventHandler},
|
||||||
|
model::gateway::{GatewayIntents, Ready},
|
||||||
|
Client,
|
||||||
|
};
|
||||||
|
use skynet_discord_bot::common::server_icon::{get_config_icons, update_icon};
|
||||||
|
use skynet_discord_bot::{
|
||||||
|
common::database::{db_init, DataBase},
|
||||||
|
get_config, Config,
|
||||||
|
};
|
||||||
|
use std::{process, sync::Arc};
|
||||||
|
use tokio::sync::RwLock;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
let config = get_config();
|
||||||
|
let db = match db_init(&config).await {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(_) => return,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Intents are a bitflag, bitwise operations can be used to dictate which intents to use
|
||||||
|
let intents = GatewayIntents::GUILDS | GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT | GatewayIntents::GUILD_MEMBERS;
|
||||||
|
// Build our client.
|
||||||
|
let mut client = Client::builder(&config.discord_token, intents)
|
||||||
|
.event_handler(Handler {})
|
||||||
|
.await
|
||||||
|
.expect("Error creating client");
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut data = client.data.write().await;
|
||||||
|
|
||||||
|
data.insert::<Config>(Arc::new(RwLock::new(config)));
|
||||||
|
data.insert::<DataBase>(Arc::new(RwLock::new(db)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Err(why) = client.start().await {
|
||||||
|
println!("Client error: {:?}", why);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Handler;
|
||||||
|
#[async_trait]
|
||||||
|
impl EventHandler for Handler {
|
||||||
|
async fn ready(&self, ctx: Context, ready: Ready) {
|
||||||
|
let ctx = Arc::new(ctx);
|
||||||
|
println!("{} is connected!", ready.user.name);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
let config_lock = {
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
data_read.get::<Config>().expect("Expected Config in TypeMap.").clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
let config_global = config_lock.read().await;
|
||||||
|
let config_toml = get_config_icons::minimal();
|
||||||
|
|
||||||
|
update_icon::update_icon_main(&ctx, &db, &config_global, &config_toml).await;
|
||||||
|
|
||||||
|
// finish up
|
||||||
|
process::exit(0);
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,4 +20,8 @@ pub fn register() -> CreateCommand {
|
||||||
.add_sub_option(CreateCommandOption::new(CommandOptionType::Role, "role_c", "Sum of A and B").required(true))
|
.add_sub_option(CreateCommandOption::new(CommandOptionType::Role, "role_c", "Sum of A and B").required(true))
|
||||||
.add_sub_option(CreateCommandOption::new(CommandOptionType::Boolean, "delete", "Delete this entry.").required(false)),
|
.add_sub_option(CreateCommandOption::new(CommandOptionType::Boolean, "delete", "Delete this entry.").required(false)),
|
||||||
)
|
)
|
||||||
|
.add_option(
|
||||||
|
CreateCommandOption::new(CommandOptionType::SubCommandGroup, "icon", "Committee commands for the server icon")
|
||||||
|
.add_sub_option(CreateCommandOption::new(CommandOptionType::SubCommand, "change", "Change the server icon.")),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,4 +3,5 @@ pub mod committee;
|
||||||
pub mod count;
|
pub mod count;
|
||||||
pub mod minecraft;
|
pub mod minecraft;
|
||||||
pub mod role_adder;
|
pub mod role_adder;
|
||||||
|
pub mod server_icon;
|
||||||
pub mod wolves;
|
pub mod wolves;
|
||||||
|
|
224
src/commands/server_icon.rs
Normal file
224
src/commands/server_icon.rs
Normal file
|
@ -0,0 +1,224 @@
|
||||||
|
use serenity::all::{CommandInteraction, Context};
|
||||||
|
use skynet_discord_bot::{
|
||||||
|
common::{
|
||||||
|
database::DataBase,
|
||||||
|
server_icon::{get_config_icons, update_icon::update_icon_main, ServerIcons},
|
||||||
|
},
|
||||||
|
Config,
|
||||||
|
};
|
||||||
|
|
||||||
|
use serenity::all::{CommandOptionType, CreateCommand, CreateCommandOption};
|
||||||
|
|
||||||
|
// commands that server mods are able to use
|
||||||
|
pub(crate) mod admin {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
// Moderators can force a icon change
|
||||||
|
pub(crate) mod change {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String {
|
||||||
|
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 config_lock = {
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
data_read.get::<Config>().expect("Expected Config in TypeMap.").clone()
|
||||||
|
};
|
||||||
|
let config_global = config_lock.read().await;
|
||||||
|
|
||||||
|
let config_toml = get_config_icons::minimal();
|
||||||
|
update_icon_main(ctx, &db, &config_global, &config_toml).await;
|
||||||
|
|
||||||
|
"Changed server Icon".to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// commands for general users
|
||||||
|
pub(crate) mod user {
|
||||||
|
use super::*;
|
||||||
|
use skynet_discord_bot::common::server_icon::get_config_icons::ConfigTomlLocal;
|
||||||
|
|
||||||
|
pub fn register() -> CreateCommand {
|
||||||
|
CreateCommand::new("icon")
|
||||||
|
.description("Commands related to the Server Icon")
|
||||||
|
.add_option(
|
||||||
|
CreateCommandOption::new(CommandOptionType::SubCommandGroup, "current", "Information on current items.")
|
||||||
|
.add_sub_option(CreateCommandOption::new(CommandOptionType::SubCommand, "icon", "Information on current icon."))
|
||||||
|
.add_sub_option(CreateCommandOption::new(CommandOptionType::SubCommand, "festival", "Information on current festival.")),
|
||||||
|
)
|
||||||
|
.add_option(CreateCommandOption::new(CommandOptionType::SubCommand, "stats", "How many times the particular icon has been used"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_logo_url(config_toml: &ConfigTomlLocal, logo_name: &str) -> String {
|
||||||
|
format!("{}/src/branch/main/{}/{}", &config_toml.source.repo, &config_toml.source.directory, logo_name)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Regular users can get teh link to teh current icon
|
||||||
|
pub(crate) mod current {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
pub(crate) mod icon {
|
||||||
|
use super::*;
|
||||||
|
use serenity::all::{CreateAttachment, EditInteractionResponse};
|
||||||
|
|
||||||
|
use sqlx::{Pool, Sqlite};
|
||||||
|
|
||||||
|
pub async fn run(command: &CommandInteraction, ctx: &Context) -> String {
|
||||||
|
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 config_toml = get_config_icons::minimal();
|
||||||
|
|
||||||
|
if let Some(logo) = get_current_icon(&db).await {
|
||||||
|
if let Ok(attachment) = CreateAttachment::path(&logo.path).await {
|
||||||
|
match command.edit_response(&ctx.http, EditInteractionResponse::new().new_attachment(attachment)).await {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(e) => {
|
||||||
|
dbg!(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
format!("[{}]({})", &logo.name, get_logo_url(&config_toml, &logo.name))
|
||||||
|
} else {
|
||||||
|
"Could not find current icon".to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_current_icon(db: &Pool<Sqlite>) -> Option<ServerIcons> {
|
||||||
|
match sqlx::query_as::<_, ServerIcons>(
|
||||||
|
"
|
||||||
|
SELECT * from server_icons ORDER BY id DESC LIMIT 1
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.fetch_one(db)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(res) => Some(res),
|
||||||
|
Err(e) => {
|
||||||
|
dbg!(e);
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) mod festival {
|
||||||
|
use serenity::all::{CommandInteraction, Context};
|
||||||
|
use skynet_discord_bot::common::server_icon::{get_config_icons, update_icon::get_festival};
|
||||||
|
use skynet_discord_bot::Config;
|
||||||
|
|
||||||
|
// use this to return what current festivals are active?
|
||||||
|
pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String {
|
||||||
|
let config_lock = {
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
data_read.get::<Config>().expect("Expected Config in TypeMap.").clone()
|
||||||
|
};
|
||||||
|
let config = config_lock.read().await;
|
||||||
|
|
||||||
|
let config_toml = get_config_icons::full(&config);
|
||||||
|
|
||||||
|
let response = get_festival(&config_toml).current;
|
||||||
|
|
||||||
|
if response.is_empty() {
|
||||||
|
"No festival currently active".to_string()
|
||||||
|
} else {
|
||||||
|
format!("Festivals active: {}", response.join(", "))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the statistics of the icons
|
||||||
|
pub(crate) mod stats {
|
||||||
|
use super::*;
|
||||||
|
use sqlx::{Pool, Sqlite};
|
||||||
|
|
||||||
|
pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String {
|
||||||
|
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 config_toml = get_config_icons::minimal();
|
||||||
|
|
||||||
|
let totals = get_totals(&db).await;
|
||||||
|
|
||||||
|
fmt_msg(&config_toml, &totals)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, sqlx::FromRow)]
|
||||||
|
pub struct CountResult {
|
||||||
|
pub name: String,
|
||||||
|
pub times: i64,
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_totals(db: &Pool<Sqlite>) -> Vec<CountResult> {
|
||||||
|
sqlx::query_as::<_, CountResult>(
|
||||||
|
"
|
||||||
|
SELECT
|
||||||
|
DISTINCT name,
|
||||||
|
COUNT(*) OVER(PARTITION BY name) AS times
|
||||||
|
FROM server_icons
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.fetch_all(db)
|
||||||
|
.await
|
||||||
|
.unwrap_or_else(|e| {
|
||||||
|
dbg!(e);
|
||||||
|
vec![]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fmt_msg(config_toml: &ConfigTomlLocal, totals: &[CountResult]) -> String {
|
||||||
|
let mut totals_local = totals.to_owned();
|
||||||
|
totals_local.sort_by_key(|x| x.times);
|
||||||
|
totals_local.reverse();
|
||||||
|
|
||||||
|
// msg can be a max 2000 chars long
|
||||||
|
let mut limit = 2000 - 3;
|
||||||
|
|
||||||
|
let mut response = vec![];
|
||||||
|
for CountResult {
|
||||||
|
name,
|
||||||
|
times,
|
||||||
|
} in &totals_local
|
||||||
|
{
|
||||||
|
let current_leading = if times < &10 {
|
||||||
|
"00"
|
||||||
|
} else if times < &100 {
|
||||||
|
"0"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
|
|
||||||
|
let url = get_logo_url(config_toml, name);
|
||||||
|
|
||||||
|
// the `` is so that the numbers will be rendered in monospaced font
|
||||||
|
// the <> is to suppress the URL embed
|
||||||
|
let line = format!("``{}{}`` [{}](<{}>)", current_leading, times, name, url);
|
||||||
|
|
||||||
|
let length = line.len() + 1;
|
||||||
|
|
||||||
|
// +3 is to account for the closing fense
|
||||||
|
if length < (limit + 3) {
|
||||||
|
response.push(line);
|
||||||
|
limit -= length;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
response.join("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,3 +2,6 @@ pub mod database;
|
||||||
pub mod minecraft;
|
pub mod minecraft;
|
||||||
pub mod set_roles;
|
pub mod set_roles;
|
||||||
pub mod wolves;
|
pub mod wolves;
|
||||||
|
|
||||||
|
pub mod renderer;
|
||||||
|
pub mod server_icon;
|
||||||
|
|
192
src/common/renderer.rs
Normal file
192
src/common/renderer.rs
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
// this code is taken from https://github.com/MCorange99/svg2colored-png/tree/main
|
||||||
|
// I was unable to figure out how to use usvg myself so younked it from here.
|
||||||
|
|
||||||
|
use std::ffi::OsStr;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
// use clap::builder::OsStr;
|
||||||
|
use color_eyre::{eyre::bail, Result};
|
||||||
|
use usvg_text_layout::TreeTextToPath;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Args {
|
||||||
|
pub input: PathBuf,
|
||||||
|
|
||||||
|
/// Output folder where the PNG's will be placed
|
||||||
|
pub output: PathBuf,
|
||||||
|
|
||||||
|
/// Comma seperated colors that will be used in HEX Eg. 000000,ffffff
|
||||||
|
/// Can be like an object: black:000000,white:ffffff
|
||||||
|
pub colors: String,
|
||||||
|
|
||||||
|
/// Width of the generated PNG's
|
||||||
|
pub width: u32,
|
||||||
|
|
||||||
|
/// Height of the generated PNG's
|
||||||
|
pub height: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
enum ColorType {
|
||||||
|
Array(Vec<String>),
|
||||||
|
Object(Vec<(String, String)>),
|
||||||
|
None,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Renderer {
|
||||||
|
fontdb: usvg_text_layout::fontdb::Database,
|
||||||
|
colors: ColorType,
|
||||||
|
size: (u32, u32),
|
||||||
|
pub count: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Renderer {
|
||||||
|
pub fn new(args: &Args) -> Result<Self> {
|
||||||
|
let mut db = usvg_text_layout::fontdb::Database::new();
|
||||||
|
db.load_system_fonts();
|
||||||
|
|
||||||
|
let mut this = Self {
|
||||||
|
fontdb: db,
|
||||||
|
colors: ColorType::None,
|
||||||
|
size: (args.width, args.height),
|
||||||
|
count: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let colors = if args.colors.contains(':') {
|
||||||
|
//? object
|
||||||
|
let obj = args
|
||||||
|
.colors
|
||||||
|
.split(',')
|
||||||
|
.map(|s| {
|
||||||
|
let s = s.split(':').collect::<Vec<&str>>();
|
||||||
|
|
||||||
|
if s.len() < 2 {
|
||||||
|
dbg!("Invalid color object, try checking help");
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some((s[0].to_string(), s[1].to_string()))
|
||||||
|
})
|
||||||
|
.collect::<Vec<Option<(String, String)>>>();
|
||||||
|
|
||||||
|
let mut colors = Vec::new();
|
||||||
|
|
||||||
|
for c in obj.into_iter().flatten() {
|
||||||
|
std::fs::create_dir_all(args.output.join(&c.0))?;
|
||||||
|
|
||||||
|
colors.push(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorType::Object(colors)
|
||||||
|
} else {
|
||||||
|
//? list
|
||||||
|
// let colors = args.colors.split(",").map(|s| {
|
||||||
|
// s.to_string()
|
||||||
|
// })
|
||||||
|
// .collect::<Vec<String>>();
|
||||||
|
|
||||||
|
let mut colors = Vec::new();
|
||||||
|
|
||||||
|
for color in args.colors.split(',') {
|
||||||
|
std::fs::create_dir_all(args.output.join(color))?;
|
||||||
|
colors.push(color.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorType::Array(colors)
|
||||||
|
};
|
||||||
|
|
||||||
|
this.colors = colors;
|
||||||
|
Ok(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn render(&mut self, fi: &Path, args: &Args) -> Result<()> {
|
||||||
|
match fi.extension() {
|
||||||
|
Some(e) if e.to_str() == Some("svg") => {}
|
||||||
|
Some(_) | None => {
|
||||||
|
dbg!("Filer {:?} is not of type SVG", fi);
|
||||||
|
// util::logger::warning(format!("File '{}' is not of SVG type", fi.clone().to_str().unwrap()));
|
||||||
|
bail!("Failed to render");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
match self.colors.clone() {
|
||||||
|
ColorType::Array(c) => {
|
||||||
|
for color in c {
|
||||||
|
// log::info!("Rendering the color {color:?}");
|
||||||
|
let fo = self.get_out_file(fi, &color, args);
|
||||||
|
self.render_one(fi, &fo, &color)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ColorType::Object(c) => {
|
||||||
|
for o in c {
|
||||||
|
// log::info!("Rendering the color {:?}", o);
|
||||||
|
let fo = self.get_out_file(fi, &o.0, args);
|
||||||
|
self.render_one(fi, &fo, &o.1)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ColorType::None => unreachable!(),
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render_one(&mut self, fi: &Path, fo: &Path, color: &String) -> Result<()> {
|
||||||
|
if fo.exists() {
|
||||||
|
dbg!("File {fo:?} exists, skipping");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let svg = self.set_color(&self.get_svg_data(fi)?, color);
|
||||||
|
|
||||||
|
let opt = usvg::Options {
|
||||||
|
// Get file's absolute directory.
|
||||||
|
resources_dir: std::fs::canonicalize(fi).ok().and_then(|p| p.parent().map(|p| p.to_path_buf())),
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut tree = match usvg::Tree::from_data(svg.as_bytes(), &opt) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(_) => {
|
||||||
|
dbg!("Failed to parse {fi:?}");
|
||||||
|
bail!("");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
tree.convert_text(&self.fontdb);
|
||||||
|
|
||||||
|
let mut pixmap = tiny_skia::Pixmap::new(self.size.0, self.size.1).unwrap();
|
||||||
|
|
||||||
|
// log::info!("Rendering {fo:?}");
|
||||||
|
|
||||||
|
//? maybe handle this and possibly throw error if its none
|
||||||
|
let _ = resvg::render(&tree, usvg::FitTo::Size(self.size.0, self.size.1), tiny_skia::Transform::default(), pixmap.as_mut());
|
||||||
|
|
||||||
|
pixmap.save_png(fo)?;
|
||||||
|
self.count += 1;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn get_out_file(&mut self, fi: &Path, _sub_folder: &str, args: &Args) -> PathBuf {
|
||||||
|
let mut fo: std::path::PathBuf = args.output.clone();
|
||||||
|
// fo.push(sub_folder);
|
||||||
|
fo.push(fi.file_name().unwrap_or(OsStr::new("default")).to_str().unwrap_or("default").replace(".svg", ""));
|
||||||
|
fo.set_extension("png");
|
||||||
|
fo
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_color(&self, svg: &str, color: &String) -> String {
|
||||||
|
svg.replace("fill=\"currentColor\"", &format!("fill=\"#{}\"", color))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_svg_data(&self, fi: &Path) -> Result<String> {
|
||||||
|
match std::fs::read_to_string(fi) {
|
||||||
|
Ok(d) => Ok(d),
|
||||||
|
Err(_) => {
|
||||||
|
dbg!("File {fi:?} does not exist");
|
||||||
|
bail!("File {fi:?} does not exist");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
372
src/common/server_icon.rs
Normal file
372
src/common/server_icon.rs
Normal file
|
@ -0,0 +1,372 @@
|
||||||
|
use serde::Deserialize;
|
||||||
|
use std::{ffi::OsString, fs, path::PathBuf};
|
||||||
|
|
||||||
|
pub mod get_config_icons {
|
||||||
|
use super::*;
|
||||||
|
use crate::Config;
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct ConfigToml {
|
||||||
|
pub source: ConfigTomlSource,
|
||||||
|
pub festivals: Vec<ConfigTomlFestivals>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct ConfigTomlLocal {
|
||||||
|
pub source: ConfigTomlSource,
|
||||||
|
}
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct ConfigTomlRemote {
|
||||||
|
pub festivals: Vec<ConfigTomlFestivals>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct ConfigTomlSource {
|
||||||
|
pub repo: String,
|
||||||
|
pub directory: String,
|
||||||
|
pub file: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct ConfigTomlFestivals {
|
||||||
|
pub name: String,
|
||||||
|
pub all_year: bool,
|
||||||
|
pub start: ConfigTomlFestivalsTime,
|
||||||
|
pub end: ConfigTomlFestivalsTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct ConfigTomlFestivalsTime {
|
||||||
|
pub day: u32,
|
||||||
|
pub month: u32,
|
||||||
|
pub year: i32,
|
||||||
|
}
|
||||||
|
pub fn minimal() -> ConfigTomlLocal {
|
||||||
|
let toml_raw_min = include_str!("../../.server-icons.toml");
|
||||||
|
toml::from_str::<ConfigTomlLocal>(toml_raw_min).unwrap_or_else(|e| {
|
||||||
|
dbg!(e);
|
||||||
|
ConfigTomlLocal {
|
||||||
|
source: ConfigTomlSource {
|
||||||
|
repo: "".to_string(),
|
||||||
|
directory: "".to_string(),
|
||||||
|
file: "".to_string(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// since a copy of the festival file is in the repo we just need to get to it
|
||||||
|
pub fn full(config: &Config) -> ConfigToml {
|
||||||
|
let config_source = minimal();
|
||||||
|
|
||||||
|
let file_path = format!("{}/open-governance/{}/{}", &config.home, &config_source.source.directory, &config_source.source.file);
|
||||||
|
let contents = fs::read_to_string(file_path).unwrap_or_else(|e| {
|
||||||
|
dbg!(e);
|
||||||
|
"".to_string()
|
||||||
|
});
|
||||||
|
let festivals = match toml::from_str::<ConfigTomlRemote>(&contents) {
|
||||||
|
Ok(config_festivals) => config_festivals.festivals,
|
||||||
|
Err(e) => {
|
||||||
|
dbg!(e);
|
||||||
|
vec![]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ConfigToml {
|
||||||
|
source: config_source.source,
|
||||||
|
festivals,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct LogoData {
|
||||||
|
pub name: OsString,
|
||||||
|
pub path: PathBuf,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, sqlx::FromRow)]
|
||||||
|
pub struct ServerIcons {
|
||||||
|
pub id: i64,
|
||||||
|
pub name: String,
|
||||||
|
pub path: String,
|
||||||
|
pub date: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod update_icon {
|
||||||
|
use super::*;
|
||||||
|
use crate::{
|
||||||
|
common::{
|
||||||
|
renderer::{Args, Renderer},
|
||||||
|
server_icon::get_config_icons::{self, ConfigToml, ConfigTomlLocal},
|
||||||
|
},
|
||||||
|
get_now_iso, Config,
|
||||||
|
};
|
||||||
|
use chrono::{Datelike, Utc};
|
||||||
|
use rand::{rngs::SmallRng, seq::IndexedRandom, SeedableRng};
|
||||||
|
use serenity::{
|
||||||
|
all::GuildId,
|
||||||
|
builder::{CreateAttachment, EditGuild},
|
||||||
|
client::Context,
|
||||||
|
};
|
||||||
|
use sqlx::{Pool, Sqlite};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
/// Update the server icon, pulling from open governance.
|
||||||
|
pub async fn update_icon_main(ctx: &Context, db: &Pool<Sqlite>, config_global: &Config, config_toml_local: &ConfigTomlLocal) {
|
||||||
|
let server = GuildId::new(689189992417067052);
|
||||||
|
|
||||||
|
// clone repo into local folder
|
||||||
|
clone_repo(config_global, config_toml_local);
|
||||||
|
|
||||||
|
// now the repo has been downloaded/updated we can now access the festivals
|
||||||
|
let config_toml = get_config_icons::full(config_global);
|
||||||
|
|
||||||
|
// see if there is a current festival
|
||||||
|
let festival_data = get_festival(&config_toml);
|
||||||
|
|
||||||
|
// get a list of all the graphics files
|
||||||
|
let logos = get_logos(config_global, &config_toml);
|
||||||
|
|
||||||
|
// filter them so only the current season (if any) are active
|
||||||
|
let logos_filtered = logos_filter(&festival_data, logos);
|
||||||
|
|
||||||
|
let mut rng = SmallRng::from_os_rng();
|
||||||
|
let logo_selected = logos_filtered.choose(&mut rng).unwrap();
|
||||||
|
|
||||||
|
logo_set(ctx, db, &server, logo_selected).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct FestivalData {
|
||||||
|
pub current: Vec<String>,
|
||||||
|
exclusions: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_festival(config_toml: &ConfigToml) -> FestivalData {
|
||||||
|
let today = Utc::now();
|
||||||
|
let day = today.day();
|
||||||
|
let month = today.month();
|
||||||
|
let year = today.year();
|
||||||
|
|
||||||
|
let mut result = FestivalData {
|
||||||
|
current: vec![],
|
||||||
|
exclusions: vec![],
|
||||||
|
};
|
||||||
|
|
||||||
|
for festival in &config_toml.festivals {
|
||||||
|
if (day >= festival.start.day && day <= festival.end.day) && (month >= festival.start.month && month <= festival.end.month) {
|
||||||
|
if festival.start.year == 0 || festival.end.year == 0 || (year >= festival.start.year && year <= festival.end.year) {
|
||||||
|
result.current.push(festival.name.to_owned());
|
||||||
|
}
|
||||||
|
} else if !festival.all_year {
|
||||||
|
result.exclusions.push(festival.name.to_owned());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clone_repo(config: &Config, config_toml: &ConfigTomlLocal) {
|
||||||
|
let url = &config_toml.source.repo;
|
||||||
|
let folder = format!("{}/open-governance", &config.home);
|
||||||
|
|
||||||
|
if let Err(e) = Command::new("git")
|
||||||
|
// clone the repo, gracefully "fails"
|
||||||
|
.arg("clone")
|
||||||
|
.arg(url)
|
||||||
|
.arg(&folder)
|
||||||
|
.output()
|
||||||
|
{
|
||||||
|
dbg!(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Err(e) = Command::new("git")
|
||||||
|
// Update the repo
|
||||||
|
.arg("pull")
|
||||||
|
.arg("origin")
|
||||||
|
.arg("main")
|
||||||
|
.current_dir(&folder)
|
||||||
|
.output()
|
||||||
|
{
|
||||||
|
dbg!(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_logos(config: &Config, config_toml: &ConfigToml) -> Vec<LogoData> {
|
||||||
|
let folder = format!("{}/open-governance/{}", &config.home, &config_toml.source.directory);
|
||||||
|
let folder_path = PathBuf::from(&folder);
|
||||||
|
let mut folder_output = folder_path.clone();
|
||||||
|
folder_output.push("converted");
|
||||||
|
let paths = match fs::read_dir(folder) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(e) => {
|
||||||
|
dbg!(e);
|
||||||
|
return vec![];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let args = Args {
|
||||||
|
input: folder_path.clone(),
|
||||||
|
output: folder_output,
|
||||||
|
colors: String::from(""),
|
||||||
|
width: 1024,
|
||||||
|
height: 1024,
|
||||||
|
};
|
||||||
|
let mut r = match Renderer::new(&args) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(e) => {
|
||||||
|
let _ = dbg!(e);
|
||||||
|
return vec![];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut logos = vec![];
|
||||||
|
|
||||||
|
for tmp in paths.flatten() {
|
||||||
|
let path_local = tmp.path().to_owned();
|
||||||
|
let path_local2 = tmp.path().to_owned();
|
||||||
|
let name = match path_local2.file_name() {
|
||||||
|
None => {
|
||||||
|
dbg!(path_local2);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Some(x) => x.to_owned(),
|
||||||
|
};
|
||||||
|
let mut path = tmp.path();
|
||||||
|
|
||||||
|
if path.is_dir() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
match tmp.path().extension() {
|
||||||
|
None => {}
|
||||||
|
Some(ext) => {
|
||||||
|
if ext == "svg" {
|
||||||
|
let mut path_new = path_local.clone();
|
||||||
|
path_new.set_extension("png");
|
||||||
|
let filename_tmp = path_new.clone();
|
||||||
|
let filename = match filename_tmp.file_name() {
|
||||||
|
None => {
|
||||||
|
dbg!(filename_tmp);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Some(x) => x,
|
||||||
|
};
|
||||||
|
path_new.pop();
|
||||||
|
path_new.push("converted");
|
||||||
|
path_new.push(filename);
|
||||||
|
|
||||||
|
// check if exists
|
||||||
|
if !path_new.exists() {
|
||||||
|
// convert if it hasnt been converted already
|
||||||
|
match r.render(&path_local, &args) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(_e) => {
|
||||||
|
dbg!("Failed to render {path_local:?}: {}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
path = path_new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
logos.push(LogoData {
|
||||||
|
name,
|
||||||
|
path,
|
||||||
|
});
|
||||||
|
|
||||||
|
// println!("Name: {}", &tmp.path().display());
|
||||||
|
}
|
||||||
|
|
||||||
|
logos
|
||||||
|
}
|
||||||
|
|
||||||
|
fn logos_filter(festival_data: &FestivalData, existing: Vec<LogoData>) -> Vec<LogoData> {
|
||||||
|
let mut filtered: Vec<LogoData> = vec![];
|
||||||
|
|
||||||
|
'outer: for logo in existing {
|
||||||
|
let name_lowercase0 = logo.name.to_ascii_lowercase();
|
||||||
|
let name_lowercase = name_lowercase0.to_str().unwrap_or_default();
|
||||||
|
|
||||||
|
if !festival_data.current.is_empty() {
|
||||||
|
// if its a current festival filter based on it
|
||||||
|
for festival in &festival_data.current {
|
||||||
|
if name_lowercase.contains(festival) {
|
||||||
|
filtered.push(logo);
|
||||||
|
continue 'outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// else filter using the excluded ones
|
||||||
|
let mut excluded = false;
|
||||||
|
for festival in &festival_data.exclusions {
|
||||||
|
if name_lowercase.contains(festival) {
|
||||||
|
excluded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !excluded {
|
||||||
|
filtered.push(logo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filtered
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn logo_set(ctx: &Context, db: &Pool<Sqlite>, server: &GuildId, logo_selected: &LogoData) {
|
||||||
|
// add to teh database
|
||||||
|
if !logo_set_db(db, logo_selected).await {
|
||||||
|
// something went wrong
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(logo_path) = logo_selected.path.to_str() {
|
||||||
|
match CreateAttachment::path(logo_path).await {
|
||||||
|
Ok(icon) => {
|
||||||
|
// assuming a `guild` has already been bound
|
||||||
|
let builder = EditGuild::new().icon(Some(&icon));
|
||||||
|
if let Err(e) = server.edit(ctx, builder).await {
|
||||||
|
dbg!(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
dbg!(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn logo_set_db(db: &Pool<Sqlite>, logo_selected: &LogoData) -> bool {
|
||||||
|
let name = match logo_selected.name.to_str() {
|
||||||
|
None => return false,
|
||||||
|
Some(x) => x,
|
||||||
|
};
|
||||||
|
let path = match logo_selected.path.to_str() {
|
||||||
|
None => return false,
|
||||||
|
Some(x) => x,
|
||||||
|
};
|
||||||
|
|
||||||
|
match sqlx::query_as::<_, ServerIcons>(
|
||||||
|
"
|
||||||
|
INSERT OR REPLACE INTO server_icons (name, date, path)
|
||||||
|
VALUES (?1, ?2, ?3)
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.bind(name)
|
||||||
|
.bind(get_now_iso(false))
|
||||||
|
.bind(path)
|
||||||
|
.fetch_optional(db)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(e) => {
|
||||||
|
dbg!(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
51
src/main.rs
51
src/main.rs
|
@ -1,7 +1,9 @@
|
||||||
pub mod commands;
|
pub mod commands;
|
||||||
|
|
||||||
use crate::commands::role_adder::tools::on_role_change;
|
use crate::commands::role_adder::tools::on_role_change;
|
||||||
use serenity::all::{ActivityData, Command, CreateMessage, EditInteractionResponse, GuildId, GuildMemberUpdateEvent, Interaction};
|
use serenity::all::{
|
||||||
|
ActivityData, Command, CommandDataOptionValue, CreateMessage, EditInteractionResponse, GuildId, GuildMemberUpdateEvent, Interaction,
|
||||||
|
};
|
||||||
use serenity::model::guild::Member;
|
use serenity::model::guild::Member;
|
||||||
use serenity::{
|
use serenity::{
|
||||||
async_trait,
|
async_trait,
|
||||||
|
@ -129,6 +131,7 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inter-Committee server
|
||||||
match GuildId::new(1220150752656363520)
|
match GuildId::new(1220150752656363520)
|
||||||
.set_commands(&ctx.http, vec![commands::count::committee::register()])
|
.set_commands(&ctx.http, vec![commands::count::committee::register()])
|
||||||
.await
|
.await
|
||||||
|
@ -139,8 +142,16 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// compsoc Server
|
||||||
match GuildId::new(689189992417067052)
|
match GuildId::new(689189992417067052)
|
||||||
.set_commands(&ctx.http, vec![commands::count::servers::register()])
|
.set_commands(
|
||||||
|
&ctx.http,
|
||||||
|
vec![
|
||||||
|
// commands just for the compsoc server
|
||||||
|
commands::count::servers::register(),
|
||||||
|
commands::server_icon::user::register(),
|
||||||
|
],
|
||||||
|
)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
|
@ -175,6 +186,19 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
||||||
Some(x) => match x.name.as_str() {
|
Some(x) => match x.name.as_str() {
|
||||||
"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,
|
"roles_adder" => commands::role_adder::edit::run(&command, &ctx).await,
|
||||||
|
"icon" => match &x.value {
|
||||||
|
CommandDataOptionValue::SubCommandGroup(y) => match y.first() {
|
||||||
|
None => "error".to_string(),
|
||||||
|
Some(z) => match z.name.as_str() {
|
||||||
|
"change" => commands::server_icon::admin::change::run(&command, &ctx).await,
|
||||||
|
&_ => format!("not implemented :( count {}", x.name.as_str()),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
format!("not implemented :( committee {}", x.name.as_str())
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// TODO: move teh minecraft commands in here as a subgroup
|
||||||
// "link" => commands::count::servers::run(&command, &ctx).await,
|
// "link" => commands::count::servers::run(&command, &ctx).await,
|
||||||
&_ => format!("not implemented :( committee {}", x.name.as_str()),
|
&_ => format!("not implemented :( committee {}", x.name.as_str()),
|
||||||
},
|
},
|
||||||
|
@ -191,6 +215,29 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
||||||
&_ => format!("not implemented :( count {}", x.name.as_str()),
|
&_ => format!("not implemented :( count {}", x.name.as_str()),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"icon" => match command.data.options.first() {
|
||||||
|
None => "Invalid Command".to_string(),
|
||||||
|
Some(x) => match x.name.as_str() {
|
||||||
|
"current" => {
|
||||||
|
let result = match &x.value {
|
||||||
|
CommandDataOptionValue::SubCommandGroup(y) => match y.first() {
|
||||||
|
None => "error".to_string(),
|
||||||
|
Some(z) => match z.name.as_str() {
|
||||||
|
"icon" => commands::server_icon::user::current::icon::run(&command, &ctx).await,
|
||||||
|
"festival" => commands::server_icon::user::current::festival::run(&command, &ctx).await,
|
||||||
|
&_ => format!("not implemented :( count {}", x.name.as_str()),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&_ => format!("not implemented :( {}", command.data.name.as_str()),
|
||||||
|
};
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
"stats" => commands::server_icon::user::stats::run(&command, &ctx).await,
|
||||||
|
&_ => format!("not implemented :( count {}", x.name.as_str()),
|
||||||
|
},
|
||||||
|
},
|
||||||
_ => format!("not implemented :( {}", command.data.name.as_str()),
|
_ => format!("not implemented :( {}", command.data.name.as_str()),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue