Refactored Command to own its data. Updated tests and examples.
This commit is contained in:
parent
73f6685114
commit
a43db2b5da
4 changed files with 450 additions and 307 deletions
|
@ -28,7 +28,7 @@ fn main() {
|
||||||
Ok(Command::PRIVMSG(_, msg)) => if msg.contains("bye") {
|
Ok(Command::PRIVMSG(_, msg)) => if msg.contains("bye") {
|
||||||
server.send_quit("").unwrap()
|
server.send_quit("").unwrap()
|
||||||
},
|
},
|
||||||
Ok(Command::ERROR(msg)) if msg.contains("Quit") => quit = true,
|
Ok(Command::ERROR(ref msg)) if msg.contains("Quit") => quit = true,
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -144,14 +144,15 @@ impl<T: IrcReader, U: IrcWriter> IrcServer<T, U> {
|
||||||
} else if resp == Response::RPL_ENDOFMOTD || resp == Response::ERR_NOMOTD {
|
} else if resp == Response::RPL_ENDOFMOTD || resp == Response::ERR_NOMOTD {
|
||||||
if self.config.nick_password() != "" {
|
if self.config.nick_password() != "" {
|
||||||
self.send(NICKSERV(
|
self.send(NICKSERV(
|
||||||
&format!("IDENTIFY {}", self.config.nick_password())
|
format!("IDENTIFY {}", self.config.nick_password())
|
||||||
)).unwrap();
|
)).unwrap();
|
||||||
}
|
}
|
||||||
if self.config.umodes() != "" {
|
if self.config.umodes() != "" {
|
||||||
self.send(MODE(self.config.nickname(), self.config.umodes(), None)).unwrap();
|
self.send(MODE(self.config.nickname().to_owned(),
|
||||||
|
self.config.umodes().to_owned(), None)).unwrap();
|
||||||
}
|
}
|
||||||
for chan in self.config.channels().into_iter() {
|
for chan in self.config.channels().into_iter() {
|
||||||
self.send(JOIN(&chan, None)).unwrap();
|
self.send(JOIN(chan.to_owned(), None)).unwrap();
|
||||||
}
|
}
|
||||||
} else if resp == Response::ERR_NICKNAMEINUSE ||
|
} else if resp == Response::ERR_NICKNAMEINUSE ||
|
||||||
resp == Response::ERR_ERRONEOUSNICKNAME {
|
resp == Response::ERR_ERRONEOUSNICKNAME {
|
||||||
|
@ -160,14 +161,14 @@ impl<T: IrcReader, U: IrcWriter> IrcServer<T, U> {
|
||||||
if *index >= alt_nicks.len() {
|
if *index >= alt_nicks.len() {
|
||||||
panic!("All specified nicknames were in use.")
|
panic!("All specified nicknames were in use.")
|
||||||
} else {
|
} else {
|
||||||
self.send(NICK(alt_nicks[*index])).unwrap();
|
self.send(NICK(alt_nicks[*index].to_owned())).unwrap();
|
||||||
*index += 1;
|
*index += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if &msg.command[..] == "PING" {
|
if &msg.command[..] == "PING" {
|
||||||
self.send(PONG(&msg.suffix.as_ref().unwrap()[..], None)).unwrap();
|
self.send(PONG(msg.suffix.as_ref().unwrap().to_owned(), None)).unwrap();
|
||||||
} else if cfg!(not(feature = "nochanlists")) &&
|
} else if cfg!(not(feature = "nochanlists")) &&
|
||||||
(&msg.command[..] == "JOIN" || &msg.command[..] == "PART") {
|
(&msg.command[..] == "JOIN" || &msg.command[..] == "PART") {
|
||||||
let chan = match msg.suffix {
|
let chan = match msg.suffix {
|
||||||
|
@ -243,7 +244,7 @@ impl<T: IrcReader, U: IrcWriter> IrcServer<T, U> {
|
||||||
/// Sends a CTCP-escaped message.
|
/// Sends a CTCP-escaped message.
|
||||||
#[cfg(feature = "ctcp")]
|
#[cfg(feature = "ctcp")]
|
||||||
fn send_ctcp(&self, target: &str, msg: &str) {
|
fn send_ctcp(&self, target: &str, msg: &str) {
|
||||||
self.send(Command::NOTICE(target, &format!("\u{001}{}\u{001}", msg)[..])).unwrap();
|
self.send(Command::NOTICE(target.to_owned(), format!("\u{001}{}\u{001}", msg))).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Handles CTCP requests if the CTCP feature is enabled.
|
/// Handles CTCP requests if the CTCP feature is enabled.
|
||||||
|
@ -421,7 +422,7 @@ mod test {
|
||||||
let server = IrcServer::from_connection(test_config(), Connection::new(
|
let server = IrcServer::from_connection(test_config(), Connection::new(
|
||||||
NullReader, Vec::new()
|
NullReader, Vec::new()
|
||||||
));
|
));
|
||||||
assert!(server.send(PRIVMSG("#test", "Hi there!")).is_ok());
|
assert!(server.send(PRIVMSG(format!("#test"), format!("Hi there!"))).is_ok());
|
||||||
assert_eq!(&get_server_value(server)[..], "PRIVMSG #test :Hi there!\r\n");
|
assert_eq!(&get_server_value(server)[..], "PRIVMSG #test :Hi there!\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#![stable]
|
#![stable]
|
||||||
|
|
||||||
use std::old_io::IoResult;
|
use std::old_io::IoResult;
|
||||||
|
use std::borrow::ToOwned;
|
||||||
use client::data::{Command, Config, User};
|
use client::data::{Command, Config, User};
|
||||||
use client::data::Command::{CAP, INVITE, JOIN, KICK, KILL, MODE, NICK, NOTICE};
|
use client::data::Command::{CAP, INVITE, JOIN, KICK, KILL, MODE, NICK, NOTICE};
|
||||||
use client::data::Command::{OPER, PASS, PONG, PRIVMSG, QUIT, SAMODE, SANICK, TOPIC, USER};
|
use client::data::Command::{OPER, PASS, PONG, PRIVMSG, QUIT, SAMODE, SANICK, TOPIC, USER};
|
||||||
|
@ -47,40 +48,40 @@ impl<'a, T: IrcReader, U: IrcWriter> Wrapper<'a, T, U> {
|
||||||
#[unstable = "Capabilities requests may be moved outside of identify."]
|
#[unstable = "Capabilities requests may be moved outside of identify."]
|
||||||
pub fn identify(&self) -> IoResult<()> {
|
pub fn identify(&self) -> IoResult<()> {
|
||||||
// We'll issue a CAP REQ for multi-prefix support to improve access level tracking.
|
// We'll issue a CAP REQ for multi-prefix support to improve access level tracking.
|
||||||
try!(self.server.send(CAP(REQ, Some("multi-prefix"))));
|
try!(self.server.send(CAP(REQ, Some("multi-prefix".to_owned()))));
|
||||||
try!(self.server.send(CAP(END, None))); // Then, send a CAP END to end the negotiation.
|
try!(self.server.send(CAP(END, None))); // Then, send a CAP END to end the negotiation.
|
||||||
if self.server.config().password() != "" {
|
if self.server.config().password() != "" {
|
||||||
try!(self.server.send(PASS(self.server.config().password())));
|
try!(self.server.send(PASS(self.server.config().password().to_owned())));
|
||||||
}
|
}
|
||||||
try!(self.server.send(NICK(self.server.config().nickname())));
|
try!(self.server.send(NICK(self.server.config().nickname().to_owned())));
|
||||||
try!(self.server.send(USER(self.server.config().username(), "0",
|
try!(self.server.send(USER(self.server.config().username().to_owned(), "0".to_owned(),
|
||||||
self.server.config().real_name())));
|
self.server.config().real_name().to_owned())));
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends a PONG with the specified message.
|
/// Sends a PONG with the specified message.
|
||||||
#[stable]
|
#[stable]
|
||||||
pub fn send_pong(&self, msg: &str) -> IoResult<()> {
|
pub fn send_pong(&self, msg: &str) -> IoResult<()> {
|
||||||
self.server.send(PONG(msg, None))
|
self.server.send(PONG(msg.to_owned(), None))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Joins the specified channel or chanlist.
|
/// Joins the specified channel or chanlist.
|
||||||
#[stable]
|
#[stable]
|
||||||
pub fn send_join(&self, chanlist: &str) -> IoResult<()> {
|
pub fn send_join(&self, chanlist: &str) -> IoResult<()> {
|
||||||
self.server.send(JOIN(chanlist, None))
|
self.server.send(JOIN(chanlist.to_owned(), None))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempts to oper up using the specified username and password.
|
/// Attempts to oper up using the specified username and password.
|
||||||
#[stable]
|
#[stable]
|
||||||
pub fn send_oper(&self, username: &str, password: &str) -> IoResult<()> {
|
pub fn send_oper(&self, username: &str, password: &str) -> IoResult<()> {
|
||||||
self.server.send(OPER(username, password))
|
self.server.send(OPER(username.to_owned(), password.to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends a message to the specified target.
|
/// Sends a message to the specified target.
|
||||||
#[stable]
|
#[stable]
|
||||||
pub fn send_privmsg(&self, target: &str, message: &str) -> IoResult<()> {
|
pub fn send_privmsg(&self, target: &str, message: &str) -> IoResult<()> {
|
||||||
for line in message.split_str("\r\n") {
|
for line in message.split_str("\r\n") {
|
||||||
try!(self.server.send(PRIVMSG(target, line)))
|
try!(self.server.send(PRIVMSG(target.to_owned(), line.to_owned())))
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -89,7 +90,7 @@ impl<'a, T: IrcReader, U: IrcWriter> Wrapper<'a, T, U> {
|
||||||
#[stable]
|
#[stable]
|
||||||
pub fn send_notice(&self, target: &str, message: &str) -> IoResult<()> {
|
pub fn send_notice(&self, target: &str, message: &str) -> IoResult<()> {
|
||||||
for line in message.split_str("\r\n") {
|
for line in message.split_str("\r\n") {
|
||||||
try!(self.server.send(NOTICE(target, line)))
|
try!(self.server.send(NOTICE(target.to_owned(), line.to_owned())))
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -98,27 +99,27 @@ impl<'a, T: IrcReader, U: IrcWriter> Wrapper<'a, T, U> {
|
||||||
/// If `topic` is an empty string, it won't be included in the message.
|
/// If `topic` is an empty string, it won't be included in the message.
|
||||||
#[unstable = "Design may change."]
|
#[unstable = "Design may change."]
|
||||||
pub fn send_topic(&self, channel: &str, topic: &str) -> IoResult<()> {
|
pub fn send_topic(&self, channel: &str, topic: &str) -> IoResult<()> {
|
||||||
self.server.send(TOPIC(channel, if topic.len() == 0 {
|
self.server.send(TOPIC(channel.to_owned(), if topic.len() == 0 {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(topic)
|
Some(topic.to_owned())
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Kills the target with the provided message.
|
/// Kills the target with the provided message.
|
||||||
#[stable]
|
#[stable]
|
||||||
pub fn send_kill(&self, target: &str, message: &str) -> IoResult<()> {
|
pub fn send_kill(&self, target: &str, message: &str) -> IoResult<()> {
|
||||||
self.server.send(KILL(target, message))
|
self.server.send(KILL(target.to_owned(), message.to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Kicks the listed nicknames from the listed channels with a comment.
|
/// Kicks the listed nicknames from the listed channels with a comment.
|
||||||
/// If `message` is an empty string, it won't be included in the message.
|
/// If `message` is an empty string, it won't be included in the message.
|
||||||
#[unstable = "Design may change."]
|
#[unstable = "Design may change."]
|
||||||
pub fn send_kick(&self, chanlist: &str, nicklist: &str, message: &str) -> IoResult<()> {
|
pub fn send_kick(&self, chanlist: &str, nicklist: &str, message: &str) -> IoResult<()> {
|
||||||
self.server.send(KICK(chanlist, nicklist, if message.len() == 0 {
|
self.server.send(KICK(chanlist.to_owned(), nicklist.to_owned(), if message.len() == 0 {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(message)
|
Some(message.to_owned())
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,10 +127,10 @@ impl<'a, T: IrcReader, U: IrcWriter> Wrapper<'a, T, U> {
|
||||||
/// If `modeparmas` is an empty string, it won't be included in the message.
|
/// If `modeparmas` is an empty string, it won't be included in the message.
|
||||||
#[unstable = "Design may change."]
|
#[unstable = "Design may change."]
|
||||||
pub fn send_mode(&self, target: &str, mode: &str, modeparams: &str) -> IoResult<()> {
|
pub fn send_mode(&self, target: &str, mode: &str, modeparams: &str) -> IoResult<()> {
|
||||||
self.server.send(MODE(target, mode, if modeparams.len() == 0 {
|
self.server.send(MODE(target.to_owned(), mode.to_owned(), if modeparams.len() == 0 {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(modeparams)
|
Some(modeparams.to_owned())
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,23 +138,23 @@ impl<'a, T: IrcReader, U: IrcWriter> Wrapper<'a, T, U> {
|
||||||
/// If `modeparams` is an empty string, it won't be included in the message.
|
/// If `modeparams` is an empty string, it won't be included in the message.
|
||||||
#[unstable = "Design may change."]
|
#[unstable = "Design may change."]
|
||||||
pub fn send_samode(&self, target: &str, mode: &str, modeparams: &str) -> IoResult<()> {
|
pub fn send_samode(&self, target: &str, mode: &str, modeparams: &str) -> IoResult<()> {
|
||||||
self.server.send(SAMODE(target, mode, if modeparams.len() == 0 {
|
self.server.send(SAMODE(target.to_owned(), mode.to_owned(), if modeparams.len() == 0 {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(modeparams)
|
Some(modeparams.to_owned())
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Forces a user to change from the old nickname to the new nickname.
|
/// Forces a user to change from the old nickname to the new nickname.
|
||||||
#[stable]
|
#[stable]
|
||||||
pub fn send_sanick(&self, old_nick: &str, new_nick: &str) -> IoResult<()> {
|
pub fn send_sanick(&self, old_nick: &str, new_nick: &str) -> IoResult<()> {
|
||||||
self.server.send(SANICK(old_nick, new_nick))
|
self.server.send(SANICK(old_nick.to_owned(), new_nick.to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Invites a user to the specified channel.
|
/// Invites a user to the specified channel.
|
||||||
#[stable]
|
#[stable]
|
||||||
pub fn send_invite(&self, nick: &str, chan: &str) -> IoResult<()> {
|
pub fn send_invite(&self, nick: &str, chan: &str) -> IoResult<()> {
|
||||||
self.server.send(INVITE(nick, chan))
|
self.server.send(INVITE(nick.to_owned(), chan.to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Quits the server entirely with a message.
|
/// Quits the server entirely with a message.
|
||||||
|
@ -161,9 +162,9 @@ impl<'a, T: IrcReader, U: IrcWriter> Wrapper<'a, T, U> {
|
||||||
#[unstable = "Design may change."]
|
#[unstable = "Design may change."]
|
||||||
pub fn send_quit(&self, msg: &str) -> IoResult<()> {
|
pub fn send_quit(&self, msg: &str) -> IoResult<()> {
|
||||||
self.server.send(QUIT(Some(if msg.len() == 0 {
|
self.server.send(QUIT(Some(if msg.len() == 0 {
|
||||||
"Powered by Rust."
|
"Powered by Rust.".to_owned()
|
||||||
} else {
|
} else {
|
||||||
msg
|
msg.to_owned()
|
||||||
})))
|
})))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue