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}