From bb64d38684521d626a335ecb394f314c793d3bda Mon Sep 17 00:00:00 2001 From: Jeremy Latt Date: Mon, 17 Feb 2014 21:30:14 -0800 Subject: [PATCH] implement who reply like ngircd --- irc/client.go | 1 + irc/reply.go | 26 ++++++++++++++++++++++---- irc/server.go | 14 ++++++++------ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/irc/client.go b/irc/client.go index 059cbcbe..3eaa0d68 100644 --- a/irc/client.go +++ b/irc/client.go @@ -19,6 +19,7 @@ type Client struct { ctime time.Time flags map[UserMode]bool friends map[*Client]uint + hops uint hostname string idleTimer *time.Timer loginTimer *time.Timer diff --git a/irc/reply.go b/irc/reply.go index 3eaad9cb..8585ff1e 100644 --- a/irc/reply.go +++ b/irc/reply.go @@ -341,14 +341,32 @@ func RplChannelModeIs(channel *Channel) Reply { // ( "H" / "G" ) ["*"] [ ( "@" / "+" ) ] // : -func RplWhoReply(server *Server, channel *Channel, client *Client) Reply { +func RplWhoReply(channel *Channel, client *Client) Reply { channelName := "*" + flags := "" + + if client.flags[Away] { + flags = "G" + } else { + flags = "H" + } + if client.flags[Operator] { + flags += "*" + } + if channel != nil { channelName = channel.name + + if channel.members[client][ChannelOperator] { + flags += "@" + } else if channel.members[client][Voice] { + flags += "+" + } } - return NewNumericReply(server, RPL_WHOREPLY, "%s %s %s %s %s H :0 %s", - channelName, client.username, client.hostname, server.name, client.Nick(), - client.realname) + return NewNumericReply(client.server, RPL_WHOREPLY, + "%s %s %s %s %s %s :%d %s", + channelName, client.username, client.hostname, client.server.name, + client.Nick(), flags, client.hops, client.realname) } // :End of WHO list diff --git a/irc/server.go b/irc/server.go index d3caa842..6c59145b 100644 --- a/irc/server.go +++ b/irc/server.go @@ -477,9 +477,11 @@ func (msg *ChannelModeCommand) HandleServer(server *Server) { channel.Mode(client, msg.changes) } -func whoChannel(client *Client, server *Server, channel *Channel) { +func whoChannel(client *Client, channel *Channel) { for member := range channel.members { - client.Reply(RplWhoReply(server, channel, member)) + if !client.flags[Invisible] { + client.Reply(RplWhoReply(channel, member)) + } } } @@ -490,17 +492,17 @@ func (msg *WhoCommand) HandleServer(server *Server) { mask := string(msg.mask) if mask == "" { for _, channel := range server.channels { - whoChannel(client, server, channel) + whoChannel(client, channel) } } else if IsChannel(mask) { channel := server.channels[mask] if channel != nil { - whoChannel(client, server, channel) + whoChannel(client, channel) } } else { mclient := server.clients[mask] - if mclient != nil { - client.Reply(RplWhoReply(server, mclient.channels.First(), mclient)) + if mclient != nil && !mclient.flags[Invisible] { + client.Reply(RplWhoReply(nil, mclient)) } }