Implemented basic IRC message handling.

Fun fact: The functionality is now similar to 6f3f8614d7.
This commit is contained in:
Thelie 2021-05-03 01:48:31 +02:00
parent d8ee914654
commit 66308f678f
2 changed files with 60 additions and 46 deletions

@ -1 +1 @@
Subproject commit 5d134f716dfe205c6ebef627f08d8330073cbf1d Subproject commit bf53e62f1713dfe83198f75992cc0e889de398ff

View file

@ -65,10 +65,13 @@ fn get_config<P: AsRef<Path>>(config_path: P)
Ok(Value::from(config)) Ok(Value::from(config))
} }
fn get_tcp_stream (config: &Value) -> Result<TcpStream, Box<dyn std::error::Error>> { fn get_tcp_stream (config: &Value)
-> Result<TcpStream, Box<dyn std::error::Error>> {
let address = format!("{}:{}", let address = format!("{}:{}",
config["server"].as_str().ok_or("Could not get server adress from config")?, config.get("server").unwrap().as_str()
config["port"].as_str().ok_or("Could not get port from config")? .ok_or("Could not get server adress from config")?,
config.get("port").unwrap().as_str()
.ok_or("Could not get port from config")?
); );
println!("Connectiing to: {}", address); println!("Connectiing to: {}", address);
Ok(TcpStream::connect(address)?) Ok(TcpStream::connect(address)?)
@ -85,14 +88,10 @@ fn get_tls_stream (config: &Value)
) )
} }
fn get_irc_identify_messages ( fn get_irc_identify_messages (config: &Value)
queue: VecDeque<Message>, -> Result<VecDeque<Message>, Box<dyn std::error::Error>> {
pass: Option<String>, let mut queue = VecDeque::new();
nick: String,
user: String,
real_name: String
) -> VecDeque<Message>{
let mut queue = queue;
queue.push_back(Message::from( queue.push_back(Message::from(
Command::CAP( Command::CAP(
None, None,
@ -100,22 +99,40 @@ fn get_irc_identify_messages (
None, None,
None None
))); )));
match pass {
match config.get("password") {
Some(p) => queue.push_back(Message::from( Some(p) => queue.push_back(Message::from(
Command::PASS(p) Command::PASS(
String::from(p.as_str().ok_or("Could not parse password.")?)
)
)), )),
None => () None => ()
} }
queue.push_back(Message::from(
Command::NICK(nick) let nick: String;
)); match config.get("nickname") {
queue.push_back(Message::from( Some(n) => {
nick = String::from(n.as_str().ok_or("Could not parse nickname.")?);
queue.push_back(Message::from(Command::NICK(nick.clone())));
},
None => return Err("No nickname supplied!".into()),
}
match config.get("username") {
Some(u) => queue.push_back(Message::from(
Command::USER( Command::USER(
user, String::from(u.as_str().ok_or("Could not parse username.")?),
"0".to_owned(), "0".to_owned(),
real_name) String::from(u.as_str().ok_or("Could not parse username.")?)
)); )
queue )),
None => queue.push_back(Message::from(
// nick.clone() is only used once because the value
// can be moved the second time
Command::USER(nick.clone(), "0".to_owned(), nick)
))
}
Ok(queue)
} }
fn main() { fn main() {
@ -135,20 +152,14 @@ fn main() {
stream = Box::new(IrcStream::new(get_tcp_stream(&config).unwrap())); stream = Box::new(IrcStream::new(get_tcp_stream(&config).unwrap()));
} }
let mut message_queue: VecDeque<Message> = VecDeque::new(); let mut message_queue = get_irc_identify_messages(&config).unwrap();
message_queue = get_irc_identify_messages(
message_queue,
None,
config["nickname"].to_string(),
config["nickname"].to_string(),
config["nickname"].to_string()
);
while let Some(message) = message_queue.pop_front() { while let Some(message) = message_queue.pop_front() {
stream.write(message).unwrap(); stream.write(message).unwrap();
} }
stream.flush().unwrap();
loop { loop {
let message = match stream.read() { let message = match stream.read() {
Ok(m) => m, Ok(m) => m,
@ -159,20 +170,23 @@ fn main() {
) )
) )
}; };
// let sender = match message.source_nickname() { let sender = match message.clone().source_nickname() {
// Some(s) => s.clone(), Some(s) => String::from(s),
// None => "anonymous" None => String::from("anonymous")
// }; };
match message.command { match message.clone().command {
Command::PING(_s1, _s2) => stream.write(Message::from( Command::PING(ref data, _) => {
Command::PONG(String::from("PONG"), None) stream.write(Message::from(
)).unwrap(), Command::PONG(data.to_owned(), None)
Command::PRIVMSG(rec, msg) => println!( )).unwrap();
"someone -> {}: {}", },
&rec, Command::PRIVMSG(ref rec, ref msg) => println!(
&msg "{} -> {}: {}",
rec,
msg,
sender
), ),
_ => () _ => println!("Other message: {}", message.clone().to_string())
} }
} }
} }