diff --git a/Cargo.toml b/Cargo.toml index 68b20de..c6d2cc9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +poise = "0.6.1" +tokio = { version = "1.43.0", features = ["rt-multi-thread"] } diff --git a/src/cmds.rs b/src/cmds.rs new file mode 100644 index 0000000..7026560 --- /dev/null +++ b/src/cmds.rs @@ -0,0 +1,11 @@ +use crate::{Context, Error}; + +#[poise::command(slash_command, prefix_command)] +pub async fn ping( + ctx: Context<'_>, + #[description = "The text to echo back"] text: String, +) -> Result<(), Error> +{ + ctx.reply(text).await?; + Ok(()) +} \ No newline at end of file diff --git a/src/events.rs b/src/events.rs new file mode 100644 index 0000000..93d1ef4 --- /dev/null +++ b/src/events.rs @@ -0,0 +1,24 @@ +use crate::{Data, Error}; + +use poise::serenity_prelude as serenity; + +use std::future::Future; +use std::pin::Pin; + +pub fn event_handler<'a>( + _ctx: &'a serenity::Context, + event: &'a serenity::FullEvent, + _framework: poise::FrameworkContext<'a, Data, Error>, + _data: &'a Data, +) -> Pin> + Send + 'a>> { + Box::pin(async move { + if let serenity::FullEvent::Ready { data_about_bot } = event { + println!( + "Bot started as user \"{}\" with id {}", + data_about_bot.user.name, + data_about_bot.user.id + ); + } + Ok(()) + }) +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 80a1832..2289907 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,43 @@ -fn main() { - println!("Hello, world!"); +mod cmds; +mod events; + +use poise::serenity_prelude as serenity; + +struct Data {} +type Error = Box; +type Context<'a> = poise::Context<'a, Data, Error>; + + +#[tokio::main] +async fn main() { + let token = std::env::var("ASSISTANT_TOKEN").expect("missing ASSISTANT_TOKEN env var"); + let intents = serenity::GatewayIntents::all(); + + let peek_len = 27; + let token_peek = &token[..peek_len]; + let token_end_len = token[peek_len..].len(); + println!("Token: {}{}", token_peek, "*".repeat(token_end_len)); + + + let framework = poise::Framework::builder() + .options(poise::FrameworkOptions { + commands: vec![cmds::ping()], + event_handler: events::event_handler, // error here + ..Default::default() + }) + .setup(|ctx, _ready, framework| { + Box::pin(async move { + poise::builtins::register_globally(ctx, &framework.options().commands).await?; + Ok(Data {}) + }) + }) + .build(); + + let mut bot = serenity::ClientBuilder::new(token, intents) + .framework(framework) + .await + .unwrap(); + + println!("Starting bot..."); + bot.start().await.unwrap(); }