ircie/src/events.rs

168 lines
5.2 KiB
Rust
Raw Normal View History

2023-05-29 08:11:50 -07:00
use log::{debug, info, warn};
use std::time::Duration;
2023-05-29 08:11:50 -07:00
2023-05-31 01:39:40 -07:00
use crate::{system::Response, Irc, IrcPrefix};
2023-05-29 07:11:41 -07:00
impl Irc {
pub(crate) async fn event_ping(&mut self, ping_token: &str) {
2023-05-29 08:11:50 -07:00
debug!("PING {}", ping_token);
self.context
.write()
.await
.queue(&format!("PONG {}", ping_token));
2023-05-29 07:11:41 -07:00
}
pub(crate) async fn event_welcome(&mut self, welcome_msg: &str) {
2023-05-29 08:11:50 -07:00
debug!("{welcome_msg}");
2023-06-08 17:02:16 -07:00
self.identify().await;
let mut context = self.context.write().await;
2023-06-08 17:02:16 -07:00
for channel in &self.config.channels {
context.join(channel);
}
2023-05-29 07:11:41 -07:00
}
pub(crate) async fn event_nicknameinuse(&mut self) {
let mut context = self.context.write().await;
2023-06-08 17:02:16 -07:00
let new_nick = format!("{}_", &self.config.nick);
2023-05-29 08:11:50 -07:00
warn!("Nick already in use., switching to {}", new_nick);
2023-06-08 17:02:16 -07:00
context.nick(&new_nick);
self.config.nick = new_nick;
2023-05-29 07:11:41 -07:00
}
pub(crate) async fn event_kick(
&mut self,
channel: &str,
nick: &str,
kicker: &str,
reason: &str,
) {
let mut context = self.context.write().await;
2023-06-08 17:02:16 -07:00
if nick != &self.config.nick {
2023-05-29 07:11:41 -07:00
return;
}
2023-05-29 08:11:50 -07:00
warn!("We got kicked from {} by {}! ({})", channel, kicker, reason);
context.join(channel);
2023-05-29 07:11:41 -07:00
}
pub(crate) async fn event_quit<'a>(&mut self, prefix: &'a IrcPrefix<'a>) {
2023-06-08 17:02:16 -07:00
if prefix.nick != self.config.nick {
2023-05-29 07:11:41 -07:00
return;
}
2023-05-29 08:11:50 -07:00
warn!("We quit. We'll reconnect in {} seconds.", 15);
2023-05-29 07:11:41 -07:00
std::thread::sleep(Duration::from_secs(15));
self.connect().await.unwrap();
}
pub(crate) async fn event_invite<'a>(&mut self, prefix: &'a IrcPrefix<'a>, channel: &str) {
2023-05-29 08:11:50 -07:00
info!("{} invited us to {}", prefix.nick, channel);
self.context.write().await.join(channel);
2023-05-29 07:11:41 -07:00
}
pub(crate) async fn event_notice<'a>(
2023-05-29 07:11:41 -07:00
&mut self,
_prefix: Option<&IrcPrefix<'a>>,
2023-05-29 07:11:41 -07:00
channel: &str,
message: &str,
) {
2023-06-08 17:02:16 -07:00
let config = self.config.clone();
2023-05-30 14:56:59 -07:00
if channel == &config.nick {
if message.ends_with(&format!("\x02{}\x02 isn't registered.", config.nick)) {
let nickserv_pass = config.nickserv_pass.as_ref().unwrap().to_string();
let nickserv_email = config.nickserv_email.as_ref().unwrap().to_string();
info!("Registering to nickserv now.");
2023-05-29 15:49:52 -07:00
let mut context = self.context.write().await;
context.privmsg(
"NickServ",
&format!("REGISTER {} {}", nickserv_pass, nickserv_email),
);
}
if message.ends_with(" seconds to register.") {
let seconds = message
.split_whitespace()
.nth(10)
.unwrap()
.parse::<usize>()
.unwrap()
+ 1;
info!("Waiting {} seconds to register.", seconds);
2023-06-08 17:02:16 -07:00
/* TODO: fix this
let ctx_clone = self.context.clone();
tokio::spawn(async move {
tokio::time::sleep(Duration::from_secs(seconds as u64)).await;
2023-06-08 17:02:16 -07:00
self.identify().await;
});
2023-06-08 17:02:16 -07:00
*/
}
}
2023-05-29 07:11:41 -07:00
}
pub(crate) async fn event_privmsg<'a>(
&mut self,
prefix: &'a IrcPrefix<'a>,
channel: &str,
message: &str,
) {
2023-05-30 14:56:59 -07:00
let mut elements;
let sys_name;
{
let context = self.context.read().await;
2023-06-08 17:02:16 -07:00
if !message.starts_with(&self.config.cmdkey) {
return;
}
2023-05-30 14:56:59 -07:00
elements = message.split_whitespace();
sys_name = elements.next().unwrap()[1..].to_owned();
2023-06-08 17:02:16 -07:00
if prefix.owner() && sys_name == "raw" {
2023-05-31 07:37:09 -07:00
drop(context);
let mut context = self.context.write().await;
context.queue(&elements.collect::<Vec<_>>().join(" "));
return;
}
2023-05-29 07:11:41 -07:00
}
if self.is_flood(channel).await {
2023-05-29 07:11:41 -07:00
return;
}
2023-05-31 01:39:40 -07:00
let arguments = elements.collect::<Vec<_>>();
2023-06-08 17:02:16 -07:00
if !self.systems.contains_key(&sys_name) {
let resp = self.run_default_system(prefix, channel, &arguments).await;
2023-05-31 03:25:37 -07:00
let Response::Data(data) = resp else {
return;
};
2023-06-08 17:02:16 -07:00
let mut context = self.context.write().await;
2023-05-31 03:25:37 -07:00
for (idx, line) in data.data.iter().enumerate() {
if idx == 0 && data.highlight {
context.privmsg(channel, &format!("{}: {}", prefix.nick, line))
} else {
context.privmsg(channel, &line)
}
2023-05-31 01:39:40 -07:00
}
2023-05-29 18:43:29 -07:00
return;
}
2023-05-31 01:39:40 -07:00
2023-06-08 17:02:16 -07:00
let response = self.run_system(prefix, channel, &arguments, &sys_name).await;
2023-05-31 03:25:37 -07:00
let Response::Data(data) = response else {
return;
2023-05-31 01:39:40 -07:00
};
2023-06-08 17:02:16 -07:00
let mut context = self.context.write().await;
2023-05-31 03:25:37 -07:00
for (idx, line) in data.data.iter().enumerate() {
if idx == 0 && data.highlight {
context.privmsg(channel, &format!("{}: {}", prefix.nick, line))
} else {
context.privmsg(channel, &line)
}
2023-05-29 08:11:50 -07:00
}
2023-05-29 07:11:41 -07:00
}
}