Compare commits

...

5 Commits

10 changed files with 661 additions and 649 deletions

297
Cargo.lock generated
View File

@@ -663,12 +663,6 @@ dependencies = [
"shlex", "shlex",
] ]
[[package]]
name = "cesu8"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.4" version = "1.0.4"
@@ -1750,6 +1744,8 @@ dependencies = [
"time", "time",
"tokio", "tokio",
"tokio-util", "tokio-util",
"tokio-websockets 0.11.4",
"tokio-websockets 0.13.2",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
"twilight-gateway", "twilight-gateway",
@@ -2806,50 +2802,6 @@ dependencies = [
"jiff-tzdb", "jiff-tzdb",
] ]
[[package]]
name = "jni"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
dependencies = [
"cesu8",
"cfg-if",
"combine",
"jni-sys 0.3.1",
"log",
"thiserror 1.0.69",
"walkdir",
"windows-sys 0.45.0",
]
[[package]]
name = "jni-sys"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
dependencies = [
"jni-sys 0.4.1",
]
[[package]]
name = "jni-sys"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
dependencies = [
"jni-sys-macros",
]
[[package]]
name = "jni-sys-macros"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
dependencies = [
"quote",
"syn 2.0.111",
]
[[package]] [[package]]
name = "jobserver" name = "jobserver"
version = "0.1.34" version = "0.1.34"
@@ -3706,7 +3658,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]] [[package]]
name = "opendal" name = "opendal"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"ctor", "ctor",
"opendal-core", "opendal-core",
@@ -3752,7 +3704,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-core" name = "opendal-core"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64 0.22.1", "base64 0.22.1",
@@ -3768,7 +3720,7 @@ dependencies = [
"percent-encoding", "percent-encoding",
"quick-xml 0.38.4", "quick-xml 0.38.4",
"reqsign-core", "reqsign-core",
"reqwest 0.13.2", "reqwest",
"serde", "serde",
"serde_json", "serde_json",
"tokio", "tokio",
@@ -3780,7 +3732,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-layer-concurrent-limit" name = "opendal-layer-concurrent-limit"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"futures", "futures",
"http", "http",
@@ -3791,7 +3743,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-layer-logging" name = "opendal-layer-logging"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"log", "log",
"opendal-core", "opendal-core",
@@ -3800,7 +3752,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-layer-retry" name = "opendal-layer-retry"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"backon", "backon",
"log", "log",
@@ -3810,7 +3762,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-layer-timeout" name = "opendal-layer-timeout"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"opendal-core", "opendal-core",
"tokio", "tokio",
@@ -3819,7 +3771,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-aliyun-drive" name = "opendal-service-aliyun-drive"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -3833,7 +3785,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-alluxio" name = "opendal-service-alluxio"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -3846,7 +3798,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-azblob" name = "opendal-service-azblob"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"bytes", "bytes",
@@ -3866,7 +3818,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-azdls" name = "opendal-service-azdls"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -3884,7 +3836,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-azfile" name = "opendal-service-azfile"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -3901,7 +3853,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-azure-common" name = "opendal-service-azure-common"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"http", "http",
"opendal-core", "opendal-core",
@@ -3910,7 +3862,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-b2" name = "opendal-service-b2"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -3924,7 +3876,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-cacache" name = "opendal-service-cacache"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"cacache", "cacache",
@@ -3935,7 +3887,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-d1" name = "opendal-service-d1"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -3947,7 +3899,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-dashmap" name = "opendal-service-dashmap"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"dashmap 6.1.0", "dashmap 6.1.0",
"log", "log",
@@ -3958,7 +3910,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-dbfs" name = "opendal-service-dbfs"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"bytes", "bytes",
@@ -3972,7 +3924,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-dropbox" name = "opendal-service-dropbox"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -3985,7 +3937,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-etcd" name = "opendal-service-etcd"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"etcd-client", "etcd-client",
"fastpool", "fastpool",
@@ -3997,7 +3949,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-fs" name = "opendal-service-fs"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"log", "log",
@@ -4010,7 +3962,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-ftp" name = "opendal-service-ftp"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"fastpool", "fastpool",
@@ -4028,7 +3980,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-gcs" name = "opendal-service-gcs"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"bytes", "bytes",
@@ -4048,7 +4000,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-gdrive" name = "opendal-service-gdrive"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -4062,7 +4014,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-ghac" name = "opendal-service-ghac"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"ghac", "ghac",
@@ -4081,7 +4033,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-github" name = "opendal-service-github"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"bytes", "bytes",
@@ -4095,7 +4047,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-gridfs" name = "opendal-service-gridfs"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"futures", "futures",
"mea", "mea",
@@ -4107,7 +4059,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-hdfs-native" name = "opendal-service-hdfs-native"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures", "futures",
@@ -4120,7 +4072,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-ipmfs" name = "opendal-service-ipmfs"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -4133,7 +4085,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-mini-moka" name = "opendal-service-mini-moka"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"log", "log",
"mini-moka", "mini-moka",
@@ -4144,7 +4096,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-moka" name = "opendal-service-moka"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"log", "log",
"moka", "moka",
@@ -4155,7 +4107,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-mongodb" name = "opendal-service-mongodb"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"mea", "mea",
"mongodb", "mongodb",
@@ -4166,7 +4118,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-mysql" name = "opendal-service-mysql"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"mea", "mea",
"opendal-core", "opendal-core",
@@ -4177,7 +4129,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-pcloud" name = "opendal-service-pcloud"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@@ -4190,7 +4142,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-persy" name = "opendal-service-persy"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"opendal-core", "opendal-core",
"persy", "persy",
@@ -4200,7 +4152,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-postgresql" name = "opendal-service-postgresql"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"mea", "mea",
"opendal-core", "opendal-core",
@@ -4211,7 +4163,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-redb" name = "opendal-service-redb"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"opendal-core", "opendal-core",
"redb", "redb",
@@ -4221,7 +4173,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-redis" name = "opendal-service-redis"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"bytes", "bytes",
"fastpool", "fastpool",
@@ -4235,7 +4187,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-s3" name = "opendal-service-s3"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"bytes", "bytes",
@@ -4255,7 +4207,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-sled" name = "opendal-service-sled"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"opendal-core", "opendal-core",
"serde", "serde",
@@ -4265,7 +4217,7 @@ dependencies = [
[[package]] [[package]]
name = "opendal-service-webdav" name = "opendal-service-webdav"
version = "0.55.0" version = "0.55.0"
source = "git+https://github.com/apache/opendal#2f3b9807fcc7f5bd94edfd9a529be526b75ed459" source = "git+https://github.com/apache/opendal?rev=ecf840b04afd2be109830b9978ba89759adfee79#ecf840b04afd2be109830b9978ba89759adfee79"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@@ -4955,7 +4907,6 @@ version = "0.11.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31"
dependencies = [ dependencies = [
"aws-lc-rs",
"bytes", "bytes",
"getrandom 0.3.4", "getrandom 0.3.4",
"lru-slab", "lru-slab",
@@ -5369,49 +5320,11 @@ dependencies = [
"url", "url",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"wasm-streams 0.4.2", "wasm-streams",
"web-sys", "web-sys",
"webpki-roots 1.0.4", "webpki-roots 1.0.4",
] ]
[[package]]
name = "reqwest"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801"
dependencies = [
"base64 0.22.1",
"bytes",
"futures-core",
"futures-util",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
"hyper-util",
"js-sys",
"log",
"percent-encoding",
"pin-project-lite",
"quinn",
"rustls 0.23.35",
"rustls-pki-types",
"rustls-platform-verifier",
"sync_wrapper",
"tokio",
"tokio-rustls 0.26.4",
"tokio-util",
"tower",
"tower-http",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-streams 0.5.0",
"web-sys",
]
[[package]] [[package]]
name = "resolv-conf" name = "resolv-conf"
version = "0.7.6" version = "0.7.6"
@@ -5637,33 +5550,6 @@ dependencies = [
"zeroize", "zeroize",
] ]
[[package]]
name = "rustls-platform-verifier"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784"
dependencies = [
"core-foundation",
"core-foundation-sys",
"jni",
"log",
"once_cell",
"rustls 0.23.35",
"rustls-native-certs",
"rustls-platform-verifier-android",
"rustls-webpki 0.103.8",
"security-framework",
"security-framework-sys",
"webpki-root-certs",
"windows-sys 0.61.2",
]
[[package]]
name = "rustls-platform-verifier-android"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
[[package]] [[package]]
name = "rustls-webpki" name = "rustls-webpki"
version = "0.102.8" version = "0.102.8"
@@ -5974,7 +5860,7 @@ dependencies = [
"futures", "futures",
"mime_guess", "mime_guess",
"percent-encoding", "percent-encoding",
"reqwest 0.12.28", "reqwest",
"secrecy 0.8.0", "secrecy 0.8.0",
"serde", "serde",
"serde_cow", "serde_cow",
@@ -6237,7 +6123,7 @@ dependencies = [
"parking_lot 0.12.5", "parking_lot 0.12.5",
"pin-project", "pin-project",
"rand 0.9.2", "rand 0.9.2",
"reqwest 0.12.28", "reqwest",
"ringbuf", "ringbuf",
"rubato", "rubato",
"rusty_pool", "rusty_pool",
@@ -6522,7 +6408,7 @@ dependencies = [
"futures-util", "futures-util",
"hls_m3u8", "hls_m3u8",
"patricia_tree 0.8.0", "patricia_tree 0.8.0",
"reqwest 0.12.28", "reqwest",
"tokio", "tokio",
"tracing", "tracing",
"url", "url",
@@ -7013,6 +6899,7 @@ dependencies = [
"tokio", "tokio",
"tokio-rustls 0.26.4", "tokio-rustls 0.26.4",
"tokio-util", "tokio-util",
"webpki-roots 0.26.11",
] ]
[[package]] [[package]]
@@ -7726,19 +7613,6 @@ dependencies = [
"web-sys", "web-sys",
] ]
[[package]]
name = "wasm-streams"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb"
dependencies = [
"futures-util",
"js-sys",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
]
[[package]] [[package]]
name = "wasmparser" name = "wasmparser"
version = "0.244.0" version = "0.244.0"
@@ -7771,15 +7645,6 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "webpki-root-certs"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca"
dependencies = [
"rustls-pki-types",
]
[[package]] [[package]]
name = "webpki-roots" name = "webpki-roots"
version = "0.26.11" version = "0.26.11"
@@ -7956,15 +7821,6 @@ dependencies = [
"windows-link", "windows-link",
] ]
[[package]]
name = "windows-sys"
version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
dependencies = [
"windows-targets 0.42.2",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.48.0" version = "0.48.0"
@@ -8001,21 +7857,6 @@ dependencies = [
"windows-link", "windows-link",
] ]
[[package]]
name = "windows-targets"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
dependencies = [
"windows_aarch64_gnullvm 0.42.2",
"windows_aarch64_msvc 0.42.2",
"windows_i686_gnu 0.42.2",
"windows_i686_msvc 0.42.2",
"windows_x86_64_gnu 0.42.2",
"windows_x86_64_gnullvm 0.42.2",
"windows_x86_64_msvc 0.42.2",
]
[[package]] [[package]]
name = "windows-targets" name = "windows-targets"
version = "0.48.5" version = "0.48.5"
@@ -8073,12 +7914,6 @@ dependencies = [
"windows-link", "windows-link",
] ]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
[[package]] [[package]]
name = "windows_aarch64_gnullvm" name = "windows_aarch64_gnullvm"
version = "0.48.5" version = "0.48.5"
@@ -8097,12 +7932,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.48.5" version = "0.48.5"
@@ -8121,12 +7950,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
[[package]]
name = "windows_i686_gnu"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.48.5" version = "0.48.5"
@@ -8157,12 +7980,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
[[package]]
name = "windows_i686_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.48.5" version = "0.48.5"
@@ -8181,12 +7998,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.48.5" version = "0.48.5"
@@ -8205,12 +8016,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.48.5" version = "0.48.5"
@@ -8229,12 +8034,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.48.5" version = "0.48.5"

175
src/bot_data.rs Normal file
View File

@@ -0,0 +1,175 @@
use async_compression::futures::{bufread::BrotliDecoder, write::BrotliEncoder};
use capnp::message::TypedBuilder;
use futures::{AsyncReadExt, AsyncWriteExt};
use opendal::Operator;
use snafu::{ResultExt as _, Snafu};
use crate::{OperatorExt, bot_capnp, option_ext::OptionExt as _};
#[derive(Debug, Clone)]
pub struct BotDataManager {
operator: Operator,
}
impl BotDataManager {
pub fn new(operator: Operator) -> Self {
Self { operator }
}
}
const PATH: &str = "data.bin.brotli";
#[derive(Debug, Snafu)]
#[snafu(module)]
pub enum WithError {
/// couldn't read data for this bot from the storage operator
ReadError { source: opendal::Error },
/// couldn't decompress the bot data from storage
DecompressionError { source: std::io::Error },
/// couldn't deserialize the bot data
DeserializeError { source: capnp::Error },
}
impl BotDataManager {
pub async fn with<R>(
&self,
f: impl FnOnce(bot_capnp::bot::Reader<'_>) -> R,
) -> Result<R, WithError> {
let compressed_buffer = self
.operator
.async_reader_if_exists(PATH)
.await
.context(with_error::ReadSnafu)?;
let decompressed_reader = compressed_buffer.map(BrotliDecoder::new);
let decompressed = decompressed_reader
.map_async(|mut reader| async move {
let mut vec = Vec::new();
reader.read_to_end(&mut vec).await?;
Ok(vec)
})
.await
.transpose()
.context(with_error::DecompressionSnafu)?;
let mut message = TypedBuilder::<bot_capnp::bot::Owned>::new_default();
let fallback = message.init_root();
let mut bot_data = fallback.into_reader();
let message_reader;
if let Some(mut bytes) = decompressed.as_deref() {
message_reader = capnp::serialize::read_message_from_flat_slice_no_alloc(
&mut bytes,
Default::default(),
)
.context(with_error::DeserializeSnafu)?;
bot_data = message_reader
.get_root()
.context(with_error::DeserializeSnafu)?;
}
Ok(f(bot_data))
}
}
#[derive(Debug, Snafu)]
#[snafu(module)]
pub enum UpdateError {
/// couldn't read data for this bot from the storage operator
ReadError { source: opendal::Error },
/// couldn't decompress the bot data from storage
DecompressionError { source: std::io::Error },
/// couldn't deserialize the bot data
DeserializeError { source: capnp::Error },
/// couldn't serialize the (modified) bot data
SerializeError { source: capnp::Error },
/// couldn't create a writer for this bot data in the storage operator
WriterError { source: opendal::Error },
/// couldn't write (modified) data for this bot to the storage operator
WriteError { source: std::io::Error },
/// couldn't finalize writing (modified) data for this bot to the storage operator
FinalizeError { source: std::io::Error },
}
impl BotDataManager {
pub async fn update<R>(
&self,
f: impl FnOnce(bot_capnp::bot::Builder<'_>) -> R,
) -> Result<R, UpdateError> {
let compressed_buffer = self
.operator
.async_reader_if_exists(PATH)
.await
.context(update_error::ReadSnafu)?;
let decompressed_reader = compressed_buffer.map(BrotliDecoder::new);
let decompressed = decompressed_reader
.map_async(|mut reader| async move {
let mut vec = Vec::new();
reader.read_to_end(&mut vec).await?;
Ok(vec)
})
.await
.transpose()
.context(update_error::DecompressionSnafu)?;
let mut message = TypedBuilder::<bot_capnp::bot::Owned>::new_default();
let ret = if let Some(mut bytes) = decompressed.as_deref() {
let message_reader = capnp::serialize::read_message_from_flat_slice_no_alloc(
&mut bytes,
Default::default(),
)
.context(update_error::DeserializeSnafu)?;
let bot_data = message_reader
.get_root()
.context(update_error::DeserializeSnafu)?;
message
.set_root(bot_data)
.context(update_error::DeserializeSnafu)?;
f(
message.get_root().unwrap(), // this is logically impossible
)
} else {
f(message.init_root())
};
let mut buffer = Vec::new();
capnp::serialize::write_message(&mut buffer, message.borrow_inner())
.context(update_error::SerializeSnafu)?;
let compressed_writer = self
.operator
.writer(PATH)
.await
.context(update_error::WriterSnafu)?
.into_futures_async_write();
let mut decompressed_writer = BrotliEncoder::new(compressed_writer);
decompressed_writer
.write_all(&buffer)
.await
.context(update_error::WriteSnafu)?;
decompressed_writer
.close()
.await
.context(update_error::FinalizeSnafu)?;
Ok(ret)
}
}

View File

@@ -1,10 +1,6 @@
use std::sync::LazyLock; use futures::TryStreamExt;
use async_compression::futures::bufread::BrotliDecoder;
use capnp::message::ReaderOptions;
use futures::{AsyncReadExt, TryStreamExt};
use opendal::ErrorKind;
use snafu::{OptionExt, Snafu}; use snafu::{OptionExt, Snafu};
use std::sync::LazyLock;
use twilight_model::{ use twilight_model::{
application::{ application::{
command::{Command, CommandType}, command::{Command, CommandType},
@@ -20,11 +16,10 @@ use twilight_util::builder::{
embed::{EmbedAuthorBuilder, EmbedBuilder, EmbedFieldBuilder}, embed::{EmbedAuthorBuilder, EmbedBuilder, EmbedFieldBuilder},
}; };
use crate::{bot_capnp, command::State}; use crate::command::State;
const NAME: &str = "debug"; const NAME: &str = "info";
const DESCRIPTION: &str = const DESCRIPTION: &str = "Show various information";
"(Only the bot owner can use this) Show various information for debugging purposes";
pub static COMMAND: LazyLock<Command> = LazyLock::new(|| { pub static COMMAND: LazyLock<Command> = LazyLock::new(|| {
CommandBuilder::new(NAME, DESCRIPTION, CommandType::ChatInput) CommandBuilder::new(NAME, DESCRIPTION, CommandType::ChatInput)
@@ -114,54 +109,22 @@ pub async fn handle(state: State, interaction: Interaction) {
.await .await
.expect("TODO"); .expect("TODO");
let heat_script_description = { let heat_script_description = state
let compressed_result = state .bot_data_manager
.bot_data .with(|bot_data| {
.reader("data.bin.brotli") let heat_script_option = bot_data.has_heat_script().then(|| {
.await bot_data
.expect("TODO") .get_heat_script()
.into_futures_async_read(..) .expect("TODO")
.await; .to_string()
.expect("TODO")
let mut buf = Vec::default(); });
let mut message = capnp::message::TypedBuilder::<bot_capnp::bot::Owned>::new_default(); heat_script_option.map_or("none set yet".into(), |heat_script| {
let fallback = message.init_root(); format!("```\n{heat_script}\n```")
})
let message_reader;
let mut bot_data = fallback.into_reader();
match compressed_result {
Ok(compressed) => {
let mut decompressed = BrotliDecoder::new(compressed);
decompressed.read_to_end(&mut buf).await.expect("TODO");
message_reader =
capnp::serialize_packed::read_message(&*buf, ReaderOptions::default())
.expect("TODO");
bot_data = message_reader
.get_root::<bot_capnp::bot::Reader>()
.expect("TODO");
}
Err(error) if error.kind() == ErrorKind::NotFound => {
tracing::error!("TODO: proceeding with fallback");
}
Err(error) => {
tracing::error!(?error, "TODO");
return;
}
}
let heat_script_option = bot_data
.has_heat_script()
.then(|| bot_data.get_heat_script().expect("TODO"));
let heat_script_option =
heat_script_option.map(|heat_script| heat_script.to_str().expect("TODO"));
heat_script_option.map_or("none set yet".into(), |heat_script| {
format!("```\n{heat_script}\n```")
}) })
}; .await
.expect("TODO");
state state
.discord_client .discord_client

View File

@@ -1,8 +1,12 @@
use crate::{OneToManyUniqueBTreeMap, VCs, command::State}; use crate::{
OneToManyUniqueBTreeMap, UserDataManager, VCs, command::State, option_ext::OptionExt as _,
user_capnp::user::Consent, user_data::RECORD_IF_CONSENT_UNSPECIFIED,
};
use async_trait::async_trait; use async_trait::async_trait;
use futures::FutureExt;
use hound::{SampleFormat, WavSpec}; use hound::{SampleFormat, WavSpec};
use opendal::Operator; use opendal::Operator;
use snafu::{OptionExt, Snafu}; use snafu::{OptionExt as _, Snafu};
use songbird::{CoreEvent, Event, EventContext, EventHandler}; use songbird::{CoreEvent, Event, EventContext, EventHandler};
use std::{ use std::{
io::Cursor, io::Cursor,
@@ -104,6 +108,8 @@ struct Handler {
audio_channels: u16, audio_channels: u16,
audio_sample_rate: u32, audio_sample_rate: u32,
user_data_manager: UserDataManager,
} }
#[async_trait] #[async_trait]
@@ -134,6 +140,26 @@ impl EventHandler for Handler {
tracing::info!(?user_id); tracing::info!(?user_id);
if let Some(pcm) = &voice_data.decoded_voice { if let Some(pcm) = &voice_data.decoded_voice {
let may_record = user_id
.map_async(|user_id| {
self.user_data_manager
.with(user_id, |user_data| {
user_data.get_voice_recording_consent().unwrap()
})
.map(|result| result.expect("TODO"))
})
.await
.map_or(RECORD_IF_CONSENT_UNSPECIFIED, |consent| match consent {
Consent::Unspecified => RECORD_IF_CONSENT_UNSPECIFIED,
Consent::Granted => true,
Consent::Withheld => false,
});
if !may_record {
tracing::warn!(?user_id, "may not be recorded");
continue;
}
let elapsed = self.start_instant.elapsed(); let elapsed = self.start_instant.elapsed();
let elapsed = elapsed.try_into().expect("TODO"); let elapsed = elapsed.try_into().expect("TODO");
@@ -281,6 +307,8 @@ pub async fn handle(state: State, interaction: Interaction) {
audio_channels, audio_channels,
audio_sample_rate, audio_sample_rate,
user_data_manager: state.user_data_manager,
}; };
{ {
@@ -293,9 +321,17 @@ pub async fn handle(state: State, interaction: Interaction) {
} }
let channel_mention = format!("<#{voice_channel_id}>"); let channel_mention = format!("<#{voice_channel_id}>");
let bot_owner_mention = format!("<@{}>", state.discord_bot_owner_user_id); let bot_owner_mention = format!("<@{}>", state.discord_bot_owner_user_id);
let opt_in_mention = format!(
"</{}:{}>",
state.discord_opt_in_command_name, state.discord_opt_in_command_id
);
let opt_out_mention = format!(
"</{}:{}>",
state.discord_opt_out_command_name, state.discord_opt_out_command_id
);
state state
.discord_client .discord_client
.interaction(state.discord_application_id) .interaction(state.discord_application_id)
@@ -304,7 +340,7 @@ pub async fn handle(state: State, interaction: Interaction) {
).embeds(Some(&[ ).embeds(Some(&[
EmbedBuilder::new() EmbedBuilder::new()
.title("Joined VC to record") .title("Joined VC to record")
.description(format!("This bot joined {channel_mention} and intends to record. Here are some pledges backed by faith (because there is no way to verify them yourself) in {bot_owner_mention}:")) .description(format!("This bot joined {channel_mention} and intends to record. You can opt out with {opt_out_mention} or explicitly opt in with {opt_in_mention} (I'd appreciate this one). Here are some pledges backed by faith (because there is no way to verify them yourself) in {bot_owner_mention}:"))
.field( .field(
EmbedFieldBuilder::new("Recordings are never shared", "Audio recordings are only stored on my home server and desktop computer and will never be uploaded to services or hardware that is owned by another person: not even curated clips, and not even to people who were in the recording. When transcription to text is implemented, this will only be run on my personally owned devices and not on any internet or cloud offering.").build() EmbedFieldBuilder::new("Recordings are never shared", "Audio recordings are only stored on my home server and desktop computer and will never be uploaded to services or hardware that is owned by another person: not even curated clips, and not even to people who were in the recording. When transcription to text is implemented, this will only be run on my personally owned devices and not on any internet or cloud offering.").build()
) )

View File

@@ -12,27 +12,31 @@ use twilight_model::{
application::{command::Command, interaction::Interaction}, application::{command::Command, interaction::Interaction},
id::{ id::{
Id, Id,
marker::{ApplicationMarker, UserMarker}, marker::{ApplicationMarker, CommandMarker, UserMarker},
}, },
}; };
use crate::{GuildVoiceChannelToTextChannel, UserDataManager, VCs}; use crate::{BotDataManager, GuildVoiceChannelToTextChannel, UserDataManager, VCs};
mod debug; pub mod info;
mod join; pub mod join;
mod leave; pub mod leave;
mod opt_in; pub mod opt_in;
mod opt_out; pub mod opt_out;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct State { pub struct State {
pub audio_channels: Channels, pub audio_channels: Channels,
pub audio_sample_rate: SampleRate, pub audio_sample_rate: SampleRate,
pub bot_data: Operator, pub bot_data_manager: BotDataManager,
pub cancellation_token: CancellationToken, pub cancellation_token: CancellationToken,
pub discord_application_id: Id<ApplicationMarker>, pub discord_application_id: Id<ApplicationMarker>,
pub discord_bot_owner_user_id: Id<UserMarker>, pub discord_bot_owner_user_id: Id<UserMarker>,
pub discord_client: Arc<twilight_http::Client>, pub discord_client: Arc<twilight_http::Client>,
pub discord_opt_in_command_id: Id<CommandMarker>,
pub discord_opt_in_command_name: Arc<str>,
pub discord_opt_out_command_id: Id<CommandMarker>,
pub discord_opt_out_command_name: Arc<str>,
pub discord_user_id: Id<UserMarker>, pub discord_user_id: Id<UserMarker>,
pub discord_voice_channel_corresponding_text_channel: Arc<GuildVoiceChannelToTextChannel>, pub discord_voice_channel_corresponding_text_channel: Arc<GuildVoiceChannelToTextChannel>,
pub recording_data: Operator, pub recording_data: Operator,
@@ -54,7 +58,7 @@ where
pub fn all() -> Vec<(&'static Command, BoxedHandler)> { pub fn all() -> Vec<(&'static Command, BoxedHandler)> {
vec![ vec![
(&debug::COMMAND, box_handler(debug::handle)), (&info::COMMAND, box_handler(info::handle)),
(&join::COMMAND, box_handler(join::handle)), (&join::COMMAND, box_handler(join::handle)),
(&leave::COMMAND, box_handler(leave::handle)), (&leave::COMMAND, box_handler(leave::handle)),
(&opt_in::COMMAND, box_handler(opt_in::handle)), (&opt_in::COMMAND, box_handler(opt_in::handle)),

View File

@@ -5,6 +5,7 @@ use twilight_model::{
command::{Command, CommandType}, command::{Command, CommandType},
interaction::Interaction, interaction::Interaction,
}, },
channel::message::MessageFlags,
http::interaction::{InteractionResponse, InteractionResponseType}, http::interaction::{InteractionResponse, InteractionResponseType},
}; };
use twilight_util::builder::{InteractionResponseDataBuilder, command::CommandBuilder}; use twilight_util::builder::{InteractionResponseDataBuilder, command::CommandBuilder};
@@ -79,6 +80,7 @@ pub async fn handle(state: State, interaction: Interaction) {
.content(format!( .content(format!(
"opted you in, your previous consent was {previous_consent:?}" "opted you in, your previous consent was {previous_consent:?}"
)) ))
.flags(MessageFlags::EPHEMERAL)
.build(), .build(),
), ),
}, },

View File

@@ -5,6 +5,7 @@ use twilight_model::{
command::{Command, CommandType}, command::{Command, CommandType},
interaction::Interaction, interaction::Interaction,
}, },
channel::message::MessageFlags,
http::interaction::{InteractionResponse, InteractionResponseType}, http::interaction::{InteractionResponse, InteractionResponseType},
}; };
use twilight_util::builder::{InteractionResponseDataBuilder, command::CommandBuilder}; use twilight_util::builder::{InteractionResponseDataBuilder, command::CommandBuilder};
@@ -79,6 +80,7 @@ pub async fn handle(state: State, interaction: Interaction) {
.content(format!( .content(format!(
"opted you out, your previous consent was {previous_consent:?}" "opted you out, your previous consent was {previous_consent:?}"
)) ))
.flags(MessageFlags::EPHEMERAL)
.build(), .build(),
), ),
}, },

View File

@@ -1,4 +1,5 @@
mod command; mod bot_data;
pub mod command;
mod one_to_many; mod one_to_many;
mod one_to_many_with_data; mod one_to_many_with_data;
mod one_to_one; mod one_to_one;
@@ -11,6 +12,7 @@ mod vc_user;
capnp::generated_code!(mod bot_capnp); capnp::generated_code!(mod bot_capnp);
capnp::generated_code!(mod user_capnp); capnp::generated_code!(mod user_capnp);
pub use bot_data::BotDataManager;
pub use command::{Router as CommandRouter, State, all as all_commands}; pub use command::{Router as CommandRouter, State, all as all_commands};
pub use one_to_many::OneToManyUniqueBTreeMap; pub use one_to_many::OneToManyUniqueBTreeMap;
pub use one_to_many_with_data::OneToManyUniqueBTreeMapWithData; pub use one_to_many_with_data::OneToManyUniqueBTreeMapWithData;

View File

@@ -1,7 +1,7 @@
use clap::Parser; use clap::Parser;
use fomo_reducer::{ use fomo_reducer::{
CommandRouter, GuildVoiceChannelToTextChannel, State, Storage, UserDataManager, all_commands, BotDataManager, CommandRouter, GuildVoiceChannelToTextChannel, State, Storage, UserDataManager,
initialize_vcs, update_vcs, all_commands, command, initialize_vcs, update_vcs,
}; };
use secrecy::{ExposeSecret, SecretString}; use secrecy::{ExposeSecret, SecretString};
use snafu::{OptionExt, ResultExt, Snafu}; use snafu::{OptionExt, ResultExt, Snafu};
@@ -10,7 +10,7 @@ use songbird::{
driver::{Channels, DecodeConfig, SampleRate}, driver::{Channels, DecodeConfig, SampleRate},
shards::TwilightMap, shards::TwilightMap,
}; };
use std::{fmt::Debug, str::FromStr, sync::Arc}; use std::{collections::BTreeMap, fmt::Debug, str::FromStr, sync::Arc};
use strum::EnumString; use strum::EnumString;
use tokio::{select, signal::ctrl_c, task::JoinSet}; use tokio::{select, signal::ctrl_c, task::JoinSet};
use tokio_util::{sync::CancellationToken, time::FutureExt as _}; use tokio_util::{sync::CancellationToken, time::FutureExt as _};
@@ -275,7 +275,7 @@ async fn main() -> Result<(), MainError> {
let commands = all_commands(); let commands = all_commands();
let _returned_commands = interaction_client let returned_commands = interaction_client
.set_global_commands( .set_global_commands(
Vec::from_iter( Vec::from_iter(
commands commands
@@ -290,6 +290,25 @@ async fn main() -> Result<(), MainError> {
.await .await
.expect("failed to deserialize set commands"); // TODO .expect("failed to deserialize set commands"); // TODO
let mut discord_command_name_to_returned_command = BTreeMap::from_iter(
returned_commands
.into_iter()
.map(|command| (command.name.clone(), command)),
);
let discord_opt_in_command = discord_command_name_to_returned_command
.remove(&command::opt_in::COMMAND.name)
.expect("TODO");
let discord_opt_out_command = discord_command_name_to_returned_command
.remove(&command::opt_out::COMMAND.name)
.expect("TODO");
let discord_opt_in_command_id = discord_opt_in_command.id.expect("TODO");
let discord_opt_out_command_id = discord_opt_out_command.id.expect("TODO");
let discord_opt_in_command_name = discord_opt_in_command.name.into();
let discord_opt_out_command_name = discord_opt_out_command.name.into();
let vcs = initialize_vcs(&discord_client).await; let vcs = initialize_vcs(&discord_client).await;
let command_router = CommandRouter::from_iter(commands); let command_router = CommandRouter::from_iter(commands);
@@ -303,6 +322,7 @@ async fn main() -> Result<(), MainError> {
let recording_data = recording_data.into_inner(); let recording_data = recording_data.into_inner();
let user_data = user_data.into_inner(); let user_data = user_data.into_inner();
let bot_data_manager = BotDataManager::new(bot_data);
let user_data_manager = UserDataManager::new(user_data); let user_data_manager = UserDataManager::new(user_data);
let discord_voice_channel_corresponding_text_channel = { let discord_voice_channel_corresponding_text_channel = {
@@ -324,11 +344,15 @@ async fn main() -> Result<(), MainError> {
let state = State { let state = State {
audio_channels, audio_channels,
audio_sample_rate, audio_sample_rate,
bot_data, bot_data_manager,
cancellation_token: cancellation_token.clone(), cancellation_token: cancellation_token.clone(),
discord_application_id, discord_application_id,
discord_bot_owner_user_id, discord_bot_owner_user_id,
discord_client, discord_client,
discord_opt_in_command_id,
discord_opt_in_command_name,
discord_opt_out_command_id,
discord_opt_out_command_name,
discord_user_id, discord_user_id,
discord_voice_channel_corresponding_text_channel, discord_voice_channel_corresponding_text_channel,
recording_data, recording_data,

View File

@@ -1,7 +1,7 @@
use std::str::FromStr; use std::str::FromStr;
use async_compression::futures::{bufread::BrotliDecoder, write::BrotliEncoder}; use async_compression::futures::{bufread::BrotliDecoder, write::BrotliEncoder};
use capnp::message::{TypedBuilder, TypedReader}; use capnp::message::TypedBuilder;
use futures::{AsyncReadExt, AsyncWriteExt, TryStream, TryStreamExt}; use futures::{AsyncReadExt, AsyncWriteExt, TryStream, TryStreamExt};
use opendal::Operator; use opendal::Operator;
use snafu::{OptionExt as _, ResultExt as _, Snafu, ensure}; use snafu::{OptionExt as _, ResultExt as _, Snafu, ensure};
@@ -9,6 +9,8 @@ use twilight_model::id::{Id, marker::UserMarker};
use crate::{OperatorExt, option_ext::OptionExt as _, user_capnp}; use crate::{OperatorExt, option_ext::OptionExt as _, user_capnp};
pub const RECORD_IF_CONSENT_UNSPECIFIED: bool = true;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct UserDataManager { pub struct UserDataManager {
operator: Operator, operator: Operator,
@@ -242,7 +244,10 @@ impl UserDataManager {
.await .await
.context(update_error::WriteSnafu)?; .context(update_error::WriteSnafu)?;
decompressed_writer.close().await.context(update_error::FinalizeSnafu)?; decompressed_writer
.close()
.await
.context(update_error::FinalizeSnafu)?;
Ok(ret) Ok(ret)
} }