diff --git a/.gitignore b/.gitignore index 839f54b..acb7baf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ -# Intellij Idea -.idea -mixer_discord_bot.iml +.env # VSCode .vscode diff --git a/Cargo.lock b/Cargo.lock index 441133a..d472ec7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,15 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -67,6 +76,113 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", + "tokio", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite", + "log", + "parking", + "polling", + "rustix", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-lock" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + [[package]] name = "async-stream" version = "0.3.4" @@ -89,6 +205,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "async-task" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" + [[package]] name = "async-trait" version = "0.1.68" @@ -125,6 +247,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" + [[package]] name = "autocfg" version = "1.1.0" @@ -176,6 +304,21 @@ dependencies = [ "tower-service", ] +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.1", + "object", + "rustc-demangle", +] + [[package]] name = "bae" version = "0.1.7" @@ -233,6 +376,21 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +dependencies = [ + "async-channel", + "async-lock", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", + "log", +] + [[package]] name = "borsh" version = "0.10.3" @@ -349,6 +507,42 @@ dependencies = [ "winapi", ] +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "once_cell", + "textwrap", +] + +[[package]] +name = "clap_derive" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -365,6 +559,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "concurrent-queue" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "conv" version = "0.3.3" @@ -482,6 +685,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "custom_derive" version = "0.1.7" @@ -604,6 +817,34 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "entity" +version = "0.1.0" +dependencies = [ + "sea-orm", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -626,6 +867,15 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fdeflate" version = "0.3.0" @@ -737,6 +987,21 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + [[package]] name = "futures-macro" version = "0.3.27" @@ -822,6 +1087,24 @@ dependencies = [ "weezl", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "h2" version = "0.3.16" @@ -920,6 +1203,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -946,11 +1235,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -1114,7 +1403,7 @@ dependencies = [ "approx", "conv", "image", - "itertools", + "itertools 0.10.5", "nalgebra", "num", "rand 0.7.3", @@ -1142,6 +1431,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "ipnet" version = "2.7.2" @@ -1157,6 +1457,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.6" @@ -1195,6 +1504,15 @@ dependencies = [ "simple_asn1", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1209,9 +1527,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.141" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "link-cplusplus" @@ -1228,6 +1546,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "lock_api" version = "0.4.9" @@ -1245,6 +1569,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", + "value-bag", ] [[package]] @@ -1295,6 +1620,14 @@ dependencies = [ "autocfg", ] +[[package]] +name = "migration" +version = "0.1.0" +dependencies = [ + "async-std", + "sea-orm-migration", +] + [[package]] name = "mime" version = "0.3.17" @@ -1354,7 +1687,8 @@ version = "0.1.0" dependencies = [ "image", "imageproc", - "itertools", + "itertools 0.11.0", + "migration", "rusttype", "sea-orm", "serenity", @@ -1493,10 +1827,19 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.17.1" @@ -1603,6 +1946,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "os_str_bytes" +version = "6.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" + [[package]] name = "ouroboros" version = "0.15.6" @@ -1641,6 +1990,12 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "parking" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" + [[package]] name = "parking_lot" version = "0.11.2" @@ -1755,6 +2110,22 @@ dependencies = [ "miniz_oxide 0.7.1", ] +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1820,7 +2191,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea9b0f8cbe5e15a8a042d030bd96668db28ecb567ec37d691971ff5731d2b1b" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -2156,12 +2527,32 @@ dependencies = [ "serde_json", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hash" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustix" +version = "0.37.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8818fa822adcc98b18fedbb3632a6a33213c070556b5aa7c4c8cc21cff565c4c" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + [[package]] name = "rustls" version = "0.20.8" @@ -2193,7 +2584,7 @@ dependencies = [ "bitflags", "doc-comment", "finl_unicode", - "itertools", + "itertools 0.10.5", "lazy_static", "rustc-hash", "strsim", @@ -2281,6 +2672,22 @@ dependencies = [ "uuid", ] +[[package]] +name = "sea-orm-cli" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbf34a2caf70c2e3be9bb1e674e9540f6dfd7c8f40f6f05daf3b9740e476005" +dependencies = [ + "chrono", + "clap", + "dotenvy", + "regex", + "sea-schema", + "tracing", + "tracing-subscriber", + "url", +] + [[package]] name = "sea-orm-macros" version = "0.11.3" @@ -2294,6 +2701,23 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "sea-orm-migration" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278d3adfd0832b6ffc17d3cfbc574d3695a5c1b38814e0bc8ac238d33f3d87cf" +dependencies = [ + "async-trait", + "clap", + "dotenvy", + "futures", + "sea-orm", + "sea-orm-cli", + "sea-schema", + "tracing", + "tracing-subscriber", +] + [[package]] name = "sea-query" version = "0.28.3" @@ -2338,6 +2762,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sea-schema" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb2940bb5a10bc6cd05b450ce6cd3993e27fddd7eface2becb97fc5af3a040e" +dependencies = [ + "futures", + "sea-query", + "sea-schema-derive", +] + +[[package]] +name = "sea-schema-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56821b7076f5096b8f726e2791ad255a99c82498e08ec477a65a96c461ff1927" +dependencies = [ + "heck 0.3.3", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "sea-strum" version = "0.23.0" @@ -2421,9 +2868,9 @@ dependencies = [ [[package]] name = "serenity" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fd5e7b5858ad96e99d440138f34f5b98e1b959ebcd3a1036203b30e78eb788" +checksum = "d007dc45584ecc47e791f2a9a7cf17bf98ac386728106f111159c846d624be3f" dependencies = [ "async-trait", "async-tungstenite", @@ -2725,7 +3172,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" dependencies = [ - "itertools", + "itertools 0.10.5", "nom", "unicode_categories", ] @@ -2917,6 +3364,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + [[package]] name = "thiserror" version = "1.0.40" @@ -3002,11 +3455,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -3239,9 +3693,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ "matchers", "nu-ansi-term", @@ -3403,12 +3857,28 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "value-bag" +version = "1.0.0-alpha.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" +dependencies = [ + "ctor", + "version_check", +] + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "want" version = "0.3.0" diff --git a/Cargo.toml b/Cargo.toml index 585a653..6f01547 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ - "mixer-discord-bot" + "mixer-discord-bot", + "migration", ] default-members = ["mixer-discord-bot"] \ No newline at end of file diff --git a/migration/Cargo.toml b/migration/Cargo.toml new file mode 100644 index 0000000..575340c --- /dev/null +++ b/migration/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "migration" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +name = "migration" +path = "src/lib.rs" + +[dependencies] +async-std = { version = "1", features = ["attributes", "tokio1"] } + +[dependencies.sea-orm-migration] +version = "0.11.3" +features = [ + "runtime-tokio-rustls", + "sqlx-postgres", +] diff --git a/migration/README.md b/migration/README.md new file mode 100644 index 0000000..b3ea53e --- /dev/null +++ b/migration/README.md @@ -0,0 +1,41 @@ +# Running Migrator CLI + +- Generate a new migration file + ```sh + cargo run -- migrate generate MIGRATION_NAME + ``` +- Apply all pending migrations + ```sh + cargo run + ``` + ```sh + cargo run -- up + ``` +- Apply first 10 pending migrations + ```sh + cargo run -- up -n 10 + ``` +- Rollback last applied migrations + ```sh + cargo run -- down + ``` +- Rollback last 10 applied migrations + ```sh + cargo run -- down -n 10 + ``` +- Drop all tables from the database, then reapply all migrations + ```sh + cargo run -- fresh + ``` +- Rollback all applied migrations, then reapply all migrations + ```sh + cargo run -- refresh + ``` +- Rollback all applied migrations + ```sh + cargo run -- reset + ``` +- Check the status of all migrations + ```sh + cargo run -- status + ``` diff --git a/migration/src/lib.rs b/migration/src/lib.rs new file mode 100644 index 0000000..25d38a3 --- /dev/null +++ b/migration/src/lib.rs @@ -0,0 +1,20 @@ +pub use sea_orm_migration::prelude::*; + +mod m20230704_104934_create_guilds_table; +mod m20230704_111535_create_lobbies_table; +mod m20230704_112326_create_role_type; +mod m20230704_113006_create_players_table; + +pub struct Migrator; + +#[async_trait::async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec> { + vec![ + Box::new(m20230704_104934_create_guilds_table::Migration), + Box::new(m20230704_111535_create_lobbies_table::Migration), + Box::new(m20230704_112326_create_role_type::Migration), + Box::new(m20230704_113006_create_players_table::Migration), + ] + } +} diff --git a/migration/src/m20230704_104934_create_guilds_table.rs b/migration/src/m20230704_104934_create_guilds_table.rs new file mode 100644 index 0000000..a284f7f --- /dev/null +++ b/migration/src/m20230704_104934_create_guilds_table.rs @@ -0,0 +1,75 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(Guilds::Table) + .if_not_exists() + .col( + ColumnDef::new(Guilds::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col( + ColumnDef::new(Guilds::GuildId) + .big_unsigned() + .not_null() + .unique_key(), + ) + .col( + ColumnDef::new(Guilds::Verified) + .boolean() + .not_null() + .default(false), + ) + .to_owned(), + ) + .await?; + + manager + .create_index( + Index::create() + .if_not_exists() + .name("guilds_guild_id_idx") + .table(Guilds::Table) + .col(Guilds::GuildId) + .to_owned(), + ) + .await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_index( + Index::drop() + .table(Guilds::Table) + .name("guilds_guild_id_idx") + .to_owned(), + ) + .await?; + + manager + .drop_table(Table::drop().table(Guilds::Table).to_owned()) + .await?; + + Ok(()) + } +} + +#[derive(Iden)] +enum Guilds { + Table, + Id, + GuildId, + Verified, +} diff --git a/migration/src/m20230704_111535_create_lobbies_table.rs b/migration/src/m20230704_111535_create_lobbies_table.rs new file mode 100644 index 0000000..1ff71ab --- /dev/null +++ b/migration/src/m20230704_111535_create_lobbies_table.rs @@ -0,0 +1,140 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(Lobbies::Table) + .col( + ColumnDef::new(Lobbies::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(Lobbies::GuildId).big_unsigned().not_null()) + .col( + ColumnDef::new(Lobbies::MainVoiceId) + .big_unsigned() + .not_null(), + ) + .col( + ColumnDef::new(Lobbies::RedTeamVoiceId) + .big_unsigned() + .not_null(), + ) + .col( + ColumnDef::new(Lobbies::BlueTeamVoiceId) + .big_unsigned() + .not_null(), + ) + .to_owned(), + ) + .await?; + + manager + .create_index( + Index::create() + .if_not_exists() + .name("lobbies_guild_id_idx") + .table(Lobbies::Table) + .col(Lobbies::GuildId) + .to_owned(), + ) + .await?; + + manager + .create_index( + Index::create() + .if_not_exists() + .name("lobbies_main_voice_id_idx") + .table(Lobbies::Table) + .col(Lobbies::MainVoiceId) + .to_owned(), + ) + .await?; + + manager + .create_index( + Index::create() + .if_not_exists() + .name("lobbies_red_team_voice_id_idx") + .table(Lobbies::Table) + .col(Lobbies::RedTeamVoiceId) + .to_owned(), + ) + .await?; + + manager + .create_index( + Index::create() + .if_not_exists() + .name("lobbies_blue_team_voice_id_idx") + .table(Lobbies::Table) + .col(Lobbies::BlueTeamVoiceId) + .to_owned(), + ) + .await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_index( + Index::drop() + .name("lobbies_guild_id_idx") + .table(Lobbies::Table) + .to_owned(), + ) + .await?; + + manager + .drop_index( + Index::drop() + .name("lobbies_main_voice_id_idx") + .table(Lobbies::Table) + .to_owned(), + ) + .await?; + + manager + .drop_index( + Index::drop() + .name("lobbies_red_team_voice_id_idx") + .table(Lobbies::Table) + .to_owned(), + ) + .await?; + + manager + .drop_index( + Index::drop() + .name("lobbies_blue_team_voice_id_idx") + .table(Lobbies::Table) + .to_owned(), + ) + .await?; + + manager + .drop_table(Table::drop().table(Lobbies::Table).to_owned()) + .await?; + + Ok(()) + } +} + +#[derive(Iden)] +enum Lobbies { + Table, + Id, + GuildId, + MainVoiceId, + RedTeamVoiceId, + BlueTeamVoiceId, +} diff --git a/migration/src/m20230704_112326_create_role_type.rs b/migration/src/m20230704_112326_create_role_type.rs new file mode 100644 index 0000000..c6848cb --- /dev/null +++ b/migration/src/m20230704_112326_create_role_type.rs @@ -0,0 +1,37 @@ +use sea_orm::{EnumIter, Iterable}; +use sea_orm_migration::{prelude::*, sea_query::extension::postgres::Type}; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_type( + Type::create() + .as_enum(Role::Table) + .values(Role::iter().skip(1)) + .to_owned(), + ) + .await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_type(Type::drop().if_exists().name(Role::Table).to_owned()) + .await?; + + Ok(()) + } +} + +#[derive(Iden, EnumIter)] +enum Role { + Table, + Tank, + Dps, + Support, +} diff --git a/migration/src/m20230704_113006_create_players_table.rs b/migration/src/m20230704_113006_create_players_table.rs new file mode 100644 index 0000000..83f8cc8 --- /dev/null +++ b/migration/src/m20230704_113006_create_players_table.rs @@ -0,0 +1,147 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(Players::Table) + .col( + ColumnDef::new(Players::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col( + ColumnDef::new(Players::DiscordId) + .big_unsigned() + .not_null() + .unique_key(), + ) + .col(ColumnDef::new(Players::BnName).string()) + .col(ColumnDef::new(Players::BnTag).string()) + .col(ColumnDef::new(Players::LastPlayed).timestamp()) + .col( + ColumnDef::new(Players::TankRating) + .float() + .not_null() + .default(2500), + ) + .col( + ColumnDef::new(Players::TankRd) + .float() + .not_null() + .default(300), + ) + .col( + ColumnDef::new(Players::TankVolatility) + .float() + .not_null() + .default(0.06), + ) + .col( + ColumnDef::new(Players::DpsRating) + .float() + .not_null() + .default(2500), + ) + .col( + ColumnDef::new(Players::DpsRd) + .float() + .not_null() + .default(300), + ) + .col( + ColumnDef::new(Players::DpsVolatility) + .float() + .not_null() + .default(0.06), + ) + .col( + ColumnDef::new(Players::SupportRating) + .float() + .not_null() + .default(2500), + ) + .col( + ColumnDef::new(Players::SupportRd) + .float() + .not_null() + .default(300), + ) + .col( + ColumnDef::new(Players::SupportVolatility) + .float() + .not_null() + .default(0.06), + ) + .col( + ColumnDef::new(Players::Flex) + .boolean() + .not_null() + .default(true), + ) + .col(ColumnDef::new(Players::PrimaryRole).custom(Role)) + .col(ColumnDef::new(Players::SecondaryRole).custom(Role)) + .col(ColumnDef::new(Players::TertiaryRole).custom(Role)) + .to_owned(), + ) + .await?; + + manager + .create_index( + Index::create() + .if_not_exists() + .name("players_discord_id_idx") + .table(Players::Table) + .col(Players::DiscordId) + .to_owned(), + ) + .await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_index(Index::drop().name("players_discord_id_idx").to_owned()) + .await?; + + manager + .drop_table(Table::drop().table(Players::Table).to_owned()) + .await?; + + Ok(()) + } +} + +#[derive(Iden)] +enum Players { + Table, + Id, + DiscordId, + BnName, + BnTag, + LastPlayed, + TankRating, + TankRd, + TankVolatility, + DpsRating, + DpsRd, + DpsVolatility, + SupportRating, + SupportRd, + SupportVolatility, + Flex, + PrimaryRole, + SecondaryRole, + TertiaryRole, +} + +#[derive(Iden)] +struct Role; diff --git a/migration/src/main.rs b/migration/src/main.rs new file mode 100644 index 0000000..c6b6e48 --- /dev/null +++ b/migration/src/main.rs @@ -0,0 +1,6 @@ +use sea_orm_migration::prelude::*; + +#[async_std::main] +async fn main() { + cli::run_cli(migration::Migrator).await; +} diff --git a/mixer-discord-bot/Cargo.toml b/mixer-discord-bot/Cargo.toml index 2ebba91..6a061ef 100644 --- a/mixer-discord-bot/Cargo.toml +++ b/mixer-discord-bot/Cargo.toml @@ -4,7 +4,8 @@ version = "0.1.0" edition = "2021" [dependencies] -tokio = { version = "1.28.2", features = ["full"] } +migration = { path = "../migration" } + tracing = "0.1.37" serenity = {version = "0.11.5", default-features = false, features = ["rustls_backend", "client", "gateway", "model", "cache", "collector", "utils"] } sqlx = { version = "0.6.3", features = ["runtime-tokio-rustls", "postgres"] } diff --git a/mixer-discord-bot/schema.sql b/mixer-discord-bot/schema.sql deleted file mode 100644 index da41329..0000000 --- a/mixer-discord-bot/schema.sql +++ /dev/null @@ -1,91 +0,0 @@ --- DROP TABLE IF EXISTS players_test; --- DROP FUNCTION IF EXISTS rating_not_null; --- DROP TYPE rating; --- DROP TYPE IF EXISTS role; - - --- CREATE TYPE rating AS ( --- rating REAL, --- rd REAL, --- volatility REAL --- ); - --- CREATE OR REPLACE FUNCTION rating_not_null(r rating) RETURNS BOOLEAN AS $$ --- BEGIN --- RETURN (r.rating IS NOT NULL) AND (r.rd IS NOT NULL) AND (r.volatility IS NOT NULL); --- END; --- $$ LANGUAGE plpgsql; - --- CREATE TABLE players_test ( --- id SERIAL PRIMARY KEY, --- discord_id BIGINT NOT NULL, --- bn_name TEXT DEFAULT '', --- bn_tag TEXT DEFAULT '', - --- tank_rating rating NOT NULL DEFAULT (2500.0, 300.0, 0.06), --- dps_rating rating NOT NULL DEFAULT (2500.0, 300.0, 0.06), --- support_rating rating NOT NULL DEFAULT (2500.0, 300.0, 0.06), - --- flex BOOLEAN NOT NULL DEFAULT true, --- primary_role role, --- secondary_role role, --- tertiary_role role, --- UNIQUE (discord_id), --- CHECK ( --- rating_not_null(tank_rating) AND --- rating_not_null(dps_rating) AND --- rating_not_null(support_rating) --- ) --- ); - -DO $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'role') THEN - CREATE TYPE role AS ENUM ('tank', 'dps', 'support'); - END IF; -END$$; - -CREATE TABLE IF NOT EXISTS players ( - id SERIAL PRIMARY KEY, - discord_id BIGINT NOT NULL, - bn_name TEXT, - bn_tag TEXT, - last_played TIMESTAMP, - tank_rating REAL NOT NULL DEFAULT 2500.0, - tank_rd REAL NOT NULL DEFAULT 300, - tank_volatility REAL NOT NULL DEFAULT 0.06, - dps_rating REAL NOT NULL DEFAULT 2500.0, - dps_rd REAL NOT NULL DEFAULT 300, - dps_volatility REAL NOT NULL DEFAULT 0.06, - support_rating REAL NOT NULL DEFAULT 2500.0, - support_rd REAL NOT NULL DEFAULT 300, - support_volatility REAL NOT NULL DEFAULT 0.06, - flex BOOLEAN NOT NULL DEFAULT true, - primary_role role, - secondary_role role, - tertiary_role role, - UNIQUE (discord_id) -); - -CREATE TABLE IF NOT EXISTS guilds ( - id SERIAL PRIMARY KEY, - guild_id BIGINT NOT NULL, - verified BOOLEAN NOT NULL DEFAULT false, - - UNIQUE (guild_id) -); - -CREATE TABLE IF NOT EXISTS lobbies ( - id SERIAL PRIMARY KEY, - guild_id BIGINT NOT NULL, - main_voice_id BIGINT NOT NULL, - red_team_voice_id BIGINT NOT NULL, - blue_team_voice_id BIGINT NOT NULL -); - -CREATE INDEX IF NOT EXISTS players_discord_id_idx ON players (discord_id); -CREATE INDEX IF NOT EXISTS lobbies_guild_id_idx ON lobbies (guild_id); -CREATE INDEX IF NOT EXISTS lobbies_main_voice_id_idx ON lobbies (main_voice_id); -CREATE INDEX IF NOT EXISTS lobbies_red_team_voice_id_idx ON lobbies (red_team_voice_id); -CREATE INDEX IF NOT EXISTS lobbies_blue_team_voice_id_idx ON lobbies (blue_team_voice_id); -CREATE INDEX IF NOT EXISTS guilds_guild_id_idx ON guilds (guild_id); \ No newline at end of file diff --git a/mixer-discord-bot/src/main.rs b/mixer-discord-bot/src/main.rs index 6391858..4aa4638 100644 --- a/mixer-discord-bot/src/main.rs +++ b/mixer-discord-bot/src/main.rs @@ -6,13 +6,14 @@ mod mixer; use bot::commands::creator::CreatorCommand; use image_manipulation::{ImageGenerator, ImageGeneratorContainer}; +use migration::{Migrator, MigratorTrait}; use rusttype::Font; use serenity::model::prelude::UserId; use serenity::prelude::{GatewayIntents, TypeMapKey}; use serenity::Client; use shuttle_runtime::Context; use shuttle_secrets::SecretStore; -use sqlx::{Executor, PgPool}; +use sqlx::PgPool; use std::sync::Arc; use tokio::sync::RwLock; use tracing::log::info; @@ -46,8 +47,6 @@ async fn serenity( .get("DISCORD_APP_ID") .context("'DISCORD_APP_ID' was not found")?; - pool.execute(include_str!("../schema.sql")).await.unwrap(); - let mut bot = MixerBot::new(); bot.add_command(PingCommand); @@ -67,6 +66,9 @@ async fn serenity( let mut data = client.data.write().await; let db = MixerDatabase::new(pool); + Migrator::up(db.connection(), None) + .await + .expect("Could not run migrations"); data.insert::(Arc::new(RwLock::new(db))); let creator = UserId::from(