Skip to main content

commands/
commands.rs

1use stoat::{
2    Client, Context, EventHandler, MessageExt, async_trait,
3    commands::{Command, CommandEventHandler, CommandHandler, Context as CommandContext},
4    types::Message,
5};
6
7#[derive(Debug, Clone)]
8pub enum Error {
9    StoatError(stoat::Error),
10}
11
12impl From<stoat::Error> for Error {
13    fn from(value: stoat::Error) -> Self {
14        Self::StoatError(value)
15    }
16}
17
18#[derive(Clone)]
19struct Commands;
20
21#[async_trait]
22impl CommandEventHandler for Commands {
23    type State = ();
24    type Error = Error;
25
26    async fn get_prefix(&self, _ctx: CmdCtx) -> Result<Vec<String>, Error> {
27        Ok(vec!["!".to_string()])
28    }
29}
30
31#[derive(Clone)]
32struct Events(CommandHandler<Commands>);
33
34#[async_trait]
35impl EventHandler for Events {
36    type Error = Error;
37
38    async fn ready(&self, context: Context) -> Result<(), Self::Error> {
39        println!(
40            "Logged into {}",
41            context.cache.get_current_user().unwrap().username
42        );
43
44        Ok(())
45    }
46
47    async fn message(&self, context: Context, message: Message) -> Result<(), Self::Error> {
48        self.0.process_commands(context, message).await
49    }
50}
51
52type CmdCtx = CommandContext<Error, ()>;
53
54async fn ping(ctx: CmdCtx) -> Result<(), Error> {
55    ctx.message
56        .reply(&ctx, true)
57        .content("Pong!".to_string())
58        .build()
59        .await?;
60
61    Ok(())
62}
63
64#[tokio::main]
65async fn main() -> Result<(), Error> {
66    let commands = CommandHandler::new(Commands, ())
67        .register(vec![Command::new("ping", ping).description("Pong")]);
68
69    let events = Events(commands);
70
71    Client::new(events).await?.run("TOKEN HERE").await
72}