use super::client::{Client, ClientState};
use super::event_handler::EventHandler;
use super::message_parser::{Command, Message};
use std::sync::Arc;
pub async fn handle_event(
client: &mut Client,
message: Message,
event_handler: &Arc<dyn EventHandler>,
) -> Result<(), Box<dyn std::error::Error>> {
match message.command {
Command::Notice => {
match client.state {
ClientState::Connecting => {
client.state = ClientState::Registering;
client.register("RustIRCBot").await?; }
_ => {}
}
}
Command::RplWelcome => {
client.state = ClientState::InServer;
event_handler.on_server_connect(client, message).await;
}
Command::RplMotdStart | Command::RplMotd => {
event_handler.on_message_of_the_day(client, message).await;
}
Command::PrivMsg => {
event_handler.on_message_sent(client, message).await;
},
Command::Join => {
client.state = ClientState::InChannel((&message.parameters[0][1..]).to_owned());
event_handler.on_channel_join(client, message).await;
}
Command::Ping => {
client.send_pong().await?;
},
Command::Unimplemented(_) => {
event_handler.on_unimplemented(client, message).await;
},
_ => {
}
}
Ok(())
}