diff --git a/.idea/csv-plugin.xml b/.idea/csv-plugin.xml
index 4a0399a..cd0a223 100644
--- a/.idea/csv-plugin.xml
+++ b/.idea/csv-plugin.xml
@@ -10,6 +10,13 @@
+
+
+
+
+
+
+
diff --git a/Cargo.lock b/Cargo.lock
index 74f219d..71b7570 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -12,6 +12,12 @@ version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e"
+[[package]]
+name = "anyhow"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
+
[[package]]
name = "async-trait"
version = "0.1.48"
@@ -313,6 +319,12 @@ dependencies = [
"wasi 0.9.0+wasi-snapshot-preview1",
]
+[[package]]
+name = "glob"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
+
[[package]]
name = "h2"
version = "0.3.2"
@@ -443,6 +455,30 @@ dependencies = [
"unicode-normalization",
]
+[[package]]
+name = "include_dir"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23d58bdeb22b1c4691106c084b1063781904c35d0f22eda2a283598968eac61a"
+dependencies = [
+ "glob",
+ "include_dir_impl",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "include_dir_impl"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "327869970574819d24d1dca25c891856144d29159ab797fa9dc725c5c3f57215"
+dependencies = [
+ "anyhow",
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
[[package]]
name = "indexmap"
version = "1.6.2"
@@ -560,6 +596,19 @@ dependencies = [
"unicase",
]
+[[package]]
+name = "minecraft-data-rs"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd60c77ef4902ad297b11bc7f8ad8857177d856e763ab92eb717f33c83e0e254"
+dependencies = [
+ "include_dir",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "thiserror",
+]
+
[[package]]
name = "miniz_oxide"
version = "0.4.4"
@@ -1088,6 +1137,7 @@ name = "tobi-rs"
version = "0.1.0"
dependencies = [
"dotenv",
+ "minecraft-data-rs",
"parking_lot",
"rusqlite",
"serde",
diff --git a/Cargo.toml b/Cargo.toml
index 84f1fa7..34bc5db 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,4 +15,5 @@ rusqlite = "0.24"
serde_derive = "1.0.125"
serde = "1.0.125"
thiserror = "1.0.24"
-parking_lot = "0.11.1"
\ No newline at end of file
+parking_lot = "0.11.1"
+minecraft-data-rs = "0.1.0"
\ No newline at end of file
diff --git a/src/client.rs b/src/client.rs
index 0cfd493..0f06613 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -1,9 +1,13 @@
+use crate::commands::minecraft::Minecraft;
use crate::database::{get_database, Database};
use crate::utils::error::{BotError, BotResult};
use crate::utils::store::{Store, StoreData};
use serenity::async_trait;
-use serenity::client::EventHandler;
+use serenity::client::{Context, EventHandler};
+use serenity::framework::standard::macros::hook;
+use serenity::framework::standard::CommandResult;
use serenity::framework::StandardFramework;
+use serenity::model::channel::Message;
use serenity::Client;
struct Handler;
@@ -25,13 +29,26 @@ pub async fn get_client() -> BotResult {
}
pub fn get_framework() -> StandardFramework {
- StandardFramework::default().configure(|c| {
- c.prefix(
- dotenv::var("BOT_PREFIX")
- .unwrap_or("~!".to_string())
- .as_str(),
- )
- .allow_dm(true)
- .ignore_bots(true)
- })
+ StandardFramework::default()
+ .configure(|c| {
+ c.prefix(
+ dotenv::var("BOT_PREFIX")
+ .unwrap_or("~!".to_string())
+ .as_str(),
+ )
+ .allow_dm(true)
+ .ignore_bots(true)
+ })
+ .group(&crate::commands::minecraft::MINECRAFT_GROUP)
+ .group(&crate::GENERAL_GROUP)
+ .after(after_hook)
+}
+
+#[hook]
+async fn after_hook(ctx: &Context, msg: &Message, cmd_name: &str, error: CommandResult) {
+ // Print out an error if it happened
+ if let Err(why) = error {
+ let _ = msg.channel_id.say(&ctx, format!("{}", why)).await;
+ println!("Error in {}: {:?}", cmd_name, why);
+ }
}
diff --git a/src/commands/minecraft/mod.rs b/src/commands/minecraft/mod.rs
new file mode 100644
index 0000000..d720d16
--- /dev/null
+++ b/src/commands/minecraft/mod.rs
@@ -0,0 +1,42 @@
+use serenity::model::channel::Message;
+
+use crate::utils::store::{Store, StoreData};
+use serenity::client::Context;
+use serenity::framework::standard::{
+ macros::{command, group},
+ Args, CommandError, CommandResult,
+};
+
+#[group]
+#[commands(durability)]
+pub(crate) struct Minecraft;
+
+#[command]
+pub(crate) async fn durability(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
+ if args.is_empty() {
+ return Err(CommandError::from("You need to provide an item name"));
+ }
+ let data = ctx.data.read().await;
+ let store = data.get::().expect("Failed to get store");
+
+ let item_name = args.message().to_lowercase();
+ let items_by_name = store.minecraft_data_api.items.items_by_name()?;
+ let item = items_by_name
+ .get(&item_name)
+ .ok_or(CommandError::from(format!(
+ "The item `{}` could not be found",
+ item_name
+ )))?;
+
+ msg.channel_id
+ .say(
+ ctx,
+ format!(
+ "The durability for `{}` is `{:?}`",
+ item.display_name, item.durability
+ ),
+ )
+ .await?;
+
+ Ok(())
+}
diff --git a/src/commands/mod.rs b/src/commands/mod.rs
new file mode 100644
index 0000000..94caf87
--- /dev/null
+++ b/src/commands/mod.rs
@@ -0,0 +1 @@
+pub(crate) mod minecraft;
diff --git a/src/main.rs b/src/main.rs
index 365fd24..2c2cc6f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,5 @@
use crate::client::get_client;
-use serenity::client::{Context, EventHandler};
+use serenity::client::Context;
use serenity::framework::standard::{
macros::{command, group},
CommandResult,
@@ -7,7 +7,9 @@ use serenity::framework::standard::{
use serenity::model::channel::Message;
pub(crate) mod client;
+mod commands;
pub(crate) mod database;
+mod providers;
pub(crate) mod utils;
#[group]
diff --git a/src/providers/mod.rs b/src/providers/mod.rs
new file mode 100644
index 0000000..e69de29
diff --git a/src/utils/error.rs b/src/utils/error.rs
index ee11c47..66c2289 100644
--- a/src/utils/error.rs
+++ b/src/utils/error.rs
@@ -1,3 +1,4 @@
+use serenity::framework::standard::CommandError;
use thiserror::Error;
pub type BotResult = Result;
@@ -12,4 +13,7 @@ pub enum BotError {
#[error("Missing Bot Token")]
MissingToken,
+
+ #[error("Minecraft Data Error: {0}")]
+ MinecraftDataError(#[from] minecraft_data_rs::DataError),
}
diff --git a/src/utils/store.rs b/src/utils/store.rs
index 20189b0..d2dbc36 100644
--- a/src/utils/store.rs
+++ b/src/utils/store.rs
@@ -7,12 +7,16 @@ pub struct Store;
pub struct StoreData {
pub database: Arc>,
+ pub minecraft_data_api: minecraft_data_rs::api::Api,
}
impl StoreData {
pub fn new(database: Database) -> StoreData {
Self {
database: Arc::new(Mutex::new(database)),
+ minecraft_data_api: minecraft_data_rs::api::Api::new(
+ minecraft_data_rs::api::versions::latest_stable().unwrap(),
+ ),
}
}
}