diff --git a/.idea/ZMP-bot.iml b/.idea/ZMP-bot.iml index cf84ae4..a1280b4 100644 --- a/.idea/ZMP-bot.iml +++ b/.idea/ZMP-bot.iml @@ -3,6 +3,8 @@ + + diff --git a/src/commands/lfg.rs b/src/commands/lfg.rs index 73e2f0c..2146e89 100644 --- a/src/commands/lfg.rs +++ b/src/commands/lfg.rs @@ -3,15 +3,13 @@ use crate::commands::lfg::Difficulty::Normal; use crate::commands::lfg::Map::*; use crate::commands::lfg::Mode::*; //from main.rs -use crate::Context; -use crate::Error; +use crate::{Context, Error}; // -use serenity::model::id::RoleId; +use serenity::model::id::{RoleId}; use serenity::model::mention::Mention; -use serenity::model::mention::Mention::Role; -use serenity::prelude::Mentionable; +use serenity::model::mention::Mention::{Role}; -#[derive(Debug, poise::ChoiceParameter)] +#[derive(Debug, poise::ChoiceParameter, PartialEq)] pub enum Map { #[name = "Dead End"] DeadEnd, @@ -41,7 +39,9 @@ pub enum Difficulty { #[poise::command(slash_command)] pub(crate) async fn lfg( ctx: Context<'_>, - #[rename = "map"] map: Map, + + #[rename = "map"] + map: Map, #[description = "Normal"] #[rename = "difficulty"] diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 46e8194..b488167 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -1 +1,3 @@ pub(crate) mod lfg; +pub(crate) mod round; +pub(crate) mod zombies; diff --git a/src/commands/round.rs b/src/commands/round.rs new file mode 100644 index 0000000..6840c03 --- /dev/null +++ b/src/commands/round.rs @@ -0,0 +1,10 @@ +use std::convert::Into; +use crate::{Context, Error}; +use crate::commands::zombies::zombies::*; + +#[poise::command(slash_command)] +pub(crate) async fn round( + ctx: Context<'_> +) -> Result<(), Error> { + Ok(()) +} \ No newline at end of file diff --git a/src/commands/zombies/gear.rs b/src/commands/zombies/gear.rs new file mode 100644 index 0000000..4ca955d --- /dev/null +++ b/src/commands/zombies/gear.rs @@ -0,0 +1,46 @@ +use crate::commands::zombies::gear::ArmorMaterial::Leather; +use crate::commands::zombies::gear::ArmorPiece::Leggings; +use crate::commands::zombies::gear::Weapon::{Axe, Sword}; +use crate::commands::zombies::gear::WeaponMaterial::{Diamond, Gold, Wood}; +#[derive(Debug)] +pub enum ArmorPiece { + None, + Helmet(ArmorMaterial), + Chestplate(ArmorMaterial), + Leggings(ArmorMaterial), + Boots(ArmorMaterial) +} +#[derive(Debug)] +pub enum WeaponMaterial { + Wood, + Stone, + Gold, + Iron, + Diamond +} +#[derive(Debug)] +pub enum ArmorMaterial { + Leather, + Gold, + Chainmail, + Iron, + Diamond +} +#[derive(Debug)] +pub enum Weapon { + None, + Axe(WeaponMaterial), + Sword(WeaponMaterial) +} +pub const NO_WEAPON:Weapon = Weapon::None; +pub const WOODEN_AXE:Weapon = Axe(Wood); +pub const DIAMOND_AXE:Weapon = Axe(Diamond); +pub const GOLD_SWORD:Weapon = Sword(Gold); +pub const DIAMOND_SWORD:Weapon = Sword(Diamond); + +pub const NO_HELMET:ArmorPiece = ArmorPiece::None; +pub const NO_CHESTPLATE:ArmorPiece = ArmorPiece::None; +pub const NO_LEGGINGS:ArmorPiece = ArmorPiece::None; +pub const NO_BOOTS:ArmorPiece = ArmorPiece::None; + +pub const LEATHER_LEGGINGS:ArmorPiece = Leggings(Leather); \ No newline at end of file diff --git a/src/commands/zombies/mod.rs b/src/commands/zombies/mod.rs new file mode 100644 index 0000000..609da1c --- /dev/null +++ b/src/commands/zombies/mod.rs @@ -0,0 +1,3 @@ +pub mod zombies; +pub mod gear; +pub(crate) mod rounds; \ No newline at end of file diff --git a/src/commands/zombies/rounds.rs b/src/commands/zombies/rounds.rs new file mode 100644 index 0000000..3222770 --- /dev/null +++ b/src/commands/zombies/rounds.rs @@ -0,0 +1,53 @@ +use crate::commands::zombies::rounds::Round::*; +use crate::commands::zombies::rounds::Wave::*; +use crate::commands::zombies::zombies::*; +/*type Wave = Vec; +type Round = Vec; + +fn bad_blood_round1() -> Round { + let mut round:Round = Vec::with_capacity(2); + let mut wave1:Wave = Vec::with_capacity(2); + let mut wave2:Wave = Vec::with_capacity(1); + wave1.push(Horde { + zombie: BB_Z_1, + count: 4 + }); + wave2.push(Horde { + zombie: BB_Z_1, + count: 5 + }); + round.push(wave1); + round.push(wave2); + round +}*/ + +pub enum Wave { + Wave1horde([Horde;1]), + Wave2hordes([Horde;2]), + Wave3hordes([Horde;3]), + Wave4hordes([Horde;4]), + Wave5hordes([Horde;5]), + Wave6hordes([Horde;6]), + Wave7hordes([Horde;7]) +} +pub enum Round { + Round2Waves([Wave;2]), + Round3Waves([Wave;3]), + Round4Waves([Wave;4]), + Round5Waves([Wave;5]), + Round6Waves([Wave;6]), + Round7Waves([Wave;7]) +} +const DE:[Round;30] = [ + Round2Waves([ + Wave1horde([ + Horde { zombie: BB_Z_1, count: 4 } + ]), + Wave1horde([ + Horde { zombie: BB_Z_1, count: 5 } + ]) + ]);30 +]; +/*fn t() { + DE.get(2) +}*/ \ No newline at end of file diff --git a/src/commands/zombies/zombies.rs b/src/commands/zombies/zombies.rs new file mode 100644 index 0000000..295ce04 --- /dev/null +++ b/src/commands/zombies/zombies.rs @@ -0,0 +1,27 @@ +use crate::commands::zombies::gear::*; +use crate::{Context, Error}; +#[derive(Debug)] +pub struct Zombie { + id: u16, + damage: u8, + health: u16, + speed: f32, + armor: [ArmorPiece;4], + weapon: Weapon, + follow_range: u8 +} +#[derive(Debug)] +pub struct Horde { + pub zombie: Zombie, + pub count: u8 +} + +pub const BB_Z_1: Zombie = Zombie { + id: 1, + damage: 3, + health: 20, + speed: 0.25, + armor: [NO_HELMET,NO_CHESTPLATE,LEATHER_LEGGINGS,NO_BOOTS], + weapon: WOODEN_AXE, + follow_range: 35 +}; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index d6354ec..8b42ddb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,47 +1,71 @@ mod commands; -use poise::serenity_prelude as serenity; +use poise::{async_trait, Event, serenity_prelude as serenity}; use serenity::model::id::UserId; use std::collections::HashSet; use std::convert::Into; +use serenity::client::EventHandler; +use crate::commands::round::round; type Error = Box; type Context<'a> = poise::Context<'a, Data, Error>; -// User data, which is stored and accessible in all command invocations pub struct Data {} +struct ReadyHandler; + +#[async_trait] +impl EventHandler for ReadyHandler { + async fn ready(&self, _: poise::serenity_prelude::Context, ready: poise::serenity_prelude::Ready) { + println!("{} is connected!", ready.user.id); + } +} + #[tokio::main] async fn main() { - let mut owners = HashSet::new(); - owners.insert(UserId(449579075531440128_u64)); - let framework = poise::Framework::builder() - .options(poise::FrameworkOptions { - commands: vec![commands::lfg::lfg()], - prefix_options: poise::PrefixFrameworkOptions { - prefix: Some("~".into()), - ..Default::default() - }, - on_error: |error| { - Box::pin(async move { - match error { - poise::FrameworkError::ArgumentParse { error, .. } => { - if let Some(error) = error.downcast_ref::() { - println!("Found a RoleParseError: {:?}", error); - } else { - println!("Not a RoleParseError :("); - } - } - other => poise::builtins::on_error(other).await.unwrap(), - } - }) - }, - owners, + let options = poise::FrameworkOptions { + commands: vec![ + commands::lfg::lfg(), + ], + prefix_options: poise::PrefixFrameworkOptions { + prefix: Some("~".into()), ..Default::default() - }) + }, + on_error: |error| { + Box::pin(async move { + match error { + poise::FrameworkError::ArgumentParse { error, .. } => { + if let Some(error) = error.downcast_ref::() { + println!("Found a RoleParseError: {:?}", error); + } else { + println!("Not a RoleParseError :("); + } + } + other => poise::builtins::on_error(other).await.unwrap(), + } + }) + }, + owners: { + HashSet::from([UserId(449579075531440128_u64)]) + }, + event_handler: |_ctx, event, _framework, _data| { + Box::pin(event_handler(_ctx, event, _framework, _data)) + }, + ..Default::default() + }; + + + + + let framework = poise::Framework::builder() + + .options(options) + .token(std::env::var("DISCORD_TOKEN").unwrap()) + .intents( serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT, ) + .setup(move |ctx, _ready, framework| { Box::pin(async move { poise::builtins::register_globally(ctx, &framework.options().commands).await?; @@ -51,3 +75,17 @@ async fn main() { framework.run().await.unwrap(); } +async fn event_handler( + _ctx: &serenity::Context, + event: &Event<'_>, + _framework: poise::FrameworkContext<'_, Data, Error>, + _data: &Data, +) -> Result<(), Error> { + match event { + Event::Ready { data_about_bot } => { + println!("Logged in as {}", data_about_bot.user.name); + } + _ => {} + } + Ok(()) +} \ No newline at end of file