Replace log with tracing

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/51/head
trivernis 2 years ago
parent 0952e630ed
commit 2ffdd1c9f9
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

191
Cargo.lock generated

@ -38,6 +38,15 @@ dependencies = [
"thiserror", "thiserror",
] ]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "arrayvec" name = "arrayvec"
version = "0.4.12" version = "0.4.12"
@ -129,17 +138,6 @@ dependencies = [
"tungstenite 0.16.0", "tungstenite 0.16.0",
] ]
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi",
"libc",
"winapi",
]
[[package]] [[package]]
name = "audiopus" name = "audiopus"
version = "0.2.0" version = "0.2.0"
@ -332,17 +330,6 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "colored"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"
dependencies = [
"atty",
"lazy_static",
"winapi",
]
[[package]] [[package]]
name = "command_attr" name = "command_attr"
version = "0.3.8" version = "0.3.8"
@ -476,6 +463,17 @@ dependencies = [
"num_cpus", "num_cpus",
] ]
[[package]]
name = "dashmap"
version = "5.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c"
dependencies = [
"cfg-if 1.0.0",
"num_cpus",
"parking_lot 0.12.0",
]
[[package]] [[package]]
name = "derive_more" name = "derive_more"
version = "0.99.17" version = "0.99.17"
@ -603,15 +601,6 @@ dependencies = [
"instant", "instant",
] ]
[[package]]
name = "fern"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c9a4820f0ccc8a7afd67c39a0f1a0f4b07ca1725164271a64939d7aeb9af065"
dependencies = [
"log",
]
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.22" version = "1.0.22"
@ -1079,9 +1068,9 @@ checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.56" version = "0.3.57"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397"
dependencies = [ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
@ -1093,10 +1082,9 @@ source = "git+https://gitlab.com/vicky5124/lavalink-rs/?rev=2487c295#2487c2953c7
dependencies = [ dependencies = [
"async-trait", "async-trait",
"async-tungstenite 0.16.1", "async-tungstenite 0.16.1",
"dashmap", "dashmap 4.0.2",
"futures", "futures",
"http", "http",
"log",
"parking_lot 0.12.0", "parking_lot 0.12.0",
"regex", "regex",
"reqwest", "reqwest",
@ -1107,6 +1095,7 @@ dependencies = [
"songbird", "songbird",
"tokio", "tokio",
"tokio-native-tls", "tokio-native-tls",
"tracing",
"typemap_rev", "typemap_rev",
"version_check", "version_check",
] ]
@ -1119,9 +1108,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.121" version = "0.2.122"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" checksum = "ec647867e2bf0772e28c8bcde4f0d19a9216916e890543b5a03ed8ef27b8f259"
[[package]] [[package]]
name = "lock_api" name = "lock_api"
@ -1187,6 +1176,15 @@ dependencies = [
"xml5ever", "xml5ever",
] ]
[[package]]
name = "matchers"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
dependencies = [
"regex-automata",
]
[[package]] [[package]]
name = "matches" name = "matches"
version = "0.1.9" version = "0.1.9"
@ -1838,6 +1836,15 @@ dependencies = [
"regex-syntax", "regex-syntax",
] ]
[[package]]
name = "regex-automata"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
dependencies = [
"regex-syntax",
]
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.6.25" version = "0.6.25"
@ -1892,7 +1899,7 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"web-sys", "web-sys",
"webpki-roots 0.22.2", "webpki-roots 0.22.3",
"winreg", "winreg",
] ]
@ -2256,16 +2263,17 @@ dependencies = [
[[package]] [[package]]
name = "serenity-rich-interaction" name = "serenity-rich-interaction"
version = "0.2.6" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e9bc8919bb2b46d927f1810a47a030cfa62a720fe6ef33b68bbdbc39394fe001" checksum = "b7468dce50adc3f39e3fc65606cfe660148958b36d1f54454b845cbf710de02b"
dependencies = [ dependencies = [
"dashmap 5.2.0",
"futures", "futures",
"log",
"serde_json", "serde_json",
"serenity", "serenity",
"thiserror", "thiserror",
"tokio", "tokio",
"tracing",
] ]
[[package]] [[package]]
@ -2304,6 +2312,15 @@ dependencies = [
"opaque-debug", "opaque-debug",
] ]
[[package]]
name = "sharded-slab"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
dependencies = [
"lazy_static",
]
[[package]] [[package]]
name = "signal-hook-registry" name = "signal-hook-registry"
version = "1.4.0" version = "1.4.0"
@ -2351,7 +2368,7 @@ dependencies = [
"async-tungstenite 0.14.0", "async-tungstenite 0.14.0",
"audiopus", "audiopus",
"byteorder", "byteorder",
"dashmap", "dashmap 4.0.2",
"discortp", "discortp",
"flume", "flume",
"futures", "futures",
@ -2486,9 +2503,9 @@ dependencies = [
[[package]] [[package]]
name = "sysinfo" name = "sysinfo"
version = "0.23.8" version = "0.23.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad04c584871b8dceb769a20b94e26a357a870c999b7246dcd4cb233d927547e3" checksum = "b3fb8adaa82317f1e8a040281807f411803c9111303cfe129b4abb4a14b2c223"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"core-foundation-sys", "core-foundation-sys",
@ -2550,6 +2567,15 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "thread_local"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
dependencies = [
"once_cell",
]
[[package]] [[package]]
name = "time" name = "time"
version = "0.1.44" version = "0.1.44"
@ -2587,13 +2613,10 @@ dependencies = [
"build-time", "build-time",
"chrono", "chrono",
"chrono-tz", "chrono-tz",
"colored",
"dotenv", "dotenv",
"fern",
"futures", "futures",
"lavalink-rs", "lavalink-rs",
"lazy_static", "lazy_static",
"log",
"minecraft-data-rs", "minecraft-data-rs",
"rand 0.8.5", "rand 0.8.5",
"regex", "regex",
@ -2609,6 +2632,8 @@ dependencies = [
"sysinfo", "sysinfo",
"thiserror", "thiserror",
"tokio", "tokio",
"tracing",
"tracing-subscriber",
"trigram", "trigram",
"typemap_rev", "typemap_rev",
"xkcd-search", "xkcd-search",
@ -2725,9 +2750,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
[[package]] [[package]]
name = "tracing" name = "tracing"
version = "0.1.32" version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" checksum = "80b9fa4360528139bc96100c160b7ae879f5567f49f1782b0b02035b0358ebf3"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"log", "log",
@ -2754,6 +2779,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee" checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"valuable",
] ]
[[package]] [[package]]
@ -2766,6 +2792,35 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "tracing-log"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3"
dependencies = [
"lazy_static",
"log",
"tracing-core",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596"
dependencies = [
"ansi_term",
"lazy_static",
"matchers",
"regex",
"sharded-slab",
"smallvec",
"thread_local",
"tracing",
"tracing-core",
"tracing-log",
]
[[package]] [[package]]
name = "trigram" name = "trigram"
version = "0.4.4" version = "0.4.4"
@ -2957,6 +3012,12 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4bf03e0ca70d626ecc4ba6b0763b934b6f2976e8c744088bb3c1d646fbb1ad0" checksum = "f4bf03e0ca70d626ecc4ba6b0763b934b6f2976e8c744088bb3c1d646fbb1ad0"
[[package]]
name = "valuable"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]] [[package]]
name = "vcpkg" name = "vcpkg"
version = "0.2.15" version = "0.2.15"
@ -2999,9 +3060,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.79" version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"wasm-bindgen-macro", "wasm-bindgen-macro",
@ -3009,9 +3070,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.79" version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"lazy_static", "lazy_static",
@ -3024,9 +3085,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-futures" name = "wasm-bindgen-futures"
version = "0.4.29" version = "0.4.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"js-sys", "js-sys",
@ -3036,9 +3097,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.79" version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@ -3046,9 +3107,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.79" version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -3059,15 +3120,15 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.79" version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744"
[[package]] [[package]]
name = "web-sys" name = "web-sys"
version = "0.3.56" version = "0.3.57"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283"
dependencies = [ dependencies = [
"js-sys", "js-sys",
"wasm-bindgen", "wasm-bindgen",
@ -3113,9 +3174,9 @@ dependencies = [
[[package]] [[package]]
name = "webpki-roots" name = "webpki-roots"
version = "0.22.2" version = "0.22.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "552ceb903e957524388c4d3475725ff2c8b7960922063af6ce53c9a43da07449" checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf"
dependencies = [ dependencies = [
"webpki 0.22.0", "webpki 0.22.0",
] ]

@ -15,7 +15,6 @@ panic = 'abort'
[dependencies] [dependencies]
bot-database = {path="./bot-database"} bot-database = {path="./bot-database"}
bot-coreutils = {path="./bot-coreutils"} bot-coreutils = {path="./bot-coreutils"}
serenity-rich-interaction = "0.2.6"
serenity = "0.10.10" serenity = "0.10.10"
dotenv = "0.15.0" dotenv = "0.15.0"
serde_derive = "1.0.136" serde_derive = "1.0.136"
@ -29,10 +28,7 @@ regex = "1.5.5"
aspotify = "0.7.1" aspotify = "0.7.1"
lazy_static = "1.4.0" lazy_static = "1.4.0"
futures = "0.3.21" futures = "0.3.21"
log = "0.4.16"
fern = "0.6.0"
chrono = "0.4.19" chrono = "0.4.19"
colored = "2.0.0"
sysinfo = "0.23.8" sysinfo = "0.23.8"
reqwest = "0.11.10" reqwest = "0.11.10"
chrono-tz = "0.6.1" chrono-tz = "0.6.1"
@ -44,6 +40,11 @@ youtube-metadata = "0.2.0"
xkcd-search = "0.1.2" xkcd-search = "0.1.2"
animethemes-rs = "0.3.0" animethemes-rs = "0.3.0"
build-time = "0.1.1" build-time = "0.1.1"
tracing-subscriber = {version = "0.3.10", features = ["env-filter"] }
tracing = "0.1.32"
[dependencies.serenity-rich-interaction]
version = "0.3.0"
[dependencies.tokio] [dependencies.tokio]
version = "1.17.0" version = "1.17.0"
@ -52,5 +53,5 @@ features = ["macros", "rt-multi-thread"]
[dependencies.lavalink-rs] [dependencies.lavalink-rs]
git = "https://gitlab.com/vicky5124/lavalink-rs/" git = "https://gitlab.com/vicky5124/lavalink-rs/"
rev = "2487c295" rev = "2487c295"
features=["native", "serenity", "songbird", "normal-log"] features=["native", "serenity", "songbird", "tracing-log"]
default-features = false default-features = false

@ -102,7 +102,7 @@ async fn after_hook(ctx: &Context, msg: &Message, cmd_name: &str, error: Command
m.embed(|e| e.title("Error occurred").description(format!("{}", why))) m.embed(|e| e.title("Error occurred").description(format!("{}", why)))
}) })
.await; .await;
log::warn!("Error in {}: {:?}", cmd_name, why); tracing::warn!("Error in {}: {:?}", cmd_name, why);
} }
let database = get_database_from_context(ctx).await; let database = get_database_from_context(ctx).await;
let _ = database let _ = database
@ -118,7 +118,7 @@ async fn after_hook(ctx: &Context, msg: &Message, cmd_name: &str, error: Command
#[hook] #[hook]
async fn before_hook(ctx: &Context, msg: &Message, _: &str) -> bool { async fn before_hook(ctx: &Context, msg: &Message, _: &str) -> bool {
log::trace!("Got command message {}", msg.content); tracing::trace!("Got command message {}", msg.content);
let _ = msg.channel_id.broadcast_typing(ctx).await; let _ = msg.channel_id.broadcast_typing(ctx).await;
true true
} }

@ -16,7 +16,7 @@ pub(crate) async fn enchantment(ctx: &Context, msg: &Message, args: Args) -> Com
let data = ctx.data.read().await; let data = ctx.data.read().await;
let store = data.get::<Store>().expect("Failed to get store"); let store = data.get::<Store>().expect("Failed to get store");
let enchantment_name = args.message().to_lowercase(); let enchantment_name = args.message().to_lowercase();
log::debug!("Searching for enchantment {}", enchantment_name); tracing::debug!("Searching for enchantment {}", enchantment_name);
let enchantments_by_name = store let enchantments_by_name = store
.minecraft_data_api .minecraft_data_api
@ -29,7 +29,7 @@ pub(crate) async fn enchantment(ctx: &Context, msg: &Message, args: Args) -> Com
enchantment_name enchantment_name
)))? )))?
.clone(); .clone();
log::trace!("Enchantment is {:?}", enchantment); tracing::trace!("Enchantment is {:?}", enchantment);
msg.channel_id msg.channel_id
.send_message(ctx, |m| { .send_message(ctx, |m| {

@ -19,9 +19,9 @@ pub(crate) async fn item(ctx: &Context, msg: &Message, args: Args) -> CommandRes
let store = data.get::<Store>().expect("Failed to get store"); let store = data.get::<Store>().expect("Failed to get store");
let item_name = args.message().to_lowercase(); let item_name = args.message().to_lowercase();
log::debug!("Searching for item '{}'", item_name); tracing::debug!("Searching for item '{}'", item_name);
let information = get_item_full_information(&item_name, &store.minecraft_data_api)?; let information = get_item_full_information(&item_name, &store.minecraft_data_api)?;
log::trace!("Item full information is {:?}", information); tracing::trace!("Item full information is {:?}", information);
create_item_message(ctx, msg.channel_id, information).await?; create_item_message(ctx, msg.channel_id, information).await?;
handle_autodelete(ctx, msg).await?; handle_autodelete(ctx, msg).await?;

@ -17,17 +17,17 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
#[required_permissions("MANAGE_MESSAGES")] #[required_permissions("MANAGE_MESSAGES")]
async fn clear(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { async fn clear(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let limit = args.single::<u64>().unwrap_or(20); let limit = args.single::<u64>().unwrap_or(20);
log::debug!("Deleting messages for channel {}", msg.channel_id); tracing::debug!("Deleting messages for channel {}", msg.channel_id);
let messages = msg.channel_id.messages(ctx, |b| b.limit(limit)).await?; let messages = msg.channel_id.messages(ctx, |b| b.limit(limit)).await?;
log::debug!("Deleting {} messages", messages.len()); tracing::debug!("Deleting {} messages", messages.len());
let futures: Vec<BoxFuture<SerenityResult<()>>> = messages let futures: Vec<BoxFuture<SerenityResult<()>>> = messages
.into_iter() .into_iter()
.map(|m| async move { ctx.http.delete_message(m.channel_id.0, m.id.0).await }.boxed()) .map(|m| async move { ctx.http.delete_message(m.channel_id.0, m.id.0).await }.boxed())
.collect(); .collect();
log::debug!("Waiting for all messages to be deleted"); tracing::debug!("Waiting for all messages to be deleted");
let deleted = futures::future::join_all(futures).await; let deleted = futures::future::join_all(futures).await;
let deleted_count = deleted.into_iter().filter(|d| d.is_ok()).count(); let deleted_count = deleted.into_iter().filter(|d| d.is_ok()).count();
log::debug!("{} Messages deleted", deleted_count); tracing::debug!("{} Messages deleted", deleted_count);
EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |f| { EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |f| {
f.content(format!("Deleted {} messages", deleted_count)) f.content(format!("Deleted {} messages", deleted_count))

@ -17,7 +17,7 @@ static NOT_FOUND_PAIN: &str = "404";
#[max_args(1)] #[max_args(1)]
#[bucket("general")] #[bucket("general")]
async fn pain(ctx: &Context, msg: &Message, args: Args) -> CommandResult { async fn pain(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
log::debug!("Got pain command"); tracing::debug!("Got pain command");
let pain_type = args.message().to_lowercase(); let pain_type = args.message().to_lowercase();
let database = get_database_from_context(ctx).await; let database = get_database_from_context(ctx).await;
let mut media = database let mut media = database
@ -25,7 +25,7 @@ async fn pain(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
.await?; .await?;
if media.is_empty() { if media.is_empty() {
log::debug!("No media found for pain {}. Using 404", pain_type); tracing::debug!("No media found for pain {}. Using 404", pain_type);
media = database media = database
.get_media_by_category(format!("{}{}", CATEGORY_PREFIX, NOT_FOUND_PAIN)) .get_media_by_category(format!("{}{}", CATEGORY_PREFIX, NOT_FOUND_PAIN))
.await?; .await?;
@ -35,7 +35,7 @@ async fn pain(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
.into_iter() .into_iter()
.choose(&mut rand::thread_rng()) .choose(&mut rand::thread_rng())
.ok_or(BotError::from("No gifs found."))?; .ok_or(BotError::from("No gifs found."))?;
log::trace!("Gif for pain is {:?}", entry); tracing::trace!("Gif for pain is {:?}", entry);
msg.reply(ctx, entry.url).await?; msg.reply(ctx, entry.url).await?;
Ok(()) Ok(())

@ -15,7 +15,7 @@ use crate::commands::common::handle_autodelete;
#[owners_only] #[owners_only]
async fn shutdown(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { async fn shutdown(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let code = args.single::<i32>().unwrap_or(0); let code = args.single::<i32>().unwrap_or(0);
log::info!("Shutting down with code {}...", code); tracing::info!("Shutting down with code {}...", code);
msg.channel_id msg.channel_id
.say( .say(
ctx, ctx,

@ -16,7 +16,7 @@ use crate::utils::context_data::{get_database_from_context, MusicPlayers};
#[usage("")] #[usage("")]
#[bucket("general")] #[bucket("general")]
async fn stats(ctx: &Context, msg: &Message) -> CommandResult { async fn stats(ctx: &Context, msg: &Message) -> CommandResult {
log::debug!("Reading system stats"); tracing::debug!("Reading system stats");
let database = get_database_from_context(ctx).await; let database = get_database_from_context(ctx).await;
let mut system = sysinfo::System::new_all(); let mut system = sysinfo::System::new_all();
system.refresh_all(); system.refresh_all();
@ -56,7 +56,7 @@ async fn stats(ctx: &Context, msg: &Message) -> CommandResult {
total_commands_executed total_commands_executed
); );
log::trace!("Discord info {}", discord_info); tracing::trace!("Discord info {}", discord_info);
let system_info = format!( let system_info = format!(
r#" r#"
@ -74,7 +74,7 @@ async fn stats(ctx: &Context, msg: &Message) -> CommandResult {
uptime.num_hours() % 24, uptime.num_hours() % 24,
uptime.num_minutes() % 60 uptime.num_minutes() % 60
); );
log::trace!("System info {}", system_info); tracing::trace!("System info {}", system_info);
msg.channel_id msg.channel_id
.send_message(ctx, |m| { .send_message(ctx, |m| {

@ -18,7 +18,7 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
#[checks(DJ)] #[checks(DJ)]
async fn clear_queue(ctx: &Context, msg: &Message) -> CommandResult { async fn clear_queue(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Clearing queue for guild {}", guild.id); tracing::debug!("Clearing queue for guild {}", guild.id);
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {
player player

@ -17,7 +17,7 @@ use crate::messages::music::now_playing::create_now_playing_msg;
async fn current(ctx: &Context, msg: &Message) -> CommandResult { async fn current(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Displaying current song for queue in {}", guild.id); tracing::debug!("Displaying current song for queue in {}", guild.id);
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {
player player
} else { } else {

@ -19,7 +19,7 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
#[checks(DJ)] #[checks(DJ)]
async fn equalize(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { async fn equalize(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Changing equalizer for {}", guild.id); tracing::debug!("Changing equalizer for {}", guild.id);
let preset = args.single::<String>().unwrap(); let preset = args.single::<String>().unwrap();
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {

@ -16,7 +16,7 @@ use crate::messages::music::no_voicechannel::create_no_voicechannel_message;
#[checks(DJ)] #[checks(DJ)]
async fn equalizer(ctx: &Context, msg: &Message) -> CommandResult { async fn equalizer(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Displaying equalizer for guild {}", guild.id); tracing::debug!("Displaying equalizer for guild {}", guild.id);
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {
player player

@ -41,7 +41,7 @@ async fn join(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
.await?; .await?;
return Ok(()); return Ok(());
} }
log::debug!("Joining channel {} for guild {}", channel_id, guild.id); tracing::debug!("Joining channel {} for guild {}", channel_id, guild.id);
MusicPlayer::join(ctx, guild.id, channel_id, msg.channel_id).await?; MusicPlayer::join(ctx, guild.id, channel_id, msg.channel_id).await?;
EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |m| { EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |m| {
m.content("🎤 Joined the Voice Channel") m.content("🎤 Joined the Voice Channel")

@ -18,7 +18,7 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
#[checks(DJ)] #[checks(DJ)]
async fn leave(ctx: &Context, msg: &Message) -> CommandResult { async fn leave(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Leave request received for guild {}", guild.id); tracing::debug!("Leave request received for guild {}", guild.id);
let manager = songbird::get(ctx).await.unwrap(); let manager = songbird::get(ctx).await.unwrap();
if let Some(handler) = manager.get(guild.id) { if let Some(handler) = manager.get(guild.id) {

@ -14,7 +14,7 @@ use crate::messages::music::no_voicechannel::create_no_voicechannel_message;
#[bucket("general")] #[bucket("general")]
async fn lyrics(ctx: &Context, msg: &Message) -> CommandResult { async fn lyrics(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Fetching lyrics for song playing in {}", guild.id); tracing::debug!("Fetching lyrics for song playing in {}", guild.id);
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {
player player
@ -46,7 +46,7 @@ async fn lyrics(ctx: &Context, msg: &Message) -> CommandResult {
}) })
.await?; .await?;
} else { } else {
log::debug!("No lyrics found"); tracing::debug!("No lyrics found");
msg.channel_id.say(ctx, "No lyrics found").await?; msg.channel_id.say(ctx, "No lyrics found").await?;
} }

@ -126,23 +126,23 @@ async fn get_songs_for_query(ctx: &Context, msg: &Message, query: &str) -> BotRe
let store = data.get::<Store>().unwrap(); let store = data.get::<Store>().unwrap();
let database = data.get::<DatabaseContainer>().unwrap(); let database = data.get::<DatabaseContainer>().unwrap();
log::debug!("Querying play input {}", query); tracing::debug!("Querying play input {}", query);
if let Some(captures) = PLAYLIST_NAME_REGEX.captures(&query) { if let Some(captures) = PLAYLIST_NAME_REGEX.captures(&query) {
log::debug!("Query is a saved playlist"); tracing::debug!("Query is a saved playlist");
let pl_name: &str = captures.get(1).unwrap().as_str(); let pl_name: &str = captures.get(1).unwrap().as_str();
log::trace!("Playlist name is {}", pl_name); tracing::trace!("Playlist name is {}", pl_name);
let playlist_opt = database let playlist_opt = database
.get_guild_playlist(guild_id.0, pl_name.to_string()) .get_guild_playlist(guild_id.0, pl_name.to_string())
.await?; .await?;
log::trace!("Playlist is {:?}", playlist_opt); tracing::trace!("Playlist is {:?}", playlist_opt);
if let Some(playlist) = playlist_opt { if let Some(playlist) = playlist_opt {
log::debug!("Assigning url for saved playlist to query"); tracing::debug!("Assigning url for saved playlist to query");
query = playlist.url; query = playlist.url;
} }
} }
if YOUTUBE_URL_REGEX.is_match(&query) { if YOUTUBE_URL_REGEX.is_match(&query) {
log::debug!("Query is youtube video or playlist"); tracing::debug!("Query is youtube video or playlist");
// try fetching the url as a playlist // try fetching the url as a playlist
songs = youtube_dl::get_videos_for_playlist(&query) songs = youtube_dl::get_videos_for_playlist(&query)
.await? .await?
@ -152,18 +152,18 @@ async fn get_songs_for_query(ctx: &Context, msg: &Message, query: &str) -> BotRe
// if no songs were found fetch the song as a video // if no songs were found fetch the song as a video
if songs.len() == 0 { if songs.len() == 0 {
log::debug!("Query is youtube video"); tracing::debug!("Query is youtube video");
let mut song: Song = get_video_information(&query).await?.into(); let mut song: Song = get_video_information(&query).await?.into();
added_one_msg(&ctx, msg, &mut song).await?; added_one_msg(&ctx, msg, &mut song).await?;
add_youtube_song_to_database(&store, &database, &mut song).await?; add_youtube_song_to_database(&store, &database, &mut song).await?;
songs.push(song); songs.push(song);
} else { } else {
log::debug!("Query is playlist with {} songs", songs.len()); tracing::debug!("Query is playlist with {} songs", songs.len());
added_multiple_msg(&ctx, msg, &mut songs).await?; added_multiple_msg(&ctx, msg, &mut songs).await?;
} }
} else if SPOTIFY_PLAYLIST_REGEX.is_match(&query) { } else if SPOTIFY_PLAYLIST_REGEX.is_match(&query) {
// search for all songs in the playlist and search for them on youtube // search for all songs in the playlist and search for them on youtube
log::debug!("Query is spotify playlist"); tracing::debug!("Query is spotify playlist");
let tracks = store.spotify_api.get_songs_in_playlist(&query).await?; let tracks = store.spotify_api.get_songs_in_playlist(&query).await?;
let futures: Vec<BoxFuture<Song>> = tracks let futures: Vec<BoxFuture<Song>> = tracks
@ -183,7 +183,7 @@ async fn get_songs_for_query(ctx: &Context, msg: &Message, query: &str) -> BotRe
added_multiple_msg(&ctx, msg, &mut songs).await?; added_multiple_msg(&ctx, msg, &mut songs).await?;
} else if SPOTIFY_ALBUM_REGEX.is_match(&query) { } else if SPOTIFY_ALBUM_REGEX.is_match(&query) {
// fetch all songs in the album and search for them on youtube // fetch all songs in the album and search for them on youtube
log::debug!("Query is spotify album"); tracing::debug!("Query is spotify album");
let tracks = store.spotify_api.get_songs_in_album(&query).await?; let tracks = store.spotify_api.get_songs_in_album(&query).await?;
for track in tracks { for track in tracks {
@ -197,7 +197,7 @@ async fn get_songs_for_query(ctx: &Context, msg: &Message, query: &str) -> BotRe
added_multiple_msg(&ctx, msg, &mut songs).await?; added_multiple_msg(&ctx, msg, &mut songs).await?;
} else if SPOTIFY_SONG_REGEX.is_match(&query) { } else if SPOTIFY_SONG_REGEX.is_match(&query) {
// fetch the song name and search it on youtube // fetch the song name and search it on youtube
log::debug!("Query is a spotify song"); tracing::debug!("Query is a spotify song");
let track = store.spotify_api.get_track_for_url(&query).await?; let track = store.spotify_api.get_track_for_url(&query).await?;
let mut song = get_youtube_song_for_track(&database, track.clone()) let mut song = get_youtube_song_for_track(&database, track.clone())
.await? .await?
@ -205,12 +205,12 @@ async fn get_songs_for_query(ctx: &Context, msg: &Message, query: &str) -> BotRe
added_one_msg(ctx, msg, &mut song).await?; added_one_msg(ctx, msg, &mut song).await?;
songs.push(song); songs.push(song);
} else { } else {
log::debug!("Query is a youtube search"); tracing::debug!("Query is a youtube search");
let mut song: Song = youtube_dl::search_video_information(query.clone()) let mut song: Song = youtube_dl::search_video_information(query.clone())
.await? .await?
.ok_or(BotError::Msg(format!("Noting found for {}", query)))? .ok_or(BotError::Msg(format!("Noting found for {}", query)))?
.into(); .into();
log::trace!("Search result is {:?}", song); tracing::trace!("Search result is {:?}", song);
added_one_msg(&ctx, msg, &mut song).await?; added_one_msg(&ctx, msg, &mut song).await?;
songs.push(song); songs.push(song);
@ -291,24 +291,24 @@ pub async fn is_dj(ctx: &Context, guild: GuildId, user: &User) -> BotResult<bool
/// Searches for a matching youtube song for the given track in the local database /// Searches for a matching youtube song for the given track in the local database
async fn get_youtube_song_for_track(database: &Database, track: Track) -> BotResult<Option<Song>> { async fn get_youtube_song_for_track(database: &Database, track: Track) -> BotResult<Option<Song>> {
log::debug!("Trying to find track in database."); tracing::debug!("Trying to find track in database.");
if let Some(id) = track.id { if let Some(id) = track.id {
let entry = database.get_song(&id).await?; let entry = database.get_song(&id).await?;
if let Some(song) = entry { if let Some(song) = entry {
// check if the video is still available // check if the video is still available
log::trace!("Found entry is {:?}", song); tracing::trace!("Found entry is {:?}", song);
if let Ok(info) = get_video_information(&song.url).await { if let Ok(info) = get_video_information(&song.url).await {
return Ok(Some(info.into())); return Ok(Some(info.into()));
} else { } else {
log::debug!("Video '{}' is not available. Deleting entry", song.url); tracing::debug!("Video '{}' is not available. Deleting entry", song.url);
database.delete_song(song.id).await?; database.delete_song(song.id).await?;
return Ok(None); return Ok(None);
} }
} }
Ok(None) Ok(None)
} else { } else {
log::debug!("Track has no ID"); tracing::debug!("Track has no ID");
Ok(None) Ok(None)
} }
} }

@ -19,7 +19,7 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
#[checks(DJ)] #[checks(DJ)]
async fn move_song(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { async fn move_song(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Moving song for guild {}", guild.id); tracing::debug!("Moving song for guild {}", guild.id);
let pos1 = args.single::<usize>()?; let pos1 = args.single::<usize>()?;
let pos2 = args.single::<usize>()?; let pos2 = args.single::<usize>()?;

@ -17,7 +17,7 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
#[checks(DJ)] #[checks(DJ)]
async fn pause(ctx: &Context, msg: &Message) -> CommandResult { async fn pause(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Pausing playback for guild {}", guild.id); tracing::debug!("Pausing playback for guild {}", guild.id);
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {
player player
@ -33,14 +33,14 @@ async fn pause(ctx: &Context, msg: &Message) -> CommandResult {
let is_paused = player.is_paused(); let is_paused = player.is_paused();
if is_paused { if is_paused {
log::debug!("Paused"); tracing::debug!("Paused");
EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |m| { EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |m| {
m.content("⏸️ Paused playback") m.content("⏸️ Paused playback")
}) })
.await?; .await?;
player.update_now_playing().await?; player.update_now_playing().await?;
} else { } else {
log::debug!("Resumed"); tracing::debug!("Resumed");
EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |m| { EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |m| {
m.content("▶ Resumed playback") m.content("▶ Resumed playback")
}) })

@ -23,12 +23,12 @@ async fn play(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
let query = args.message(); let query = args.message();
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Play request received for guild {}", guild.id); tracing::debug!("Play request received for guild {}", guild.id);
let mut player = get_music_player_for_guild(ctx, guild.id).await; let mut player = get_music_player_for_guild(ctx, guild.id).await;
if player.is_none() { if player.is_none() {
log::debug!("Not in a channel. Joining authors channel..."); tracing::debug!("Not in a channel. Joining authors channel...");
let channel_id = get_channel_for_author(&msg.author.id, &guild)?; let channel_id = get_channel_for_author(&msg.author.id, &guild)?;
let music_player = MusicPlayer::join(ctx, guild.id, channel_id, msg.channel_id).await?; let music_player = MusicPlayer::join(ctx, guild.id, channel_id, msg.channel_id).await?;
player = Some(music_player); player = Some(music_player);
@ -37,7 +37,7 @@ async fn play(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
let songs = get_songs_for_query(&ctx, msg, query).await?; let songs = get_songs_for_query(&ctx, msg, query).await?;
let (play_first, create_now_playing) = { let (play_first, create_now_playing) = {
log::debug!("Adding song to queue"); tracing::debug!("Adding song to queue");
let mut player_lock = player.lock().await; let mut player_lock = player.lock().await;
for song in songs { for song in songs {
player_lock.queue().add(song); player_lock.queue().add(song);
@ -47,7 +47,7 @@ async fn play(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
.unwrap_or(false); .unwrap_or(false);
if autoshuffle { if autoshuffle {
log::debug!("Autoshuffeling"); tracing::debug!("Autoshuffeling");
player_lock.queue().shuffle(); player_lock.queue().shuffle();
} }
( (
@ -57,7 +57,7 @@ async fn play(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
}; };
if play_first { if play_first {
log::debug!("Playing first song in queue"); tracing::debug!("Playing first song in queue");
let mut player_lock = player.lock().await; let mut player_lock = player.lock().await;
player_lock.play_next().await?; player_lock.play_next().await?;
} }

@ -23,12 +23,12 @@ async fn play_next(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
let query = args.message(); let query = args.message();
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Playing song as next song for guild {}", guild.id); tracing::debug!("Playing song as next song for guild {}", guild.id);
let mut player = get_music_player_for_guild(ctx, guild.id).await; let mut player = get_music_player_for_guild(ctx, guild.id).await;
if player.is_none() { if player.is_none() {
log::debug!("Not in a channel. Joining authors channel..."); tracing::debug!("Not in a channel. Joining authors channel...");
let channel_id = get_channel_for_author(&msg.author.id, &guild)?; let channel_id = get_channel_for_author(&msg.author.id, &guild)?;
let music_player = MusicPlayer::join(ctx, guild.id, channel_id, msg.channel_id).await?; let music_player = MusicPlayer::join(ctx, guild.id, channel_id, msg.channel_id).await?;
player = Some(music_player); player = Some(music_player);
@ -40,7 +40,7 @@ async fn play_next(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
let (play_first, create_now_playing) = { let (play_first, create_now_playing) = {
let mut player_lock = player.lock().await; let mut player_lock = player.lock().await;
songs.reverse(); songs.reverse();
log::debug!("Enqueueing songs as next songs in the queue"); tracing::debug!("Enqueueing songs as next songs in the queue");
for song in songs { for song in songs {
player_lock.queue().add_next(song); player_lock.queue().add_next(song);

@ -13,7 +13,7 @@ use crate::utils::context_data::get_database_from_context;
#[bucket("general")] #[bucket("general")]
async fn playlists(ctx: &Context, msg: &Message) -> CommandResult { async fn playlists(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Displaying playlists for guild {}", guild.id); tracing::debug!("Displaying playlists for guild {}", guild.id);
let database = get_database_from_context(ctx).await; let database = get_database_from_context(ctx).await;
let playlists = database.get_guild_playlists(guild.id.0).await?; let playlists = database.get_guild_playlists(guild.id.0).await?;

@ -17,7 +17,7 @@ use crate::providers::music::queue::Song;
#[bucket("general")] #[bucket("general")]
async fn queue(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { async fn queue(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::trace!("Displaying queue for guild {}", guild.id); tracing::trace!("Displaying queue for guild {}", guild.id);
let query = args let query = args
.iter::<String>() .iter::<String>()
@ -53,7 +53,7 @@ async fn queue(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
}) })
.map(|(i, s)| (i, s.clone())) .map(|(i, s)| (i, s.clone()))
.collect(); .collect();
log::trace!("Songs are {:?}", songs); tracing::trace!("Songs are {:?}", songs);
if songs.len() == 0 { if songs.len() == 0 {
msg.channel_id msg.channel_id

@ -19,7 +19,7 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
#[checks(DJ)] #[checks(DJ)]
async fn remove_song(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { async fn remove_song(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Moving song for guild {}", guild.id); tracing::debug!("Moving song for guild {}", guild.id);
let pos = args.single::<usize>()?; let pos = args.single::<usize>()?;
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {

@ -20,7 +20,7 @@ async fn save_playlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandR
let name: String = args.single().unwrap(); let name: String = args.single().unwrap();
let url: &str = args.remains().unwrap(); let url: &str = args.remains().unwrap();
log::debug!( tracing::debug!(
"Adding playlist '{}' with url '{}' to guild {}", "Adding playlist '{}' with url '{}' to guild {}",
name, name,
url, url,

@ -19,7 +19,7 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
async fn shuffle(ctx: &Context, msg: &Message) -> CommandResult { async fn shuffle(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Shuffling queue for guild {}", guild.id); tracing::debug!("Shuffling queue for guild {}", guild.id);
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {
player player
} else { } else {

@ -18,7 +18,7 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
#[checks(DJ)] #[checks(DJ)]
async fn skip(ctx: &Context, msg: &Message) -> CommandResult { async fn skip(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Skipping song for guild {}", guild.id); tracing::debug!("Skipping song for guild {}", guild.id);
let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await {
player player

@ -18,10 +18,10 @@ use crate::utils::context_data::get_database_from_context;
async fn get(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { async fn get(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let database = get_database_from_context(ctx).await; let database = get_database_from_context(ctx).await;
let guild = msg.guild(&ctx.cache).await.unwrap(); let guild = msg.guild(&ctx.cache).await.unwrap();
log::debug!("Displaying guild setting for guild {}", guild.id); tracing::debug!("Displaying guild setting for guild {}", guild.id);
if let Some(key) = args.single::<String>().ok() { if let Some(key) = args.single::<String>().ok() {
log::debug!("Displaying guild setting of '{}'", key); tracing::debug!("Displaying guild setting of '{}'", key);
let setting = database let setting = database
.get_guild_setting::<String>(guild.id.0, key.clone()) .get_guild_setting::<String>(guild.id.0, key.clone())
.await?; .await?;
@ -39,7 +39,7 @@ async fn get(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
} }
} }
} else { } else {
log::debug!("Displaying all guild settings"); tracing::debug!("Displaying all guild settings");
let mut kv_pairs = Vec::new(); let mut kv_pairs = Vec::new();
for key in ALL_SETTINGS { for key in ALL_SETTINGS {

@ -43,7 +43,7 @@ async fn pekofy(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
return Err(CommandError::from("Can't pekofy empty message")); return Err(CommandError::from("Can't pekofy empty message"));
} }
log::debug!("Pekofying message '{}'", content); tracing::debug!("Pekofying message '{}'", content);
let mut alpha_lowercase = content.to_lowercase(); let mut alpha_lowercase = content.to_lowercase();
alpha_lowercase.retain(|c| c.is_alphanumeric()); alpha_lowercase.retain(|c| c.is_alphanumeric());
@ -64,7 +64,7 @@ async fn pekofy(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
.http .http
.get_message(msg.channel_id.0, reference_message.0) .get_message(msg.channel_id.0, reference_message.0)
.await?; .await?;
log::debug!("Pekofied message is '{}'", pekofied); tracing::debug!("Pekofied message is '{}'", pekofied);
message.reply(ctx, pekofied).await?; message.reply(ctx, pekofied).await?;
Ok(()) Ok(())
@ -73,7 +73,7 @@ async fn pekofy(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
/// Pekofies a single line /// Pekofies a single line
fn pekofy_line(mut line: &str) -> String { fn pekofy_line(mut line: &str) -> String {
lazy_static::lazy_static! { static ref FORMATTING_REGEX: Regex = Regex::new(r"^(.*?)((<:\w+:\d+>|\W)*)$").unwrap(); } lazy_static::lazy_static! { static ref FORMATTING_REGEX: Regex = Regex::new(r"^(.*?)((<:\w+:\d+>|\W)*)$").unwrap(); }
log::debug!("Pekofying line '{}'", line); tracing::debug!("Pekofying line '{}'", line);
let original = line; let original = line;
let mut md = ""; let mut md = "";
@ -84,7 +84,7 @@ fn pekofy_line(mut line: &str) -> String {
for peko in PEKOS { for peko in PEKOS {
if line.to_lowercase().ends_with(peko) { if line.to_lowercase().ends_with(peko) {
log::debug!("Peko already found in message. Returning original"); tracing::debug!("Peko already found in message. Returning original");
return original.to_string(); return original.to_string();
} }
} }
@ -96,7 +96,7 @@ fn pekofy_line(mut line: &str) -> String {
.filter(|c| c.is_alphabetic()) .filter(|c| c.is_alphabetic())
.all(char::is_uppercase) .all(char::is_uppercase)
{ {
log::debug!("Message is all uppercase. Peko will also be uppercase"); tracing::debug!("Message is all uppercase. Peko will also be uppercase");
peko = peko.to_uppercase(); peko = peko.to_uppercase();
} }

@ -16,17 +16,17 @@ use crate::utils::get_previous_message_or_reply;
#[aliases("source")] #[aliases("source")]
#[bucket("sauce_api")] #[bucket("sauce_api")]
async fn sauce(ctx: &Context, msg: &Message) -> CommandResult { async fn sauce(ctx: &Context, msg: &Message) -> CommandResult {
log::debug!("Got sauce command"); tracing::debug!("Got sauce command");
let source_msg = get_previous_message_or_reply(ctx, msg).await?; let source_msg = get_previous_message_or_reply(ctx, msg).await?;
if source_msg.is_none() { if source_msg.is_none() {
log::debug!("No source message provided"); tracing::debug!("No source message provided");
msg.channel_id.say(ctx, "No source message found.").await?; msg.channel_id.say(ctx, "No source message found.").await?;
return Ok(()); return Ok(());
} }
let source_msg = source_msg.unwrap(); let source_msg = source_msg.unwrap();
log::trace!("Source message is {:?}", source_msg); tracing::trace!("Source message is {:?}", source_msg);
log::debug!("Getting attachments..."); tracing::debug!("Getting attachments...");
let mut attachment_urls: Vec<String> = source_msg let mut attachment_urls: Vec<String> = source_msg
.attachments .attachments
.into_iter() .into_iter()
@ -34,7 +34,7 @@ async fn sauce(ctx: &Context, msg: &Message) -> CommandResult {
.filter(|url| url::is_image(url) || url::is_video(url)) .filter(|url| url::is_image(url) || url::is_video(url))
.collect(); .collect();
log::debug!("Getting embedded images..."); tracing::debug!("Getting embedded images...");
let mut embed_images = source_msg let mut embed_images = source_msg
.embeds .embeds
.into_iter() .into_iter()
@ -43,17 +43,17 @@ async fn sauce(ctx: &Context, msg: &Message) -> CommandResult {
.collect::<Vec<String>>(); .collect::<Vec<String>>();
attachment_urls.append(&mut embed_images); attachment_urls.append(&mut embed_images);
log::trace!("Image urls {:?}", attachment_urls); tracing::trace!("Image urls {:?}", attachment_urls);
if attachment_urls.is_empty() { if attachment_urls.is_empty() {
log::debug!("No images in source image"); tracing::debug!("No images in source image");
msg.channel_id msg.channel_id
.say(ctx, "I could not find any images in the message.") .say(ctx, "I could not find any images in the message.")
.await?; .await?;
return Ok(()); return Ok(());
} }
log::debug!( tracing::debug!(
"Checking SauceNao for {} attachments", "Checking SauceNao for {} attachments",
attachment_urls.len() attachment_urls.len()
); );
@ -63,12 +63,12 @@ async fn sauce(ctx: &Context, msg: &Message) -> CommandResult {
.sauce_nao .sauce_nao
.check_sauces(&attachment_urls[..]) .check_sauces(&attachment_urls[..])
.await?; .await?;
log::trace!("Sources are {:?}", sources); tracing::trace!("Sources are {:?}", sources);
log::debug!("Creating menu..."); tracing::debug!("Creating menu...");
show_sauce_menu(ctx, msg, sources).await?; show_sauce_menu(ctx, msg, sources).await?;
log::debug!("Menu created"); tracing::debug!("Menu created");
Ok(()) Ok(())
} }

@ -22,7 +22,7 @@ pub fn get_raw_event_handler() -> RichEventHandler {
.add_event(|ctx, e: &event::ReadyEvent| Box::pin(ready(ctx, &e.ready))) .add_event(|ctx, e: &event::ReadyEvent| Box::pin(ready(ctx, &e.ready)))
.add_event(|_ctx, _: &event::ResumedEvent| { .add_event(|_ctx, _: &event::ResumedEvent| {
Box::pin(async { Box::pin(async {
log::info!("Reconnected to Gateway"); tracing::info!("Reconnected to Gateway");
Ok(()) Ok(())
}) })
}); });
@ -31,7 +31,7 @@ pub fn get_raw_event_handler() -> RichEventHandler {
} }
async fn ready(ctx: &Context, _: &Ready) -> Result<()> { async fn ready(ctx: &Context, _: &Ready) -> Result<()> {
log::info!("Ready"); tracing::info!("Ready");
delete_messages_from_database(&ctx).await?; delete_messages_from_database(&ctx).await?;
let prefix = std::env::var("BOT_PREFIX").unwrap_or("~!".to_string()); let prefix = std::env::var("BOT_PREFIX").unwrap_or("~!".to_string());
ctx.set_activity(Activity::listening(format!("{}help", prefix).as_str())) ctx.set_activity(Activity::listening(format!("{}help", prefix).as_str()))
@ -44,7 +44,7 @@ pub(crate) struct Handler;
#[async_trait] #[async_trait]
impl EventHandler for Handler { impl EventHandler for Handler {
async fn resume(&self, _: Context, _: ResumedEvent) { async fn resume(&self, _: Context, _: ResumedEvent) {
log::info!("Reconnected to gateway") tracing::info!("Reconnected to gateway")
} }
async fn voice_state_update( async fn voice_state_update(
@ -72,10 +72,10 @@ impl EventHandler for Handler {
} }
if let Some(count) = member_count { if let Some(count) = member_count {
log::debug!("{} Members in channel", count); tracing::debug!("{} Members in channel", count);
if let Some(player) = get_music_player_for_guild(&ctx, guild_id).await { if let Some(player) = get_music_player_for_guild(&ctx, guild_id).await {
let mut player = player.lock().await; let mut player = player.lock().await;
log::debug!("Setting leave flag to {}", count == 0); tracing::debug!("Setting leave flag to {}", count == 0);
player.set_leave_flag(count == 0); player.set_leave_flag(count == 0);
} }
} }

@ -17,11 +17,11 @@ async fn main() {
init_logger(); init_logger();
let mut client = get_client() let mut client = get_client()
.await .await
.map_err(|e| log::error!("Failed to get client: {:?}", e)) .map_err(|e| tracing::error!("Failed to get client: {:?}", e))
.expect("Failed to get client"); .expect("Failed to get client");
// start listening for events by starting a single shard // start listening for events by starting a single shard
if let Err(why) = client.start_autosharded().await { if let Err(why) = client.start_autosharded().await {
log::error!("An error occurred while running the client: {:?}", why); tracing::error!("An error occurred while running the client: {:?}", why);
} }
} }

@ -33,7 +33,7 @@ pub async fn create_now_playing_msg(
player: Arc<Mutex<MusicPlayer>>, player: Arc<Mutex<MusicPlayer>>,
channel_id: ChannelId, channel_id: ChannelId,
) -> BotResult<Arc<RwLock<MessageHandle>>> { ) -> BotResult<Arc<RwLock<MessageHandle>>> {
log::debug!("Creating now playing menu"); tracing::debug!("Creating now playing menu");
let nsfw = channel_id.to_channel(ctx).await?.is_nsfw(); let nsfw = channel_id.to_channel(ctx).await?.is_nsfw();
let handle = MenuBuilder::default() let handle = MenuBuilder::default()
.add_control(-1, DELETE_BUTTON, |c, m, r| { .add_control(-1, DELETE_BUTTON, |c, m, r| {
@ -63,9 +63,9 @@ pub async fn create_now_playing_msg(
.add_page(Page::new_builder(move || { .add_page(Page::new_builder(move || {
let player = Arc::clone(&player); let player = Arc::clone(&player);
Box::pin(async move { Box::pin(async move {
log::debug!("Creating now playing embed for page"); tracing::debug!("Creating now playing embed for page");
let mut player = player.lock().await; let mut player = player.lock().await;
log::debug!("player locked"); tracing::debug!("player locked");
let mut page = CreateMessage::default(); let mut page = CreateMessage::default();
if let Some(mut current) = player.queue().current().clone() { if let Some(mut current) = player.queue().current().clone() {
@ -79,7 +79,7 @@ pub async fn create_now_playing_msg(
} else { } else {
page.embed(|e| e.description("Queue is empty")); page.embed(|e| e.description("Queue is empty"));
} }
log::debug!("Embed created"); tracing::debug!("Embed created");
Ok(page) Ok(page)
}) })
@ -101,7 +101,7 @@ pub async fn update_now_playing_msg(
song: &mut Song, song: &mut Song,
paused: bool, paused: bool,
) -> BotResult<()> { ) -> BotResult<()> {
log::debug!("Updating now playing message"); tracing::debug!("Updating now playing message");
let handle = handle.read().await; let handle = handle.read().await;
let mut message = handle.get_message(http).await?; let mut message = handle.get_message(http).await?;
let nsfw = http.get_channel(handle.channel_id).await?.is_nsfw(); let nsfw = http.get_channel(handle.channel_id).await?.is_nsfw();
@ -116,7 +116,7 @@ pub async fn update_now_playing_msg(
}) })
}) })
.await?; .await?;
log::debug!("Message updated."); tracing::debug!("Message updated.");
Ok(()) Ok(())
} }
@ -159,7 +159,7 @@ async fn play_pause_button_action(
_: &mut Menu<'_>, _: &mut Menu<'_>,
reaction: Reaction, reaction: Reaction,
) -> SerenityUtilsResult<()> { ) -> SerenityUtilsResult<()> {
log::debug!("Play/Pause button pressed"); tracing::debug!("Play/Pause button pressed");
let guild_id = reaction.guild_id.unwrap(); let guild_id = reaction.guild_id.unwrap();
let user = reaction.user(&ctx).await?; let user = reaction.user(&ctx).await?;
@ -170,7 +170,7 @@ async fn play_pause_button_action(
let player = get_music_player_for_guild(ctx, guild_id).await.unwrap(); let player = get_music_player_for_guild(ctx, guild_id).await.unwrap();
let (current, message, paused) = { let (current, message, paused) = {
log::debug!("Queue is locked"); tracing::debug!("Queue is locked");
let mut player = player.lock().await; let mut player = player.lock().await;
player.toggle_paused().await?; player.toggle_paused().await?;
( (
@ -179,7 +179,7 @@ async fn play_pause_button_action(
player.is_paused(), player.is_paused(),
) )
}; };
log::debug!("Queue is unlocked"); tracing::debug!("Queue is unlocked");
if let Some(mut current) = current { if let Some(mut current) = current {
update_now_playing_msg(&ctx.http, &message, &mut current, paused).await?; update_now_playing_msg(&ctx.http, &message, &mut current, paused).await?;
@ -243,9 +243,9 @@ async fn stop_button_action(
player.stop().await?; player.stop().await?;
} }
log::debug!("Left the voice channel"); tracing::debug!("Left the voice channel");
} else { } else {
log::debug!("Not in a voice channel"); tracing::debug!("Not in a voice channel");
} }
} }
{ {

@ -34,7 +34,7 @@ pub fn get_item_full_information(name: &str, api: &Api) -> BotResult<ItemFullInf
let food_by_name = api.foods.foods_by_name()?; let food_by_name = api.foods.foods_by_name()?;
let blocks_by_name = api.blocks.blocks_by_name()?; let blocks_by_name = api.blocks.blocks_by_name()?;
log::trace!("Item is {:?}", item); tracing::trace!("Item is {:?}", item);
Ok(ItemFullInformation { Ok(ItemFullInformation {
id: item.name.clone(), id: item.name.clone(),
name: item.display_name.clone(), name: item.display_name.clone(),

@ -15,11 +15,11 @@ pub struct LavalinkHandler {
#[async_trait] #[async_trait]
impl LavalinkEventHandler for LavalinkHandler { impl LavalinkEventHandler for LavalinkHandler {
async fn track_start(&self, _client: LavalinkClient, event: TrackStart) { async fn track_start(&self, _client: LavalinkClient, event: TrackStart) {
log::info!("Track started!\nGuild: {}", event.guild_id); tracing::info!("Track started!\nGuild: {}", event.guild_id);
} }
async fn track_finish(&self, _: LavalinkClient, event: TrackFinish) { async fn track_finish(&self, _: LavalinkClient, event: TrackFinish) {
log::info!("Track finished!\nGuild: {}", event.guild_id); tracing::info!("Track finished!\nGuild: {}", event.guild_id);
let player = { let player = {
let data = self.data.read().await; let data = self.data.read().await;
let players = data.get::<MusicPlayers>().unwrap(); let players = data.get::<MusicPlayers>().unwrap();
@ -29,20 +29,20 @@ impl LavalinkEventHandler for LavalinkHandler {
if let Some(player) = player { if let Some(player) = player {
let mut player = player.lock().await; let mut player = player.lock().await;
if let Err(e) = player.play_next().await { if let Err(e) = player.play_next().await {
log::error!("Failed to play next song: {:?}", e); tracing::error!("Failed to play next song: {:?}", e);
} }
if let Err(e) = player.update_now_playing().await { if let Err(e) = player.update_now_playing().await {
log::error!("Failed to update now playing embed: {:?}", e); tracing::error!("Failed to update now playing embed: {:?}", e);
} }
} }
} }
async fn player_update(&self, _: LavalinkClient, event: PlayerUpdate) { async fn player_update(&self, _: LavalinkClient, event: PlayerUpdate) {
log::debug!("Received player update event: {:?}", event); tracing::debug!("Received player update event: {:?}", event);
} }
async fn stats(&self, _: LavalinkClient, event: Stats) { async fn stats(&self, _: LavalinkClient, event: Stats) {
log::debug!("Received stats event: {:?}", event); tracing::debug!("Received stats event: {:?}", event);
} }
} }

@ -8,12 +8,12 @@ const API_ENDPOINT: &str = "https://api.lyrics.ovh/v1/";
/// Returns the lyrics of a song /// Returns the lyrics of a song
pub async fn get_lyrics(artist: &str, title: &str) -> BotResult<Option<String>> { pub async fn get_lyrics(artist: &str, title: &str) -> BotResult<Option<String>> {
lazy_static::lazy_static! { static ref DOUBLE_LB_REGEX: Regex = Regex::new(r"\n\n").unwrap(); } lazy_static::lazy_static! { static ref DOUBLE_LB_REGEX: Regex = Regex::new(r"\n\n").unwrap(); }
log::debug!("Requesting lyrics for '{}' by '{}'", title, artist); tracing::debug!("Requesting lyrics for '{}' by '{}'", title, artist);
let request_url = format!("{}{}/{}", API_ENDPOINT, artist, title); let request_url = format!("{}{}/{}", API_ENDPOINT, artist, title);
log::trace!("Request url is {}", request_url); tracing::trace!("Request url is {}", request_url);
let response = reqwest::get(request_url).await?; let response = reqwest::get(request_url).await?;
let response_text = response.text().await?; let response_text = response.text().await?;
log::trace!("Lyrics Response is {}", response_text); tracing::trace!("Lyrics Response is {}", response_text);
let lyrics: Option<Lyrics> = serde_json::from_str(&*response_text).ok(); let lyrics: Option<Lyrics> = serde_json::from_str(&*response_text).ok();

@ -41,12 +41,12 @@ pub(crate) async fn song_to_youtube_video(song: &Song) -> BotResult<Option<Video
{ {
return Ok(Some(video)); return Ok(Some(video));
} }
log::debug!("Video title is not similar enough to song name."); tracing::debug!("Video title is not similar enough to song name.");
last_result = Some(video); last_result = Some(video);
} }
} }
log::debug!("Returning last result"); tracing::debug!("Returning last result");
Ok(last_result) Ok(last_result)
} }
@ -61,13 +61,13 @@ pub async fn add_youtube_song_to_database(
SongSource::YouTube(_) => match search_for_song_variations(store, song).await { SongSource::YouTube(_) => match search_for_song_variations(store, song).await {
Ok(Some(track)) => track, Ok(Some(track)) => track,
Err(e) => { Err(e) => {
log::error!("Failed to search for song on spotify {:?}", e); tracing::error!("Failed to search for song on spotify {:?}", e);
return Ok(()); return Ok(());
} }
_ => return Ok(()), _ => return Ok(()),
}, },
}; };
log::debug!("Song found on spotify. Inserting metadata"); tracing::debug!("Song found on spotify. Inserting metadata");
let artists = artists_to_string(track.artists); let artists = artists_to_string(track.artists);
let url = song.url().await.unwrap(); let url = song.url().await.unwrap();
@ -93,7 +93,7 @@ async fn search_for_song_variations(
let mut query = COMMON_ADDITIONS.replace_all(song.title(), " ").to_string(); let mut query = COMMON_ADDITIONS.replace_all(song.title(), " ").to_string();
query = query.replace(|c| c != ' ' && !char::is_alphanumeric(c), ""); query = query.replace(|c| c != ' ' && !char::is_alphanumeric(c), "");
log::debug!("Searching for youtube song"); tracing::debug!("Searching for youtube song");
if let Some(track) = store.spotify_api.search_for_song(&query).await? { if let Some(track) = store.spotify_api.search_for_song(&query).await? {
let similarity = trigram::similarity( let similarity = trigram::similarity(
&format!( &format!(
@ -104,12 +104,12 @@ async fn search_for_song_variations(
&query, &query,
); );
if similarity > 0.3 { if similarity > 0.3 {
log::debug!("Result is similar enough ({}). Returning track", similarity); tracing::debug!("Result is similar enough ({}). Returning track", similarity);
return Ok(Some(track)); return Ok(Some(track));
} }
log::debug!("Result is not similar enough"); tracing::debug!("Result is not similar enough");
} }
log::debug!("No result found"); tracing::debug!("No result found");
Ok(None) Ok(None)
} }

@ -137,7 +137,7 @@ impl MusicPlayer {
/// Tries to play the next song /// Tries to play the next song
pub async fn try_play_next(&mut self) -> BotResult<bool> { pub async fn try_play_next(&mut self) -> BotResult<bool> {
let mut next = if let Some(n) = self.queue.next() { let mut next = if let Some(n) = self.queue.next() {
log::trace!("Next is {:?}", n); tracing::trace!("Next is {:?}", n);
n n
} else { } else {
return Ok(true); return Ok(true);
@ -151,13 +151,13 @@ impl MusicPlayer {
next.author() next.author()
)) ))
.await?; .await?;
log::debug!("Could not find playable candidate for song."); tracing::debug!("Could not find playable candidate for song.");
return Ok(false); return Ok(false);
}; };
let query_information = match self.client.auto_search_tracks(url).await { let query_information = match self.client.auto_search_tracks(url).await {
Ok(i) => i, Ok(i) => i,
Err(e) => { Err(e) => {
log::error!("Failed to search for song: {}", e); tracing::error!("Failed to search for song: {}", e);
self.send_error_message(format!( self.send_error_message(format!(
"‼️ Failed to retrieve information for song '{}' by '{}': {:?}", "‼️ Failed to retrieve information for song '{}' by '{}': {:?}",
next.title(), next.title(),
@ -292,10 +292,10 @@ fn wait_for_disconnect(
let mut player_lock = player.lock().await; let mut player_lock = player.lock().await;
if player_lock.leave_flag { if player_lock.leave_flag {
log::debug!("Waiting to leave"); tracing::debug!("Waiting to leave");
if leave_in <= 0 { if leave_in <= 0 {
log::debug!("Leaving voice channel"); tracing::debug!("Leaving voice channel");
if let Some(handler) = manager.get(guild_id) { if let Some(handler) = manager.get(guild_id) {
let mut handler_lock = handler.lock().await; let mut handler_lock = handler.lock().await;
@ -308,12 +308,12 @@ fn wait_for_disconnect(
players.remove(&guild_id.0); players.remove(&guild_id.0);
let _ = player_lock.stop().await; let _ = player_lock.stop().await;
let _ = player_lock.delete_now_playing().await; let _ = player_lock.delete_now_playing().await;
log::debug!("Left the voice channel"); tracing::debug!("Left the voice channel");
return; return;
} }
leave_in -= 1; leave_in -= 1;
} else { } else {
log::debug!("Resetting leave value"); tracing::debug!("Resetting leave value");
leave_in = 5 leave_in = 5
} }
} }

@ -99,7 +99,7 @@ impl Song {
if let Some(url) = self.url.clone() { if let Some(url) = self.url.clone() {
Some(url) Some(url)
} else { } else {
log::debug!("Lazy fetching video for title"); tracing::debug!("Lazy fetching video for title");
let information = song_to_youtube_video(&self).await.ok()??; let information = song_to_youtube_video(&self).await.ok()??;
self.url = Some(information.webpage_url.clone()); self.url = Some(information.webpage_url.clone());
self.thumbnail = information.thumbnail; self.thumbnail = information.thumbnail;

@ -15,21 +15,21 @@ impl SpotifyApi {
secret: dotenv::var("SPOTIFY_CLIENT_SECRET").expect("Missing Spotify Credentials"), secret: dotenv::var("SPOTIFY_CLIENT_SECRET").expect("Missing Spotify Credentials"),
}; };
let client = Client::new(credentials); let client = Client::new(credentials);
log::info!("Spotify API initialized."); tracing::info!("Spotify API initialized.");
Self { client } Self { client }
} }
/// Searches for a song on spotify /// Searches for a song on spotify
pub async fn search_for_song(&self, query: &str) -> BotResult<Option<Track>> { pub async fn search_for_song(&self, query: &str) -> BotResult<Option<Track>> {
log::debug!("Searching for song '{}' on spotify", query); tracing::debug!("Searching for song '{}' on spotify", query);
let types = vec![ItemType::Track]; let types = vec![ItemType::Track];
let result = self let result = self
.client .client
.search() .search()
.search(query, types, false, 1, 0, None) .search(query, types, false, 1, 0, None)
.await?; .await?;
log::trace!("Result is {:?}", result); tracing::trace!("Result is {:?}", result);
let tracks = result let tracks = result
.data .data
.tracks .tracks
@ -40,7 +40,7 @@ impl SpotifyApi {
/// Returns the songs for a playlist /// Returns the songs for a playlist
pub async fn get_songs_in_playlist(&self, url: &str) -> BotResult<Vec<Track>> { pub async fn get_songs_in_playlist(&self, url: &str) -> BotResult<Vec<Track>> {
log::debug!("Fetching spotify songs from playlist '{}'", url); tracing::debug!("Fetching spotify songs from playlist '{}'", url);
let id = self.get_id_for_url(url)?; let id = self.get_id_for_url(url)?;
let mut playlist_tracks = Vec::new(); let mut playlist_tracks = Vec::new();
let mut offset = 0; let mut offset = 0;
@ -53,13 +53,13 @@ impl SpotifyApi {
playlist_tracks.append(&mut tracks); playlist_tracks.append(&mut tracks);
offset += 100; offset += 100;
} }
log::debug!( tracing::debug!(
"{} Songs found in spotify playlist '{}'", "{} Songs found in spotify playlist '{}'",
playlist_tracks.len(), playlist_tracks.len(),
url url
); );
log::trace!("Songs are {:?}", playlist_tracks); tracing::trace!("Songs are {:?}", playlist_tracks);
Ok(playlist_tracks) Ok(playlist_tracks)
} }
@ -71,7 +71,7 @@ impl SpotifyApi {
limit: usize, limit: usize,
offset: usize, offset: usize,
) -> BotResult<Vec<Track>> { ) -> BotResult<Vec<Track>> {
log::trace!( tracing::trace!(
"Fetching songs from spotify playlist: limit {}, offset {}", "Fetching songs from spotify playlist: limit {}, offset {}",
limit, limit,
offset offset
@ -92,17 +92,17 @@ impl SpotifyApi {
PlaylistItemType::Episode(_) => None, PlaylistItemType::Episode(_) => None,
}) })
.collect(); .collect();
log::trace!("Tracks are {:?}", tracks); tracing::trace!("Tracks are {:?}", tracks);
Ok(tracks) Ok(tracks)
} }
/// Returns all songs for a given album /// Returns all songs for a given album
pub async fn get_songs_in_album(&self, url: &str) -> BotResult<Vec<Track>> { pub async fn get_songs_in_album(&self, url: &str) -> BotResult<Vec<Track>> {
log::debug!("Fetching songs for spotify album '{}'", url); tracing::debug!("Fetching songs for spotify album '{}'", url);
let id = self.get_id_for_url(url)?; let id = self.get_id_for_url(url)?;
let album = self.client.albums().get_album(&*id, None).await?.data; let album = self.client.albums().get_album(&*id, None).await?.data;
log::trace!("Album is {:?}", album); tracing::trace!("Album is {:?}", album);
let simple_tracks: Vec<String> = album let simple_tracks: Vec<String> = album
.tracks .tracks
@ -117,17 +117,17 @@ impl SpotifyApi {
.await? .await?
.data; .data;
log::trace!("Tracks are {:?}", tracks); tracing::trace!("Tracks are {:?}", tracks);
Ok(tracks) Ok(tracks)
} }
/// Returns song entity for a given spotify url /// Returns song entity for a given spotify url
pub async fn get_track_for_url(&self, url: &str) -> BotResult<Track> { pub async fn get_track_for_url(&self, url: &str) -> BotResult<Track> {
log::debug!("Getting song for {}", url); tracing::debug!("Getting song for {}", url);
let id = self.get_id_for_url(url)?; let id = self.get_id_for_url(url)?;
let track = self.client.tracks().get_track(&*id, None).await?.data; let track = self.client.tracks().get_track(&*id, None).await?.data;
log::trace!("Track info is {:?}", track); tracing::trace!("Track info is {:?}", track);
Ok(track) Ok(track)
} }

@ -16,7 +16,7 @@ static THREAD_LIMIT: u8 = 64;
/// Returns a list of youtube videos for a given url /// Returns a list of youtube videos for a given url
pub(crate) async fn get_videos_for_playlist(url: &str) -> BotResult<Vec<PlaylistEntry>> { pub(crate) async fn get_videos_for_playlist(url: &str) -> BotResult<Vec<PlaylistEntry>> {
log::debug!("Getting playlist information for {}", url); tracing::debug!("Getting playlist information for {}", url);
let output = let output =
youtube_dl(&["--no-warnings", "--flat-playlist", "--dump-json", "-i", url]).await?; youtube_dl(&["--no-warnings", "--flat-playlist", "--dump-json", "-i", url]).await?;
@ -30,7 +30,7 @@ pub(crate) async fn get_videos_for_playlist(url: &str) -> BotResult<Vec<Playlist
/// Searches for a video /// Searches for a video
pub(crate) async fn search_video_information(query: String) -> BotResult<Option<VideoInformation>> { pub(crate) async fn search_video_information(query: String) -> BotResult<Option<VideoInformation>> {
log::debug!("Searching for video '{}'", query); tracing::debug!("Searching for video '{}'", query);
let output = youtube_dl(&[ let output = youtube_dl(&[
"--no-warnings", "--no-warnings",
"--dump-json", "--dump-json",
@ -63,7 +63,7 @@ async fn parallel_search_youtube(song_names: Vec<String>) -> Vec<Song> {
/// to avoid using too much memory /// to avoid using too much memory
async fn youtube_dl(args: &[&str]) -> BotResult<String> { async fn youtube_dl(args: &[&str]) -> BotResult<String> {
lazy_static::lazy_static! { static ref THREAD_LOCK: Arc<AtomicU8> = Arc::new(AtomicU8::new(0)); } lazy_static::lazy_static! { static ref THREAD_LOCK: Arc<AtomicU8> = Arc::new(AtomicU8::new(0)); }
log::trace!("Running youtube-dl with args {:?}", args); tracing::trace!("Running youtube-dl with args {:?}", args);
while THREAD_LOCK.load(Ordering::SeqCst) >= THREAD_LIMIT { while THREAD_LOCK.load(Ordering::SeqCst) >= THREAD_LIMIT {
tokio::time::sleep(Duration::from_millis(100)).await; tokio::time::sleep(Duration::from_millis(100)).await;
@ -74,7 +74,7 @@ async fn youtube_dl(args: &[&str]) -> BotResult<String> {
THREAD_LOCK.fetch_sub(1, Ordering::Relaxed); THREAD_LOCK.fetch_sub(1, Ordering::Relaxed);
e e
})?; })?;
log::trace!("youtube-dl response is {}", output); tracing::trace!("youtube-dl response is {}", output);
THREAD_LOCK.fetch_sub(1, Ordering::Relaxed); THREAD_LOCK.fetch_sub(1, Ordering::Relaxed);
Ok(output) Ok(output)

@ -4,86 +4,23 @@
* See LICENSE for more information * See LICENSE for more information
*/ */
use std::fs;
use std::path::PathBuf;
use std::str::FromStr; use std::str::FromStr;
use chrono::Local; use tracing_subscriber::fmt::format::FmtSpan;
use colored::*; use tracing_subscriber::EnvFilter;
use log::{Level, LevelFilter};
/// Initializes the env_logger with a custom format const DEFAULT_ENV_FILTER: &str = "info,serenity=warn";
/// that also logs the thread names
pub fn init_logger() {
let log_dir = PathBuf::from(dotenv::var("LOG_DIR").unwrap_or("logs".to_string()));
if !log_dir.exists() {
fs::create_dir(&log_dir).expect("failed to create log dir");
}
fern::Dispatch::new()
.format(|out, message, record| {
let color = get_level_style(record.level());
let mut target = record.target().to_string();
target.truncate(39);
out.finish(format_args!( /// Initializes tracing
"{:<40}| {} {}: {}", pub fn init_logger() {
target.dimmed().italic(), let filter_string =
Local::now().format("%Y-%m-%dT%H:%M:%S"), std::env::var("RUST_LOG").unwrap_or_else(|_| DEFAULT_ENV_FILTER.to_string());
record let env_filter =
.level() EnvFilter::from_str(&*filter_string).expect("failed to parse env filter string");
.to_string() tracing_subscriber::fmt::SubscriberBuilder::default()
.to_lowercase() .with_env_filter(env_filter)
.as_str() .with_writer(std::io::stdout)
.color(color), .with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)
message .compact()
)) .init();
})
.level(
log::LevelFilter::from_str(
std::env::var("RUST_LOG")
.unwrap_or("info".to_string())
.as_str(),
)
.unwrap_or(LevelFilter::Info),
)
.level_for("tokio", log::LevelFilter::Info)
.level_for("tracing", log::LevelFilter::Warn)
.level_for("serenity", log::LevelFilter::Warn)
.level_for("rustls", log::LevelFilter::Warn)
.level_for("h2", log::LevelFilter::Warn)
.level_for("reqwest", log::LevelFilter::Warn)
.level_for("tungstenite", log::LevelFilter::Warn)
.level_for("hyper", log::LevelFilter::Warn)
.level_for("async_tungstenite", log::LevelFilter::Warn)
.level_for("tokio_util", log::LevelFilter::Warn)
.level_for("want", log::LevelFilter::Warn)
.level_for("mio", log::LevelFilter::Warn)
.level_for("songbird", log::LevelFilter::Warn)
.level_for("html5ever", log::LevelFilter::Warn)
.level_for("scraper", log::LevelFilter::Warn)
.level_for("html5ever", log::LevelFilter::Warn)
.level_for("cssparser", log::LevelFilter::Warn)
.level_for("selectors", log::LevelFilter::Warn)
.level_for("matches", log::LevelFilter::Warn)
.chain(std::io::stdout())
.chain(
fern::log_file(log_dir.join(PathBuf::from(format!(
"{}.log",
Local::now().format("%Y-%m-%d"),
))))
.expect("failed to create log file"),
)
.apply()
.expect("failed to init logger");
}
fn get_level_style(level: Level) -> colored::Color {
match level {
Level::Trace => colored::Color::Magenta,
Level::Debug => colored::Color::Blue,
Level::Info => colored::Color::Green,
Level::Warn => colored::Color::Yellow,
Level::Error => colored::Color::Red,
}
} }

@ -56,7 +56,7 @@ pub async fn delete_messages_from_database(ctx: &Context) -> BotResult<()> {
for message in messages { for message in messages {
if message.timeout <= SystemTime::now() { if message.timeout <= SystemTime::now() {
log::debug!("Deleting message {:?}", message); tracing::debug!("Deleting message {:?}", message);
let _ = ctx let _ = ctx
.http .http
.delete_message(message.channel_id as u64, message.message_id as u64) .delete_message(message.channel_id as u64, message.message_id as u64)
@ -67,7 +67,7 @@ pub async fn delete_messages_from_database(ctx: &Context) -> BotResult<()> {
} else { } else {
let http = Arc::clone(&ctx.http); let http = Arc::clone(&ctx.http);
let database = database.clone(); let database = database.clone();
log::debug!( tracing::debug!(
"Creating future to delete ephemeral message {:?} later", "Creating future to delete ephemeral message {:?} later",
message message
); );
@ -77,7 +77,7 @@ pub async fn delete_messages_from_database(ctx: &Context) -> BotResult<()> {
Instant::now().add(message.timeout.duration_since(SystemTime::now()).unwrap()), Instant::now().add(message.timeout.duration_since(SystemTime::now()).unwrap()),
) )
.await; .await;
log::debug!("Deleting message {:?}", message); tracing::debug!("Deleting message {:?}", message);
let _ = http let _ = http
.delete_message(message.channel_id as u64, message.message_id as u64) .delete_message(message.channel_id as u64, message.message_id as u64)
.await; .await;

Loading…
Cancel
Save