83 lines
2.3 KiB
Rust
83 lines
2.3 KiB
Rust
#[doc(hidden)]
|
|
#[derive(Debug)]
|
|
pub enum CapMode {
|
|
LS,
|
|
END,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum Command {
|
|
ADMIN(String),
|
|
AWAY(String),
|
|
#[doc(hidden)]
|
|
CAP(CapMode),
|
|
INVITE(String, String),
|
|
JOIN(String),
|
|
LIST(Option<String>, Option<String>),
|
|
MODE(String, Option<String>),
|
|
NAMES(String, String),
|
|
NICK(String),
|
|
OPER(String, String),
|
|
OTHER(String),
|
|
PART(String),
|
|
#[doc(hidden)]
|
|
PASS(String),
|
|
PING(String),
|
|
#[doc(hidden)]
|
|
PONG(String, String),
|
|
PRIVMSG(String, String, String),
|
|
QUIT(String),
|
|
TOPIC(String, String),
|
|
TOPIC_BY(String, String),
|
|
#[doc(hidden)]
|
|
USER(String, String, String, String),
|
|
}
|
|
|
|
impl Command {
|
|
pub async fn command_from_str(s: String) -> Self {
|
|
let new = s.trim();
|
|
tracing::trace!("{}", new);
|
|
|
|
let parts: Vec<&str> = new.split_whitespace().collect();
|
|
if parts.get(0) == Some(&"PING") {
|
|
return Self::PING(parts[1].to_string());
|
|
}
|
|
|
|
match parts.get(1) {
|
|
Some(&"PRIVMSG") => {
|
|
let nick_realname = parts[0];
|
|
let nick: String;
|
|
|
|
let index = nick_realname.chars().position(|c| c == '!');
|
|
if let Some(index) = index {
|
|
if index > 0 {
|
|
nick = (nick_realname[1..index]).to_string();
|
|
} else {
|
|
nick = String::new();
|
|
}
|
|
} else {
|
|
nick = String::new();
|
|
}
|
|
|
|
let msg = parts[3..].join(" ");
|
|
|
|
Self::PRIVMSG(nick, parts[2].to_string(), (msg[1..]).to_string())
|
|
}
|
|
Some(&("331" | "332")) => {
|
|
let topic = parts[4..].join(" ");
|
|
Self::TOPIC(parts[3].to_string(), (topic[1..]).to_string())
|
|
}
|
|
Some(&"333") => Self::TOPIC_BY(parts[4].to_string(), parts[5].to_string()),
|
|
Some(&"353") => {
|
|
let user = parts[5..].join(" ");
|
|
Self::NAMES(parts[4].to_string(), (user[1..]).to_string())
|
|
}
|
|
Some(&"PONG") => {
|
|
let server = parts[3];
|
|
Self::PONG(parts[2].to_string(), (server[1..]).to_string())
|
|
}
|
|
_ => Self::OTHER(new.to_string()),
|
|
}
|
|
}
|
|
}
|