From e33a81052271c25eb350dc2112332c981fe845aa Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Sun, 14 Aug 2016 11:59:33 +1000 Subject: [PATCH] capability: Add extended-join and userhost-in-names --- CHANGELOG.md | 2 ++ irc/capability.go | 14 +++++++++----- irc/channel.go | 19 ++++++++++++++++--- irc/client.go | 2 ++ irc/server.go | 2 +- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00584644..c5361565 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,9 @@ Initial release of Oragono! * We now advertise the [`RPL_ISUPPORT`](http://modern.ircdocs.horse/#rplisupport-005) numeric. * Parse new mode change syntax commonly used these days (i.e. `+h-ov dan dan dan`). * User mode for clients connected via TLS (`+Z`). +* Support for [`extended-join`](http://ircv3.net/specs/extensions/extended-join-3.1.html). * Support for [`server-time`](http://ircv3.net/specs/extensions/server-time-3.2.html). +* Support for [`userhost-in-names`](http://ircv3.net/specs/extensions/userhost-in-names-3.2.html). ### Changed * Added channel Founder/Admin/Halfops (`qah`) privileges, and removed channel creator (`O`) privilege (from RFC2812, not used in the real world). diff --git a/irc/capability.go b/irc/capability.go index 4156c544..6f784d8d 100644 --- a/irc/capability.go +++ b/irc/capability.go @@ -14,15 +14,19 @@ import ( type Capability string const ( - MultiPrefix Capability = "multi-prefix" - SASL Capability = "sasl" - ServerTime Capability = "server-time" + ExtendedJoin Capability = "extended-join" + MultiPrefix Capability = "multi-prefix" + SASL Capability = "sasl" + ServerTime Capability = "server-time" + UserhostInNames Capability = "userhost-in-names" ) var ( SupportedCapabilities = CapabilitySet{ - MultiPrefix: true, - ServerTime: true, + ExtendedJoin: true, + MultiPrefix: true, + ServerTime: true, + UserhostInNames: true, } ) diff --git a/irc/channel.go b/irc/channel.go index c64caf8f..b2c2dec1 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -109,11 +109,16 @@ func (modes ChannelModeSet) Prefixes(isMultiPrefix bool) string { func (channel *Channel) Nicks(target *Client) []string { isMultiPrefix := (target != nil) && target.capabilities[MultiPrefix] + isUserhostInNames := (target != nil) && target.capabilities[UserhostInNames] nicks := make([]string, len(channel.members)) i := 0 for client, modes := range channel.members { nicks[i] += modes.Prefixes(isMultiPrefix) - nicks[i] += client.Nick().String() + if isUserhostInNames { + nicks[i] += client.nickMaskString + } else { + nicks[i] += client.nickString + } i += 1 } return nicks @@ -203,7 +208,11 @@ func (channel *Channel) Join(client *Client, key string) { } for member := range channel.members { - member.Send(nil, client.nickMaskString, "JOIN", channel.nameString) + if member.capabilities[ExtendedJoin] { + member.Send(nil, client.nickMaskString, "JOIN", channel.nameString, client.accountName, client.realname) + } else { + member.Send(nil, client.nickMaskString, "JOIN", channel.nameString) + } } client.channels.Add(channel) @@ -214,7 +223,11 @@ func (channel *Channel) Join(client *Client, key string) { channel.members[client][ChannelOperator] = true } - client.Send(nil, client.nickMaskString, "JOIN", channel.nameString) + if client.capabilities[ExtendedJoin] { + client.Send(nil, client.nickMaskString, "JOIN", channel.nameString, client.accountName, client.realname) + } else { + client.Send(nil, client.nickMaskString, "JOIN", channel.nameString) + } channel.GetTopic(client) channel.Names(client) } diff --git a/irc/client.go b/irc/client.go index 2c4a2f4e..80b98465 100644 --- a/irc/client.go +++ b/irc/client.go @@ -45,6 +45,7 @@ type Client struct { nickMaskString string // cache for nickmask string since it's used with lots of replies quitTimer *time.Timer realname string + accountName string registered bool server *Server socket *Socket @@ -65,6 +66,7 @@ func NewClient(server *Server, conn net.Conn, isTLS bool) *Client { flags: make(map[UserMode]bool), server: server, socket: &socket, + accountName: "*", // * is used until actual account name is set nickString: "*", // * is used until actual nick is given } if isTLS { diff --git a/irc/server.go b/irc/server.go index f488dfc9..e9c6b7aa 100644 --- a/irc/server.go +++ b/irc/server.go @@ -423,7 +423,7 @@ func userHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { client.username = Name("~" + msg.Params[0]) client.updateNickMask() } - if client.realname != "" { + if client.realname == "" { client.realname = msg.Params[3] }