diff --git a/bridge.go b/bridge.go index e69f519..845e337 100644 --- a/bridge.go +++ b/bridge.go @@ -58,7 +58,7 @@ func sendTopic(dc *downstreamConn, ch *upstreamChannel) { topicTime := strconv.FormatInt(ch.TopicTime.Unix(), 10) dc.SendMessage(&irc.Message{ Prefix: dc.srv.prefix(), - Command: rpl_topicwhotime, + Command: xirc.RPL_TOPICWHOTIME, Params: []string{dc.nick, downstreamName, topicWho.String(), topicTime}, }) } diff --git a/downstream.go b/downstream.go index 580c911..c4985ff 100644 --- a/downstream.go +++ b/downstream.go @@ -876,7 +876,7 @@ func (dc *downstreamConn) handleCapCommand(cmd string, args []string) error { case "REQ": if len(args) == 0 { return ircError{&irc.Message{ - Command: err_invalidcapcmd, + Command: xirc.ERR_INVALIDCAPCMD, Params: []string{dc.nick, cmd, "Missing argument in CAP REQ command"}, }} } @@ -935,7 +935,7 @@ func (dc *downstreamConn) handleCapCommand(cmd string, args []string) error { } default: return ircError{&irc.Message{ - Command: err_invalidcapcmd, + Command: xirc.ERR_INVALIDCAPCMD, Params: []string{dc.nick, cmd, "Unknown CAP command"}, }} } @@ -1187,7 +1187,7 @@ func (dc *downstreamConn) updateHost() { } else if uc.hostname != dc.hostname { dc.SendMessage(&irc.Message{ Prefix: dc.prefix(), - Command: rpl_visiblehost, + Command: xirc.RPL_VISIBLEHOST, Params: []string{dc.nick, uc.hostname, "is now your visible host"}, }) } @@ -1790,7 +1790,7 @@ func (dc *downstreamConn) handleMessageRegistered(ctx context.Context, msg *irc. if dc.network == nil { return ircError{&irc.Message{ - Command: err_unknownerror, + Command: xirc.ERR_UNKNOWNERROR, Params: []string{dc.nick, "NICK", "Cannot change nickname on the bouncer connection"}, }} } @@ -2138,7 +2138,7 @@ func (dc *downstreamConn) handleMessageRegistered(ctx context.Context, msg *irc. if ch.creationTime != "" { dc.SendMessage(&irc.Message{ Prefix: dc.srv.prefix(), - Command: rpl_creationtime, + Command: xirc.RPL_CREATIONTIME, Params: []string{dc.nick, name, ch.creationTime}, }) } @@ -2375,7 +2375,7 @@ func (dc *downstreamConn) handleMessageRegistered(ctx context.Context, msg *irc. } dc.SendMessage(&irc.Message{ Prefix: dc.srv.prefix(), - Command: rpl_whoisaccount, + Command: xirc.RPL_WHOISACCOUNT, Params: []string{dc.nick, dc.nick, dc.user.Username, "is logged in as"}, }) dc.SendMessage(&irc.Message{ @@ -2403,12 +2403,12 @@ func (dc *downstreamConn) handleMessageRegistered(ctx context.Context, msg *irc. }) dc.SendMessage(&irc.Message{ Prefix: dc.srv.prefix(), - Command: rpl_whoisaccount, + Command: xirc.RPL_WHOISACCOUNT, Params: []string{dc.nick, serviceNick, serviceNick, "is logged in as"}, }) dc.SendMessage(&irc.Message{ Prefix: dc.srv.prefix(), - Command: rpl_whoisbot, + Command: xirc.RPL_WHOISBOT, Params: []string{dc.nick, serviceNick, "is a bot"}, }) dc.SendMessage(&irc.Message{ diff --git a/irc.go b/irc.go index 8e352a3..71f1c30 100644 --- a/irc.go +++ b/irc.go @@ -16,29 +16,6 @@ import ( // TODO: generalize and move helpers to the xirc package -const ( - rpl_statsping = "246" - rpl_localusers = "265" - rpl_globalusers = "266" - rpl_whoiscertfp = "276" - rpl_whoisregnick = "307" - rpl_whoisspecial = "320" - rpl_creationtime = "329" - rpl_whoisaccount = "330" - rpl_topicwhotime = "333" - rpl_whoisactually = "338" - rpl_whospcrpl = "354" - rpl_whoishost = "378" - rpl_whoismodes = "379" - rpl_visiblehost = "396" - err_unknownerror = "400" - err_invalidcapcmd = "410" - rpl_whoissecure = "671" - - // https://ircv3.net/specs/extensions/bot-mode - rpl_whoisbot = "335" -) - const ( maxMessageLength = 512 maxMessageParams = 15 @@ -787,7 +764,7 @@ func generateWHOXReply(prefix *irc.Prefix, nick, fields string, info *whoxInfo) return &irc.Message{ Prefix: prefix, - Command: rpl_whospcrpl, + Command: xirc.RPL_WHOSPCRPL, Params: append([]string{nick}, values...), } } diff --git a/upstream.go b/upstream.go index ea93f5e..4b24fdd 100644 --- a/upstream.go +++ b/upstream.go @@ -693,7 +693,7 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err dc.updateAccount() dc.updateHost() }) - case rpl_visiblehost: + case xirc.RPL_VISIBLEHOST: var rawHost string if err := parseMessageParams(msg, nil, &rawHost); err != nil { return err @@ -1236,7 +1236,7 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err }) }) } - case rpl_creationtime: + case xirc.RPL_CREATIONTIME: var channel, creationTime string if err := parseMessageParams(msg, nil, &channel, &creationTime); err != nil { return err @@ -1255,12 +1255,12 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err uc.forEachDownstream(func(dc *downstreamConn) { dc.SendMessage(&irc.Message{ Prefix: dc.srv.prefix(), - Command: rpl_creationtime, + Command: xirc.RPL_CREATIONTIME, Params: []string{dc.nick, dc.marshalEntity(uc.network, ch.Name), creationTime}, }) }) } - case rpl_topicwhotime: + case xirc.RPL_TOPICWHOTIME: var channel, who, timeStr string if err := parseMessageParams(msg, nil, &channel, &who, &timeStr); err != nil { return err @@ -1285,7 +1285,7 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err topicWho := dc.marshalUserPrefix(uc.network, ch.TopicWho) dc.SendMessage(&irc.Message{ Prefix: dc.srv.prefix(), - Command: rpl_topicwhotime, + Command: xirc.RPL_TOPICWHOTIME, Params: []string{ dc.nick, dc.marshalEntity(uc.network, ch.Name), @@ -1417,7 +1417,7 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err Command: irc.RPL_WHOREPLY, Params: []string{dc.nick, channel, username, host, server, nick, flags, trailing}, }) - case rpl_whospcrpl: + case xirc.RPL_WHOSPCRPL: dc, cmd := uc.currentPendingCommand("WHO") if cmd == nil { return fmt.Errorf("unexpected RPL_WHOSPCRPL: no matching pending WHO") @@ -1449,7 +1449,7 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err Command: irc.RPL_ENDOFWHO, Params: []string{dc.nick, mask, "End of /WHO list"}, }) - case rpl_whoiscertfp, rpl_whoisregnick, irc.RPL_WHOISUSER, irc.RPL_WHOISSERVER, irc.RPL_WHOISOPERATOR, irc.RPL_WHOISIDLE, rpl_whoisspecial, rpl_whoisaccount, rpl_whoisactually, rpl_whoishost, rpl_whoismodes, rpl_whoissecure: + case xirc.RPL_WHOISCERTFP, xirc.RPL_WHOISREGNICK, irc.RPL_WHOISUSER, irc.RPL_WHOISSERVER, irc.RPL_WHOISOPERATOR, irc.RPL_WHOISIDLE, xirc.RPL_WHOISSPECIAL, xirc.RPL_WHOISACCOUNT, xirc.RPL_WHOISACTUALLY, xirc.RPL_WHOISHOST, xirc.RPL_WHOISMODES, xirc.RPL_WHOISSECURE: var nick string if err := parseMessageParams(msg, nil, &nick); err != nil { return err @@ -1730,9 +1730,9 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err // Ignore case irc.RPL_LUSERCLIENT, irc.RPL_LUSEROP, irc.RPL_LUSERUNKNOWN, irc.RPL_LUSERCHANNELS, irc.RPL_LUSERME: fallthrough - case irc.RPL_STATSVLINE, rpl_statsping, irc.RPL_STATSBLINE, irc.RPL_STATSDLINE: + case irc.RPL_STATSVLINE, xirc.RPL_STATSPING, irc.RPL_STATSBLINE, irc.RPL_STATSDLINE: fallthrough - case rpl_localusers, rpl_globalusers: + case xirc.RPL_LOCALUSERS, xirc.RPL_GLOBALUSERS: fallthrough case irc.RPL_MOTDSTART, irc.RPL_MOTD: // Ignore these messages if they're part of the initial registration diff --git a/xirc/xirc.go b/xirc/xirc.go index 6d65272..6271d9b 100644 --- a/xirc/xirc.go +++ b/xirc/xirc.go @@ -8,6 +8,29 @@ import ( "gopkg.in/irc.v3" ) +const ( + RPL_STATSPING = "246" + RPL_LOCALUSERS = "265" + RPL_GLOBALUSERS = "266" + RPL_WHOISCERTFP = "276" + RPL_WHOISREGNICK = "307" + RPL_WHOISSPECIAL = "320" + RPL_CREATIONTIME = "329" + RPL_WHOISACCOUNT = "330" + RPL_TOPICWHOTIME = "333" + RPL_WHOISACTUALLY = "338" + RPL_WHOSPCRPL = "354" + RPL_WHOISHOST = "378" + RPL_WHOISMODES = "379" + RPL_VISIBLEHOST = "396" + ERR_UNKNOWNERROR = "400" + ERR_INVALIDCAPCMD = "410" + RPL_WHOISSECURE = "671" + + // https://ircv3.net/specs/extensions/bot-mode + RPL_WHOISBOT = "335" +) + // The server-time layout, as defined in the IRCv3 spec. const ServerTimeLayout = "2006-01-02T15:04:05.000Z"