Skip to content

Commit

Permalink
Show all NOTICE messages in server tabs
Browse files Browse the repository at this point in the history
(fixes #21)
  • Loading branch information
osa1 committed Jan 14, 2018
1 parent 6f43d2d commit c2f5392
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 52 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
- Fixed a bug that caused incorrect tab bar rendering in some cases (#76).
- tiny no longer creates `~/logs` directory. This directory was used for debug
logs in the past (#82).
- `NOTICE` messages (used by services like `NickServ`, `MemoServ`, `Global`
etc.) are now shown in server tabs unless there's already a tab for the sender
(#21).

# 2017/11/12: 0.3.0

Expand Down
50 changes: 19 additions & 31 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -341,21 +341,8 @@ impl<'poll> Tiny<'poll> {
MsgSource::User {
ref serv_name,
ref nick,
} => {
let msg_target = if nick.eq_ignore_ascii_case("nickserv")
|| nick.eq_ignore_ascii_case("chanserv")
{
MsgTarget::Server {
serv_name: serv_name,
}
} else {
MsgTarget::User {
serv_name: serv_name,
nick: nick,
}
};
(msg_target, nick, serv_name)
}
} =>
(MsgTarget::User { serv_name, nick }, nick, serv_name),
}
};

Expand Down Expand Up @@ -509,7 +496,7 @@ impl<'poll> Tiny<'poll> {
let conn = &self.conns[conn_idx];
let pfx = msg.pfx;
match msg.cmd {
Cmd::PRIVMSG { target, msg } | Cmd::NOTICE { target, msg } => {
Cmd::PRIVMSG { target, msg, is_notice } => {
let pfx = match pfx {
Some(pfx) =>
pfx,
Expand All @@ -521,6 +508,8 @@ impl<'poll> Tiny<'poll> {
return;
}
};

// sender to be shown in the UI
let origin = match pfx {
Pfx::Server(_) =>
conn.get_serv_name(),
Expand Down Expand Up @@ -573,21 +562,20 @@ impl<'poll> Tiny<'poll> {
}
wire::MsgTarget::User(target) => {
let serv_name = conn.get_serv_name();
let msg_target = match pfx {
Pfx::Server(_) =>
MsgTarget::Server {
serv_name: serv_name,
},
Pfx::User { ref nick, .. } if nick.eq_ignore_ascii_case("nickserv") ||
nick.eq_ignore_ascii_case("chanserv") =>
MsgTarget::Server {
serv_name: serv_name,
},
Pfx::User { ref nick, .. } =>
MsgTarget::User {
serv_name: serv_name,
nick: nick,
},
let msg_target = {
match pfx {
Pfx::Server(_) =>
MsgTarget::Server { serv_name },
Pfx::User { ref nick, .. } => {
// show NOTICE messages in server tabs if we don't have a tab
// for the sender already (see #21)
if is_notice && !self.tui.does_user_tab_exist(serv_name, nick) {
MsgTarget::Server { serv_name }
} else {
MsgTarget::User { serv_name, nick }
}
}
}
};
self.tui
.add_privmsg(origin, msg, ts, &msg_target, is_ctcp_action);
Expand Down
5 changes: 4 additions & 1 deletion src/tui/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ impl TUI {
pub fn get_nicks(&self, serv_name: &str, chan_name: &str) -> Option<&Trie> {
self.ui.get_nicks(serv_name, chan_name)
}

pub fn does_user_tab_exist(&self, serv_name: &str, nick: &str) -> bool {
self.ui.does_user_tab_exist(serv_name, nick)
}
}

////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -177,7 +181,6 @@ impl TUI {
// Showing messages

/// Target of a message coming from an IRC server.
/// `size_of::<MsgTarget>() == 40`. Good idea to pass by reference.
pub enum MsgTarget<'a> {
Server {
serv_name: &'a str,
Expand Down
11 changes: 11 additions & 0 deletions src/tui/tabbed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1032,6 +1032,17 @@ impl Tabbed {
}
}

pub fn does_user_tab_exist(&self, serv_name_: &str, nick_: &str) -> bool {
for tab in &self.tabs {
if let MsgSource::User { ref serv_name, ref nick } = tab.src {
if serv_name_ == serv_name && nick_ == nick {
return true;
}
}
}
false
}

////////////////////////////////////////////////////////////////////////////
// Helpers

Expand Down
26 changes: 6 additions & 20 deletions src/wire.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,13 @@ pub struct Msg {

#[derive(Debug, PartialEq, Eq)]
pub enum Cmd {
/// A PRIVMSG or NOTICE. Check `is_notice` field.
PRIVMSG {
// TODO: In theory this should be a list of targets, but in practice I've never
// encountered that case.
target: MsgTarget,
msg: String,
},

NOTICE {
target: MsgTarget,
msg: String,
is_notice: bool,
},

JOIN {
Expand Down Expand Up @@ -224,7 +221,8 @@ impl Msg {

let params: Vec<&str> = parse_params(unsafe { str::from_utf8_unchecked(slice) });
let cmd = match msg_ty {
MsgType::Cmd("PRIVMSG") if params.len() == 2 => {
MsgType::Cmd("PRIVMSG") | MsgType::Cmd("NOTICE") if params.len() == 2 => {
let is_notice = if let MsgType::Cmd("NOTICE") = msg_ty { true } else { false };
let target = params[0];
let msg = params[1];
let target = if target.chars().nth(0) == Some('#') {
Expand All @@ -233,21 +231,9 @@ impl Msg {
MsgTarget::User(target.to_owned())
};
Cmd::PRIVMSG {
target: target,
msg: msg.to_owned(),
}
}
MsgType::Cmd("NOTICE") if params.len() == 2 => {
let target = params[0];
let msg = params[1];
let target = if target.chars().nth(0) == Some('#') {
MsgTarget::Chan(target.to_owned())
} else {
MsgTarget::User(target.to_owned())
};
Cmd::NOTICE {
target: target,
target,
msg: msg.to_owned(),
is_notice,
}
}
MsgType::Cmd("JOIN") if params.len() == 1 => {
Expand Down

0 comments on commit c2f5392

Please sign in to comment.