From 275227a46155a2b97ff9a3efeca807307cea8fac Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 22 Jan 2018 21:26:01 +1000 Subject: [PATCH] Make like every client-facing string translatable --- irc/accountreg.go | 30 +++++----- irc/accounts.go | 26 ++++----- irc/capability.go | 2 +- irc/channel.go | 46 +++++++-------- irc/chanserv.go | 16 +++--- irc/client.go | 25 ++++---- irc/commands.go | 8 +-- irc/dline.go | 28 ++++----- irc/gateways.go | 6 +- irc/help.go | 8 +-- irc/kline.go | 24 ++++---- irc/modes.go | 18 +++--- irc/monitor.go | 6 +- irc/nickname.go | 10 ++-- irc/nickserv.go | 2 +- irc/roleplay.go | 14 ++--- irc/server.go | 144 ++++++++++++++++++++++------------------------ 17 files changed, 205 insertions(+), 208 deletions(-) diff --git a/irc/accountreg.go b/irc/accountreg.go index 19f182f2..d4c66e27 100644 --- a/irc/accountreg.go +++ b/irc/accountreg.go @@ -67,9 +67,9 @@ func accHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if subcommand == "register" { return accRegisterHandler(server, client, msg) } else if subcommand == "verify" { - client.Notice("VERIFY is not yet implemented") + client.Notice(client.t("VERIFY is not yet implemented")) } else { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "ACC", msg.Params[0], "Unknown subcommand") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "ACC", msg.Params[0], client.t("Unknown subcommand")) } return false @@ -91,7 +91,7 @@ func removeFailedAccRegisterData(store *buntdb.DB, account string) { func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // make sure reg is enabled if !server.accountRegistration.Enabled { - client.Send(nil, server.name, ERR_REG_UNSPECIFIED_ERROR, client.nick, "*", "Account registration is disabled") + client.Send(nil, server.name, ERR_REG_UNSPECIFIED_ERROR, client.nick, "*", client.t("Account registration is disabled")) return false } @@ -100,7 +100,7 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b if server.accountRegistration.AllowMultiplePerConnection { client.LogoutOfAccount() } else { - client.Send(nil, server.name, ERR_REG_UNSPECIFIED_ERROR, client.nick, "*", "You're already logged into an account") + client.Send(nil, server.name, ERR_REG_UNSPECIFIED_ERROR, client.nick, "*", client.t("You're already logged into an account")) return false } } @@ -110,7 +110,7 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b casefoldedAccount, err := CasefoldName(account) // probably don't need explicit check for "*" here... but let's do it anyway just to make sure if err != nil || msg.Params[1] == "*" { - client.Send(nil, server.name, ERR_REG_UNSPECIFIED_ERROR, client.nick, account, "Account name is not valid") + client.Send(nil, server.name, ERR_REG_UNSPECIFIED_ERROR, client.nick, account, client.t("Account name is not valid")) return false } @@ -122,7 +122,7 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b _, err := tx.Get(accountKey) if err != buntdb.ErrNotFound { //TODO(dan): if account verified key doesn't exist account is not verified, calc the maximum time without verification and expire and continue if need be - client.Send(nil, server.name, ERR_ACCOUNT_ALREADY_EXISTS, client.nick, account, "Account already exists") + client.Send(nil, server.name, ERR_ACCOUNT_ALREADY_EXISTS, client.nick, account, client.t("Account already exists")) return errAccountCreation } @@ -137,7 +137,7 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b // account could not be created and relevant numerics have been dispatched, abort if err != nil { if err != errAccountCreation { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "ACC", "REGISTER", "Could not register") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "ACC", "REGISTER", client.t("Could not register")) log.Println("Could not save registration initial data:", err.Error()) } return false @@ -167,7 +167,7 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b } if !callbackValid { - client.Send(nil, server.name, ERR_REG_INVALID_CALLBACK, client.nick, account, callbackNamespace, "Callback namespace is not supported") + client.Send(nil, server.name, ERR_REG_INVALID_CALLBACK, client.nick, account, callbackNamespace, client.t("Callback namespace is not supported")) removeFailedAccRegisterData(server.store, casefoldedAccount) return false } @@ -182,7 +182,7 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b credentialType = "passphrase" // default from the spec credentialValue = msg.Params[3] } else { - client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, "Not enough parameters") + client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, client.t("Not enough parameters")) removeFailedAccRegisterData(server.store, casefoldedAccount) return false } @@ -195,13 +195,13 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b } } if credentialType == "certfp" && client.certfp == "" { - client.Send(nil, server.name, ERR_REG_INVALID_CRED_TYPE, client.nick, credentialType, callbackNamespace, "You are not using a TLS certificate") + client.Send(nil, server.name, ERR_REG_INVALID_CRED_TYPE, client.nick, credentialType, callbackNamespace, client.t("You are not using a TLS certificate")) removeFailedAccRegisterData(server.store, casefoldedAccount) return false } if !credentialValid { - client.Send(nil, server.name, ERR_REG_INVALID_CRED_TYPE, client.nick, credentialType, callbackNamespace, "Credential type is not supported") + client.Send(nil, server.name, ERR_REG_INVALID_CRED_TYPE, client.nick, credentialType, callbackNamespace, client.t("Credential type is not supported")) removeFailedAccRegisterData(server.store, casefoldedAccount) return false } @@ -274,14 +274,14 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b server.accounts[casefoldedAccount] = &account client.account = &account - client.Send(nil, server.name, RPL_REGISTRATION_SUCCESS, client.nick, account.Name, "Account created") - client.Send(nil, server.name, RPL_LOGGEDIN, client.nick, client.nickMaskString, account.Name, fmt.Sprintf("You are now logged in as %s", account.Name)) - client.Send(nil, server.name, RPL_SASLSUCCESS, client.nick, "Authentication successful") + client.Send(nil, server.name, RPL_REGISTRATION_SUCCESS, client.nick, account.Name, client.t("Account created")) + client.Send(nil, server.name, RPL_LOGGEDIN, client.nick, client.nickMaskString, account.Name, fmt.Sprintf(client.t("You are now logged in as %s"), account.Name)) + client.Send(nil, server.name, RPL_SASLSUCCESS, client.nick, client.t("Authentication successful")) server.snomasks.Send(sno.LocalAccounts, fmt.Sprintf(ircfmt.Unescape("Account registered $c[grey][$r%s$c[grey]] by $c[grey][$r%s$c[grey]]"), account.Name, client.nickMaskString)) return nil }) if err != nil { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "ACC", "REGISTER", "Could not register") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "ACC", "REGISTER", client.t("Could not register")) log.Println("Could not save verification confirmation (*):", err.Error()) removeFailedAccRegisterData(server.store, casefoldedAccount) return false diff --git a/irc/accounts.go b/irc/accounts.go index 2bc52994..fa529b20 100644 --- a/irc/accounts.go +++ b/irc/accounts.go @@ -91,7 +91,7 @@ func loadAccount(server *Server, tx *buntdb.Tx, accountKey string) *ClientAccoun func authenticateHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // sasl abort if !server.accountAuthenticationEnabled || len(msg.Params) == 1 && msg.Params[0] == "*" { - client.Send(nil, server.name, ERR_SASLABORTED, client.nick, "SASL authentication aborted") + client.Send(nil, server.name, ERR_SASLABORTED, client.nick, client.t("SASL authentication aborted")) client.saslInProgress = false client.saslMechanism = "" client.saslValue = "" @@ -108,7 +108,7 @@ func authenticateHandler(server *Server, client *Client, msg ircmsg.IrcMessage) client.saslMechanism = mechanism client.Send(nil, server.name, "AUTHENTICATE", "+") } else { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed")) } return false @@ -118,7 +118,7 @@ func authenticateHandler(server *Server, client *Client, msg ircmsg.IrcMessage) rawData := msg.Params[0] if len(rawData) > 400 { - client.Send(nil, server.name, ERR_SASLTOOLONG, client.nick, "SASL message too long") + client.Send(nil, server.name, ERR_SASLTOOLONG, client.nick, client.t("SASL message too long")) client.saslInProgress = false client.saslMechanism = "" client.saslValue = "" @@ -127,7 +127,7 @@ func authenticateHandler(server *Server, client *Client, msg ircmsg.IrcMessage) client.saslValue += rawData // allow 4 'continuation' lines before rejecting for length if len(client.saslValue) > 400*4 { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed: Passphrase too long") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed: Passphrase too long")) client.saslInProgress = false client.saslMechanism = "" client.saslValue = "" @@ -144,7 +144,7 @@ func authenticateHandler(server *Server, client *Client, msg ircmsg.IrcMessage) if client.saslValue != "+" { data, err = base64.StdEncoding.DecodeString(client.saslValue) if err != nil { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed: Invalid b64 encoding") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed: Invalid b64 encoding")) client.saslInProgress = false client.saslMechanism = "" client.saslValue = "" @@ -157,7 +157,7 @@ func authenticateHandler(server *Server, client *Client, msg ircmsg.IrcMessage) // like 100% not required, but it's good to be safe I guess if !handlerExists { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed")) client.saslInProgress = false client.saslMechanism = "" client.saslValue = "" @@ -188,18 +188,18 @@ func authPlainHandler(server *Server, client *Client, mechanism string, value [] if accountKey == "" { accountKey = authzid } else if accountKey != authzid { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed: authcid and authzid should be the same") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed: authcid and authzid should be the same")) return false } } else { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed: Invalid auth blob") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed: Invalid auth blob")) return false } // keep it the same as in the REG CREATE stage accountKey, err := CasefoldName(accountKey) if err != nil { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed: Bad account name") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed: Bad account name")) return false } @@ -236,7 +236,7 @@ func authPlainHandler(server *Server, client *Client, mechanism string, value [] }) if err != nil { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed")) return false } @@ -295,7 +295,7 @@ func (client *Client) LogoutOfAccount() { // authExternalHandler parses the SASL EXTERNAL mechanism. func authExternalHandler(server *Server, client *Client, mechanism string, value []byte) bool { if client.certfp == "" { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed, you are not connecting with a certificate") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed, you are not connecting with a certificate")) return false } @@ -336,7 +336,7 @@ func authExternalHandler(server *Server, client *Client, mechanism string, value }) if err != nil { - client.Send(nil, server.name, ERR_SASLFAIL, client.nick, "SASL authentication failed") + client.Send(nil, server.name, ERR_SASLFAIL, client.nick, client.t("SASL authentication failed")) return false } @@ -347,7 +347,7 @@ func authExternalHandler(server *Server, client *Client, mechanism string, value // successfulSaslAuth means that a SASL auth attempt completed successfully, and is used to dispatch messages. func (client *Client) successfulSaslAuth() { client.Send(nil, client.server.name, RPL_LOGGEDIN, client.nick, client.nickMaskString, client.account.Name, fmt.Sprintf("You are now logged in as %s", client.account.Name)) - client.Send(nil, client.server.name, RPL_SASLSUCCESS, client.nick, "SASL authentication successful") + client.Send(nil, client.server.name, RPL_SASLSUCCESS, client.nick, client.t("SASL authentication successful")) // dispatch account-notify for friend := range client.Friends(caps.AccountNotify) { diff --git a/irc/capability.go b/irc/capability.go index cc728af6..0c613900 100644 --- a/irc/capability.go +++ b/irc/capability.go @@ -88,7 +88,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } default: - client.Send(nil, server.name, ERR_INVALIDCAPCMD, client.nick, subCommand, "Invalid CAP subcommand") + client.Send(nil, server.name, ERR_INVALIDCAPCMD, client.nick, subCommand, client.t("Invalid CAP subcommand")) } return false } diff --git a/irc/channel.go b/irc/channel.go index 54163c89..bb2ed0fe 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -197,7 +197,7 @@ func (channel *Channel) Names(client *Client) { } client.Send(nil, client.server.name, RPL_NAMREPLY, client.nick, "=", channel.name, buffer) - client.Send(nil, client.server.name, RPL_ENDOFNAMES, client.nick, channel.name, "End of NAMES list") + client.Send(nil, client.server.name, RPL_ENDOFNAMES, client.nick, channel.name, client.t("End of NAMES list")) } // ClientIsAtLeast returns whether the client has at least the given channel privilege. @@ -381,25 +381,25 @@ func (channel *Channel) Join(client *Client, key string) { } if channel.IsFull() { - client.Send(nil, client.server.name, ERR_CHANNELISFULL, channel.name, "Cannot join channel (+l)") + client.Send(nil, client.server.name, ERR_CHANNELISFULL, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "l")) return } if !channel.CheckKey(key) { - client.Send(nil, client.server.name, ERR_BADCHANNELKEY, channel.name, "Cannot join channel (+k)") + client.Send(nil, client.server.name, ERR_BADCHANNELKEY, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "k")) return } isInvited := channel.lists[InviteMask].Match(client.nickMaskCasefolded) if channel.flags[InviteOnly] && !isInvited { - client.Send(nil, client.server.name, ERR_INVITEONLYCHAN, channel.name, "Cannot join channel (+i)") + client.Send(nil, client.server.name, ERR_INVITEONLYCHAN, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "i")) return } if channel.lists[BanMask].Match(client.nickMaskCasefolded) && !isInvited && !channel.lists[ExceptMask].Match(client.nickMaskCasefolded) { - client.Send(nil, client.server.name, ERR_BANNEDFROMCHAN, channel.name, "Cannot join channel (+b)") + client.Send(nil, client.server.name, ERR_BANNEDFROMCHAN, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "b")) return } @@ -455,7 +455,7 @@ func (channel *Channel) Join(client *Client, key string) { // Part parts the given client from this channel, with the given message. func (channel *Channel) Part(client *Client, message string) { if !channel.hasClient(client) { - client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, "You're not on that channel") + client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel")) return } @@ -470,7 +470,7 @@ func (channel *Channel) Part(client *Client, message string) { // SendTopic sends the channel topic to the given client. func (channel *Channel) SendTopic(client *Client) { if !channel.hasClient(client) { - client.Send(nil, client.server.name, ERR_NOTONCHANNEL, client.nick, channel.name, "You're not on that channel") + client.Send(nil, client.server.name, ERR_NOTONCHANNEL, client.nick, channel.name, client.t("You're not on that channel")) return } @@ -482,7 +482,7 @@ func (channel *Channel) SendTopic(client *Client) { channel.stateMutex.RUnlock() if topic == "" { - client.Send(nil, client.server.name, RPL_NOTOPIC, client.nick, name, "No topic is set") + client.Send(nil, client.server.name, RPL_NOTOPIC, client.nick, name, client.t("No topic is set")) return } @@ -493,12 +493,12 @@ func (channel *Channel) SendTopic(client *Client) { // SetTopic sets the topic of this channel, if the client is allowed to do so. func (channel *Channel) SetTopic(client *Client, topic string) { if !(client.flags[Operator] || channel.hasClient(client)) { - client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, "You're not on that channel") + client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel")) return } if channel.HasMode(OpOnlyTopic) && !channel.ClientIsAtLeast(client, ChannelOperator) { - client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, "You're not a channel operator") + client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator")) return } @@ -545,7 +545,7 @@ func (channel *Channel) TagMsg(msgid string, minPrefix *Mode, clientOnlyTags *ma // sendMessage sends a given message to everyone on this channel. func (channel *Channel) sendMessage(msgid, cmd string, requiredCaps []caps.Capability, minPrefix *Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message *string) { if !channel.CanSpeak(client) { - client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, "Cannot send to channel") + client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel")) return } @@ -598,7 +598,7 @@ func (channel *Channel) SplitNotice(msgid string, minPrefix *Mode, clientOnlyTag func (channel *Channel) sendSplitMessage(msgid, cmd string, minPrefix *Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message *SplitMessage) { if !channel.CanSpeak(client) { - client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, "Cannot send to channel") + client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel")) return } @@ -632,14 +632,14 @@ func (channel *Channel) applyModeMemberNoMutex(client *Client, mode Mode, op ModeOp, nick string) *ModeChange { if nick == "" { //TODO(dan): shouldn't this be handled before it reaches this function? - client.Send(nil, client.server.name, ERR_NEEDMOREPARAMS, "MODE", "Not enough parameters") + client.Send(nil, client.server.name, ERR_NEEDMOREPARAMS, "MODE", client.t("Not enough parameters")) return nil } casefoldedName, err := CasefoldName(nick) target := channel.server.clients.Get(casefoldedName) if err != nil || target == nil { - client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nick, "No such nick") + client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nick, client.t("No such nick")) return nil } @@ -654,7 +654,7 @@ func (channel *Channel) applyModeMemberNoMutex(client *Client, mode Mode, channel.stateMutex.Unlock() if !exists { - client.Send(nil, client.server.name, ERR_USERNOTINCHANNEL, client.nick, channel.name, "They aren't on that channel") + client.Send(nil, client.server.name, ERR_USERNOTINCHANNEL, client.nick, channel.name, client.t("They aren't on that channel")) return nil } else if already { return nil @@ -690,7 +690,7 @@ func (channel *Channel) ShowMaskList(client *Client, mode Mode) { } channel.stateMutex.RUnlock() - client.Send(nil, client.server.name, rplendoflist, nick, channel.name, "End of list") + client.Send(nil, client.server.name, rplendoflist, nick, channel.name, client.t("End of list")) } func (channel *Channel) applyModeMask(client *Client, mode Mode, op ModeOp, mask string) bool { @@ -706,7 +706,7 @@ func (channel *Channel) applyModeMask(client *Client, mode Mode, op ModeOp, mask } if !channel.ClientIsAtLeast(client, ChannelOperator) { - client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, "You're not a channel operator") + client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator")) return false } @@ -733,19 +733,19 @@ func (channel *Channel) Quit(client *Client) { func (channel *Channel) Kick(client *Client, target *Client, comment string) { if !(client.flags[Operator] || channel.hasClient(client)) { - client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, "You're not on that channel") + client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel")) return } if !channel.ClientIsAtLeast(client, ChannelOperator) { - client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, "Cannot send to channel") + client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel")) return } if !channel.hasClient(target) { - client.Send(nil, client.server.name, ERR_USERNOTINCHANNEL, client.nick, channel.name, "They aren't on that channel") + client.Send(nil, client.server.name, ERR_USERNOTINCHANNEL, client.nick, channel.name, client.t("They aren't on that channel")) return } if !channel.ClientHasPrivsOver(client, target) { - client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, "You're not a channel operator") + client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator")) return } @@ -766,12 +766,12 @@ func (channel *Channel) Kick(client *Client, target *Client, comment string) { // Invite invites the given client to the channel, if the inviter can do so. func (channel *Channel) Invite(invitee *Client, inviter *Client) { if channel.flags[InviteOnly] && !channel.ClientIsAtLeast(inviter, ChannelOperator) { - inviter.Send(nil, inviter.server.name, ERR_CHANOPRIVSNEEDED, channel.name, "You're not a channel operator") + inviter.Send(nil, inviter.server.name, ERR_CHANOPRIVSNEEDED, channel.name, inviter.t("You're not a channel operator")) return } if !channel.hasClient(inviter) { - inviter.Send(nil, inviter.server.name, ERR_NOTONCHANNEL, channel.name, "You're not on that channel") + inviter.Send(nil, inviter.server.name, ERR_NOTONCHANNEL, channel.name, inviter.t("You're not on that channel")) return } diff --git a/irc/chanserv.go b/irc/chanserv.go index 841ce68c..c13c3daa 100644 --- a/irc/chanserv.go +++ b/irc/chanserv.go @@ -35,7 +35,7 @@ func (server *Server) chanservReceivePrivmsg(client *Client, message string) { } } if len(params) < 1 { - client.ChanServNotice("You need to run a command") + client.ChanServNotice(client.t("You need to run a command")) //TODO(dan): dump CS help here return } @@ -45,30 +45,30 @@ func (server *Server) chanservReceivePrivmsg(client *Client, message string) { if command == "register" { if len(params) < 2 { - client.ChanServNotice("Syntax: REGISTER ") + client.ChanServNotice(client.t("Syntax: REGISTER ")) return } if !server.channelRegistrationEnabled { - client.ChanServNotice("Channel registration is not enabled") + client.ChanServNotice(client.t("Channel registration is not enabled")) return } channelName := params[1] channelKey, err := CasefoldChannel(channelName) if err != nil { - client.ChanServNotice("Channel name is not valid") + client.ChanServNotice(client.t("Channel name is not valid")) return } channelInfo := server.channels.Get(channelKey) if channelInfo == nil || !channelInfo.ClientIsAtLeast(client, ChannelOperator) { - client.ChanServNotice("You must be an oper on the channel to register it") + client.ChanServNotice(client.t("You must be an oper on the channel to register it")) return } if client.account == &NoAccount { - client.ChanServNotice("You must be logged in to register a channel") + client.ChanServNotice(client.t("You must be logged in to register a channel")) return } @@ -82,7 +82,7 @@ func (server *Server) chanservReceivePrivmsg(client *Client, message string) { // registration was successful: make the database reflect it go server.channelRegistry.StoreChannel(channelInfo, true) - client.ChanServNotice(fmt.Sprintf("Channel %s successfully registered", channelName)) + client.ChanServNotice(fmt.Sprintf(client.t("Channel %s successfully registered"), channelName)) server.logger.Info("chanserv", fmt.Sprintf("Client %s registered channel %s", client.nick, channelName)) server.snomasks.Send(sno.LocalChannels, fmt.Sprintf(ircfmt.Unescape("Channel registered $c[grey][$r%s$c[grey]] by $c[grey][$r%s$c[grey]]"), channelName, client.nickMaskString)) @@ -98,6 +98,6 @@ func (server *Server) chanservReceivePrivmsg(client *Client, message string) { } } } else { - client.ChanServNotice("Sorry, I don't know that command") + client.ChanServNotice(client.t("Sorry, I don't know that command")) } } diff --git a/irc/client.go b/irc/client.go index 8fe01d62..e77f230b 100644 --- a/irc/client.go +++ b/irc/client.go @@ -102,6 +102,7 @@ func NewClient(server *Server, conn net.Conn, isTLS bool) *Client { nickCasefolded: "*", nickMaskString: "*", // * is used until actual nick is given } + client.recomputeMaxlens() if isTLS { client.flags[TLS] = true @@ -121,20 +122,20 @@ func NewClient(server *Server, conn net.Conn, isTLS bool) *Client { log.Fatal(err) } - client.Notice("*** Looking up your username") + client.Notice(client.t("*** Looking up your username")) resp, err := ident.Query(clientHost, serverPort, clientPort, IdentTimeoutSeconds) if err == nil { username := resp.Identifier _, err := CasefoldName(username) // ensure it's a valid username if err == nil { - client.Notice("*** Found your username") + client.Notice(client.t("*** Found your username")) client.username = username // we don't need to updateNickMask here since nickMask is not used for anything yet } else { - client.Notice("*** Got a malformed username, ignoring") + client.Notice(client.t("*** Got a malformed username, ignoring")) } } else { - client.Notice("*** Could not find your username") + client.Notice(client.t("*** Could not find your username")) } } go client.run() @@ -236,16 +237,16 @@ func (client *Client) run() { if err == ircmsg.ErrorLineIsEmpty { continue } else if err != nil { - client.Quit("received malformed line") + client.Quit(client.t("Received malformed line")) break } cmd, exists := Commands[msg.Command] if !exists { if len(msg.Command) > 0 { - client.Send(nil, client.server.name, ERR_UNKNOWNCOMMAND, client.nick, msg.Command, "Unknown command") + client.Send(nil, client.server.name, ERR_UNKNOWNCOMMAND, client.nick, msg.Command, client.t("Unknown command")) } else { - client.Send(nil, client.server.name, ERR_UNKNOWNCOMMAND, client.nick, "lastcmd", "No command given") + client.Send(nil, client.server.name, ERR_UNKNOWNCOMMAND, client.nick, "lastcmd", client.t("No command given")) } continue } @@ -328,13 +329,13 @@ func (client *Client) TryResume() { // can't use server.clients.Get since we hold server.clients' tier 1 mutex casefoldedName, err := CasefoldName(oldnick) if err != nil { - client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, "Cannot resume connection, old client not found") + client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, client.t("Cannot resume connection, old client not found")) return } oldClient := server.clients.byNick[casefoldedName] if oldClient == nil { - client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, "Cannot resume connection, old client not found") + client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, client.t("Cannot resume connection, old client not found")) return } @@ -342,12 +343,12 @@ func (client *Client) TryResume() { newAccountName := client.AccountName() if oldAccountName == "" || newAccountName == "" || oldAccountName != newAccountName { - client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, "Cannot resume connection, old and new clients must be logged into the same account") + client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, client.t("Cannot resume connection, old and new clients must be logged into the same account")) return } if !oldClient.HasMode(TLS) || !client.HasMode(TLS) { - client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, "Cannot resume connection, old and new clients must have TLS") + client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, client.t("Cannot resume connection, old and new clients must have TLS")) return } @@ -370,7 +371,7 @@ func (client *Client) TryResume() { friend.Send(nil, oldClient.NickMaskString(), "RESUMED", oldClient.nick, client.username, client.Hostname(), timestampString) } } else { - friend.Send(nil, oldClient.NickMaskString(), "QUIT", "Client reconnected") + friend.Send(nil, oldClient.NickMaskString(), "QUIT", friend.t("Client reconnected")) } } diff --git a/irc/commands.go b/irc/commands.go index 5132b955..f897b823 100644 --- a/irc/commands.go +++ b/irc/commands.go @@ -21,19 +21,19 @@ type Command struct { // Run runs this command with the given client/message. func (cmd *Command) Run(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if !client.registered && !cmd.usablePreReg { - client.Send(nil, server.name, ERR_NOTREGISTERED, client.nick, "You need to register before you can use that command") + client.Send(nil, server.name, ERR_NOTREGISTERED, client.nick, client.t("You need to register before you can use that command")) return false } if cmd.oper && !client.flags[Operator] { - client.Send(nil, server.name, ERR_NOPRIVILEGES, client.nick, "Permission Denied - You're not an IRC operator") + client.Send(nil, server.name, ERR_NOPRIVILEGES, client.nick, client.t("Permission Denied - You're not an IRC operator")) return false } if len(cmd.capabs) > 0 && !client.HasRoleCapabs(cmd.capabs...) { - client.Send(nil, server.name, ERR_NOPRIVILEGES, client.nick, "Permission Denied") + client.Send(nil, server.name, ERR_NOPRIVILEGES, client.nick, client.t("Permission Denied")) return false } if len(msg.Params) < cmd.minParams { - client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, "Not enough parameters") + client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, client.t("Not enough parameters")) return false } if !cmd.leaveClientActive { diff --git a/irc/dline.go b/irc/dline.go index 9d6ab404..5e34ebab 100644 --- a/irc/dline.go +++ b/irc/dline.go @@ -221,7 +221,7 @@ func (dm *DLineManager) CheckIP(addr net.IP) (isBanned bool, info *IPBanInfo) { func dlineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // check oper permissions if !client.class.Capabilities["oper:local_ban"] { - client.Send(nil, server.name, ERR_NOPRIVS, client.nick, msg.Command, "Insufficient oper privs") + client.Send(nil, server.name, ERR_NOPRIVS, client.nick, msg.Command, client.t("Insufficient oper privs")) return false } @@ -232,11 +232,11 @@ func dlineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { bans := server.dlines.AllBans() if len(bans) == 0 { - client.Notice("No DLINEs have been set!") + client.Notice(client.t("No DLINEs have been set!")) } for key, info := range bans { - client.Notice(fmt.Sprintf("Ban - %s - added by %s - %s", key, info.OperName, info.BanMessage("%s"))) + client.Notice(fmt.Sprintf(client.t("Ban - %s - added by %s - %s"), key, info.OperName, info.BanMessage("%s"))) } return false @@ -266,7 +266,7 @@ func dlineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // get host if len(msg.Params) < currentArg+1 { - client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, "Not enough parameters") + client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, client.t("Not enough parameters")) return false } hostString := msg.Params[currentArg] @@ -282,27 +282,27 @@ func dlineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } if hostAddr == nil && hostNet == nil { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, "Could not parse IP address or CIDR network") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("Could not parse IP address or CIDR network")) return false } if hostNet == nil { hostString = hostAddr.String() if !dlineMyself && hostAddr.Equal(client.IP()) { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, "This ban matches you. To DLINE yourself, you must use the command: /DLINE MYSELF ") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("This ban matches you. To DLINE yourself, you must use the command: /DLINE MYSELF ")) return false } } else { hostString = hostNet.String() if !dlineMyself && hostNet.Contains(client.IP()) { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, "This ban matches you. To DLINE yourself, you must use the command: /DLINE MYSELF ") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("This ban matches you. To DLINE yourself, you must use the command: /DLINE MYSELF ")) return false } } // check remote if len(msg.Params) > currentArg && msg.Params[currentArg] == "ON" { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, "Remote servers not yet supported") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("Remote servers not yet supported")) return false } @@ -360,7 +360,7 @@ func dlineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { }) if err != nil { - client.Notice(fmt.Sprintf("Could not successfully save new D-LINE: %s", err.Error())) + client.Notice(fmt.Sprintf(client.t("Could not successfully save new D-LINE: %s"), err.Error())) return false } @@ -401,7 +401,7 @@ func dlineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { for _, mcl := range clientsToKill { mcl.exitedSnomaskSent = true - mcl.Quit(fmt.Sprintf("You have been banned from this server (%s)", reason)) + mcl.Quit(fmt.Sprintf(mcl.t("You have been banned from this server (%s)"), reason)) if mcl == client { killClient = true } else { @@ -421,7 +421,7 @@ func dlineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { func unDLineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // check oper permissions if !client.class.Capabilities["oper:local_unban"] { - client.Send(nil, server.name, ERR_NOPRIVS, client.nick, msg.Command, "Insufficient oper privs") + client.Send(nil, server.name, ERR_NOPRIVS, client.nick, msg.Command, client.t("Insufficient oper privs")) return false } @@ -438,7 +438,7 @@ func unDLineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool } if hostAddr == nil && hostNet == nil { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, "Could not parse IP address or CIDR network") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("Could not parse IP address or CIDR network")) return false } @@ -465,7 +465,7 @@ func unDLineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool }) if err != nil { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, fmt.Sprintf("Could not remove ban [%s]", err.Error())) + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, fmt.Sprintf(client.t("Could not remove ban [%s]"), err.Error())) return false } @@ -475,7 +475,7 @@ func unDLineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool server.dlines.RemoveNetwork(*hostNet) } - client.Notice(fmt.Sprintf("Removed D-Line for %s", hostString)) + client.Notice(fmt.Sprintf(client.t("Removed D-Line for %s"), hostString)) server.snomasks.Send(sno.LocalXline, fmt.Sprintf(ircfmt.Unescape("%s$r removed D-Line for %s"), client.nick, hostString)) return false } diff --git a/irc/gateways.go b/irc/gateways.go index 1e5d5ed9..8942ff55 100644 --- a/irc/gateways.go +++ b/irc/gateways.go @@ -85,7 +85,7 @@ func webircHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } } - client.Quit("WEBIRC command is not usable from your address or incorrect password given") + client.Quit(client.t("WEBIRC command is not usable from your address or incorrect password given")) return true } @@ -107,7 +107,7 @@ func proxyHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { return client.ApplyProxiedIP(proxiedIP, true) } } - client.Quit("PROXY command is not usable from your address") + client.Quit(client.t("PROXY command is not usable from your address")) return true } @@ -116,7 +116,7 @@ func (client *Client) ApplyProxiedIP(proxiedIP string, tls bool) (exiting bool) // ensure IP is sane parsedProxiedIP := net.ParseIP(proxiedIP) if parsedProxiedIP == nil { - client.Quit(fmt.Sprintf("Proxied IP address is not valid: [%s]", proxiedIP)) + client.Quit(fmt.Sprintf(client.t("Proxied IP address is not valid: [%s]"), proxiedIP)) return true } diff --git a/irc/help.go b/irc/help.go index 548309b1..ba0471a9 100644 --- a/irc/help.go +++ b/irc/help.go @@ -652,7 +652,7 @@ func (client *Client) sendHelp(name string, text string) { } } args := splitName - args = append(args, "End of /HELPOP") + args = append(args, client.t("End of /HELPOP")) client.Send(nil, client.server.name, RPL_ENDOFHELP, args...) } @@ -661,9 +661,9 @@ func helpHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { argument := strings.ToLower(strings.TrimSpace(strings.Join(msg.Params, " "))) if len(argument) < 1 { - client.sendHelp("HELPOP", `HELPOP + client.sendHelp("HELPOP", client.t(`HELPOP -Get an explanation of , or "index" for a list of help topics.`) +Get an explanation of , or "index" for a list of help topics.`)) return false } @@ -683,7 +683,7 @@ Get an explanation of , or "index" for a list of help topics.`) client.sendHelp(strings.ToUpper(argument), helpHandler.text) } else { args := msg.Params - args = append(args, "Help not found") + args = append(args, client.t("Help not found")) client.Send(nil, server.name, ERR_HELPNOTFOUND, args...) } diff --git a/irc/kline.go b/irc/kline.go index a7ba985b..638a052e 100644 --- a/irc/kline.go +++ b/irc/kline.go @@ -132,7 +132,7 @@ func (km *KLineManager) CheckMasks(masks ...string) (isBanned bool, info *IPBanI func klineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // check oper permissions if !client.class.Capabilities["oper:local_ban"] { - client.Send(nil, server.name, ERR_NOPRIVS, client.nick, msg.Command, "Insufficient oper privs") + client.Send(nil, server.name, ERR_NOPRIVS, client.nick, msg.Command, client.t("Insufficient oper privs")) return false } @@ -147,7 +147,7 @@ func klineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } for key, info := range bans { - client.Notice(fmt.Sprintf("Ban - %s - added by %s - %s", key, info.OperName, info.BanMessage("%s"))) + client.Notice(fmt.Sprintf(client.t("Ban - %s - added by %s - %s"), key, info.OperName, info.BanMessage("%s"))) } return false @@ -177,7 +177,7 @@ func klineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // get mask if len(msg.Params) < currentArg+1 { - client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, "Not enough parameters") + client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, client.t("Not enough parameters")) return false } mask := strings.ToLower(msg.Params[currentArg]) @@ -194,14 +194,14 @@ func klineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { for _, clientMask := range client.AllNickmasks() { if !klineMyself && matcher.Match(clientMask) { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, "This ban matches you. To KLINE yourself, you must use the command: /KLINE MYSELF ") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("This ban matches you. To KLINE yourself, you must use the command: /KLINE MYSELF ")) return false } } // check remote if len(msg.Params) > currentArg && msg.Params[currentArg] == "ON" { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, "Remote servers not yet supported") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("Remote servers not yet supported")) return false } @@ -261,7 +261,7 @@ func klineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { }) if err != nil { - client.Notice(fmt.Sprintf("Could not successfully save new K-LINE: %s", err.Error())) + client.Notice(fmt.Sprintf(client.t("Could not successfully save new K-LINE: %s"), err.Error())) return false } @@ -269,10 +269,10 @@ func klineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { var snoDescription string if durationIsUsed { - client.Notice(fmt.Sprintf("Added temporary (%s) K-Line for %s", duration.String(), mask)) + client.Notice(fmt.Sprintf(client.t("Added temporary (%s) K-Line for %s"), duration.String(), mask)) snoDescription = fmt.Sprintf(ircfmt.Unescape("%s [%s]$r added temporary (%s) K-Line for %s"), client.nick, operName, duration.String(), mask) } else { - client.Notice(fmt.Sprintf("Added K-Line for %s", mask)) + client.Notice(fmt.Sprintf(client.t("Added K-Line for %s"), mask)) snoDescription = fmt.Sprintf(ircfmt.Unescape("%s [%s]$r added K-Line for %s"), client.nick, operName, mask) } server.snomasks.Send(sno.LocalXline, snoDescription) @@ -293,7 +293,7 @@ func klineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { for _, mcl := range clientsToKill { mcl.exitedSnomaskSent = true - mcl.Quit(fmt.Sprintf("You have been banned from this server (%s)", reason)) + mcl.Quit(fmt.Sprintf(mcl.t("You have been banned from this server (%s)"), reason)) if mcl == client { killClient = true } else { @@ -313,7 +313,7 @@ func klineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { func unKLineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // check oper permissions if !client.class.Capabilities["oper:local_unban"] { - client.Send(nil, server.name, ERR_NOPRIVS, client.nick, msg.Command, "Insufficient oper privs") + client.Send(nil, server.name, ERR_NOPRIVS, client.nick, msg.Command, client.t("Insufficient oper privs")) return false } @@ -343,13 +343,13 @@ func unKLineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool }) if err != nil { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, fmt.Sprintf("Could not remove ban [%s]", err.Error())) + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, fmt.Sprintf(client.t("Could not remove ban [%s]"), err.Error())) return false } server.klines.RemoveMask(mask) - client.Notice(fmt.Sprintf("Removed K-Line for %s", mask)) + client.Notice(fmt.Sprintf(client.t("Removed K-Line for %s"), mask)) server.snomasks.Send(sno.LocalXline, fmt.Sprintf(ircfmt.Unescape("%s$r removed K-Line for %s"), client.nick, mask)) return false } diff --git a/irc/modes.go b/irc/modes.go index bd4b9657..a8fd4c4e 100644 --- a/irc/modes.go +++ b/irc/modes.go @@ -330,7 +330,7 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { target := server.clients.Get(nickname) if err != nil || target == nil { if len(msg.Params[0]) > 0 { - client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], "No such nick") + client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], client.t("No such nick")) } return false } @@ -340,9 +340,9 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if !hasPrivs { if len(msg.Params) > 1 { - client.Send(nil, server.name, ERR_USERSDONTMATCH, client.nick, "Can't change modes for other users") + client.Send(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't change modes for other users")) } else { - client.Send(nil, server.name, ERR_USERSDONTMATCH, client.nick, "Can't view modes for other users") + client.Send(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't view modes for other users")) } return false } @@ -357,7 +357,7 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // alert for unknown mode changes for char := range unknown { - client.Send(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), "is an unknown mode character to me") + client.Send(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me")) } if len(unknown) == 1 && len(changes) == 0 { return false @@ -374,7 +374,7 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if client.flags[LocalOperator] || client.flags[Operator] { masks := server.snomasks.String(client) if 0 < len(masks) { - client.Send(nil, target.nickMaskString, RPL_SNOMASKIS, targetNick, masks, "Server notice masks") + client.Send(nil, target.nickMaskString, RPL_SNOMASKIS, targetNick, masks, client.t("Server notice masks")) } } } @@ -521,7 +521,7 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c if !hasPrivs(change) { if !alreadySentPrivError { alreadySentPrivError = true - client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, "You're not a channel operator") + client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator")) } continue } @@ -543,7 +543,7 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c case Add: if channel.lists[change.mode].Length() >= client.server.Limits().ChanListModes { if !listFullWarned[change.mode] { - client.Send(nil, client.server.name, ERR_BANLISTFULL, client.Nick(), channel.Name(), change.mode.String(), "Channel list is full") + client.Send(nil, client.server.name, ERR_BANLISTFULL, client.Nick(), channel.Name(), change.mode.String(), client.t("Channel list is full")) listFullWarned[change.mode] = true } continue @@ -612,7 +612,7 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { channel := server.channels.Get(channelName) if err != nil || channel == nil { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, msg.Params[0], "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, msg.Params[0], client.t("No such channel")) return false } @@ -626,7 +626,7 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // alert for unknown mode changes for char := range unknown { - client.Send(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), "is an unknown mode character to me") + client.Send(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me")) } if len(unknown) == 1 && len(changes) == 0 { return false diff --git a/irc/monitor.go b/irc/monitor.go index 54d2400f..b6206898 100644 --- a/irc/monitor.go +++ b/irc/monitor.go @@ -123,7 +123,7 @@ func monitorHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool handler, exists := metadataSubcommands[strings.ToLower(msg.Params[0])] if !exists { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.Nick(), "MONITOR", msg.Params[0], "Unknown subcommand") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.Nick(), "MONITOR", msg.Params[0], client.t("Unknown subcommand")) return false } @@ -132,7 +132,7 @@ func monitorHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool func monitorRemoveHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if len(msg.Params) < 2 { - client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.Nick(), msg.Command, "Not enough parameters") + client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.Nick(), msg.Command, client.t("Not enough parameters")) return false } @@ -150,7 +150,7 @@ func monitorRemoveHandler(server *Server, client *Client, msg ircmsg.IrcMessage) func monitorAddHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if len(msg.Params) < 2 { - client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.Nick(), msg.Command, "Not enough parameters") + client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.Nick(), msg.Command, client.t("Not enough parameters")) return false } diff --git a/irc/nickname.go b/irc/nickname.go index 55efcb6d..83dbb4fb 100644 --- a/irc/nickname.go +++ b/irc/nickname.go @@ -36,12 +36,12 @@ func performNickChange(server *Server, client *Client, target *Client, newnick s cfnick, err := CasefoldName(nickname) if len(nickname) < 1 { - client.Send(nil, server.name, ERR_NONICKNAMEGIVEN, client.nick, "No nickname given") + client.Send(nil, server.name, ERR_NONICKNAMEGIVEN, client.nick, client.t("No nickname given")) return false } if err != nil || len(nickname) > server.Limits().NickLen || restrictedNicknames[cfnick] { - client.Send(nil, server.name, ERR_ERRONEUSNICKNAME, client.nick, nickname, "Erroneous nickname") + client.Send(nil, server.name, ERR_ERRONEUSNICKNAME, client.nick, nickname, client.t("Erroneous nickname")) return false } @@ -54,10 +54,10 @@ func performNickChange(server *Server, client *Client, target *Client, newnick s origNickMask := target.NickMaskString() err = client.server.clients.SetNick(target, nickname) if err == ErrNicknameInUse { - client.Send(nil, server.name, ERR_NICKNAMEINUSE, client.nick, nickname, "Nickname is already in use") + client.Send(nil, server.name, ERR_NICKNAMEINUSE, client.nick, nickname, client.t("Nickname is already in use")) return false } else if err != nil { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "NICK", fmt.Sprintf("Could not set or change nickname: %s", err.Error())) + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "NICK", fmt.Sprintf(client.t("Could not set or change nickname: %s"), err.Error())) return false } @@ -83,7 +83,7 @@ func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { targetNick := strings.TrimSpace(msg.Params[0]) target := server.clients.Get(targetNick) if target == nil { - client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], "No such nick") + client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], client.t("No such nick")) return false } return performNickChange(server, client, target, msg.Params[1]) diff --git a/irc/nickserv.go b/irc/nickserv.go index 21060b40..6986a9f4 100644 --- a/irc/nickserv.go +++ b/irc/nickserv.go @@ -20,5 +20,5 @@ func (server *Server) nickservReceiveNotice(client *Client, message string) { } func (server *Server) nickservReceivePrivmsg(client *Client, message string) { - client.Notice("NickServ is not yet implemented, sorry! To register an account, check /HELPOP REG") + client.Notice(client.t("NickServ is not yet implemented, sorry! To register an account, check /HELPOP REG")) } diff --git a/irc/roleplay.go b/irc/roleplay.go index 218950a8..c4e25af2 100644 --- a/irc/roleplay.go +++ b/irc/roleplay.go @@ -34,7 +34,7 @@ func npcHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { _, err := CasefoldName(fakeSource) if err != nil { - client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, "Fake source must be a valid nickname") + client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, client.t("Fake source must be a valid nickname")) return false } @@ -54,7 +54,7 @@ func npcaHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { _, err := CasefoldName(fakeSource) if err != nil { - client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, "Fake source must be a valid nickname") + client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, client.t("Fake source must be a valid nickname")) return false } @@ -74,17 +74,17 @@ func sendRoleplayMessage(server *Server, client *Client, source string, targetSt if cerr == nil { channel := server.channels.Get(target) if channel == nil { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, client.t("No such channel")) return } if !channel.CanSpeak(client) { - client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, "Cannot send to channel") + client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel")) return } if !channel.flags[ChanRoleplaying] { - client.Send(nil, client.server.name, ERR_CANNOTSENDRP, channel.name, "Channel doesn't have roleplaying mode available") + client.Send(nil, client.server.name, ERR_CANNOTSENDRP, channel.name, client.t("Channel doesn't have roleplaying mode available")) return } @@ -98,12 +98,12 @@ func sendRoleplayMessage(server *Server, client *Client, source string, targetSt target, err := CasefoldName(targetString) user := server.clients.Get(target) if err != nil || user == nil { - client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, target, "No such nick") + client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, target, client.t("No such nick")) return } if !user.flags[UserRoleplaying] { - client.Send(nil, client.server.name, ERR_CANNOTSENDRP, user.nick, "User doesn't have roleplaying mode enabled") + client.Send(nil, client.server.name, ERR_CANNOTSENDRP, user.nick, client.t("User doesn't have roleplaying mode enabled")) return } diff --git a/irc/server.go b/irc/server.go index 079221f4..5ea9f1a5 100644 --- a/irc/server.go +++ b/irc/server.go @@ -44,10 +44,6 @@ var ( RenamePrivsNeeded = errors.New("Only chanops can rename channels") ) -const ( - rawIONotice = "This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect." -) - // Limits holds the maximum limits for various things such as topic lengths. type Limits struct { AwayLen int @@ -423,7 +419,7 @@ func (server *Server) tryRegister(c *Client) { if info.Time != nil { reason += fmt.Sprintf(" [%s]", info.Time.Duration.String()) } - c.Quit(fmt.Sprintf("You are banned from this server (%s)", reason)) + c.Quit(fmt.Sprintf(c.t("You are banned from this server (%s)"), reason)) c.destroy(false) return } @@ -437,15 +433,15 @@ func (server *Server) tryRegister(c *Client) { //NOTE(dan): we specifically use the NICK here instead of the nickmask // see http://modern.ircdocs.horse/#rplwelcome-001 for details on why we avoid using the nickmask c.Send(nil, server.name, RPL_WELCOME, c.nick, fmt.Sprintf(c.t("Welcome to the Internet Relay Network %s"), c.nick)) - c.Send(nil, server.name, RPL_YOURHOST, c.nick, fmt.Sprintf("Your host is %s, running version %s", server.name, Ver)) - c.Send(nil, server.name, RPL_CREATED, c.nick, fmt.Sprintf("This server was created %s", server.ctime.Format(time.RFC1123))) + c.Send(nil, server.name, RPL_YOURHOST, c.nick, fmt.Sprintf(c.t("Your host is %s, running version %s"), server.name, Ver)) + c.Send(nil, server.name, RPL_CREATED, c.nick, fmt.Sprintf(c.t("This server was created %s"), server.ctime.Format(time.RFC1123))) //TODO(dan): Look at adding last optional [] parameter c.Send(nil, server.name, RPL_MYINFO, c.nick, server.name, Ver, supportedUserModesString, supportedChannelModesString) c.RplISupport() server.MOTD(c) c.Send(nil, c.nickMaskString, RPL_UMODEIS, c.nick, c.ModeString()) if server.logger.IsLoggingRawIO() { - c.Notice(rawIONotice) + c.Notice(c.t("This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect.")) } // if resumed, send fake channel joins @@ -500,15 +496,15 @@ func (server *Server) MOTD(client *Client) { server.configurableStateMutex.RUnlock() if len(motdLines) < 1 { - client.Send(nil, server.name, ERR_NOMOTD, client.nick, "MOTD File is missing") + client.Send(nil, server.name, ERR_NOMOTD, client.nick, client.t("MOTD File is missing")) return } - client.Send(nil, server.name, RPL_MOTDSTART, client.nick, fmt.Sprintf("- %s Message of the day - ", server.name)) + client.Send(nil, server.name, RPL_MOTDSTART, client.nick, fmt.Sprintf(client.t("- %s Message of the day - "), server.name)) for _, line := range motdLines { client.Send(nil, server.name, RPL_MOTD, client.nick, line) } - client.Send(nil, server.name, RPL_ENDOFMOTD, client.nick, "End of MOTD command") + client.Send(nil, server.name, RPL_ENDOFMOTD, client.nick, client.t("End of MOTD command")) } // @@ -518,7 +514,7 @@ func (server *Server) MOTD(client *Client) { // PASS func passHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if client.registered { - client.Send(nil, server.name, ERR_ALREADYREGISTRED, client.nick, "You may not reregister") + client.Send(nil, server.name, ERR_ALREADYREGISTRED, client.nick, client.t("You may not reregister")) return false } @@ -531,8 +527,8 @@ func passHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // check the provided password password := []byte(msg.Params[0]) if passwd.ComparePassword(server.password, password) != nil { - client.Send(nil, server.name, ERR_PASSWDMISMATCH, client.nick, "Password incorrect") - client.Send(nil, server.name, "ERROR", "Password incorrect") + client.Send(nil, server.name, ERR_PASSWDMISMATCH, client.nick, client.t("Password incorrect")) + client.Send(nil, server.name, "ERROR", client.t("Password incorrect")) return true } @@ -543,7 +539,7 @@ func passHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // USER * 0 func userHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if client.registered { - client.Send(nil, server.name, ERR_ALREADYREGISTRED, client.nick, "You may not reregister") + client.Send(nil, server.name, ERR_ALREADYREGISTRED, client.nick, client.t("You may not reregister")) return false } @@ -560,7 +556,7 @@ func userHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // _, err := CasefoldName(msg.Params[0]) if err != nil { - client.Send(nil, "", "ERROR", "Malformed username") + client.Send(nil, "", "ERROR", client.t("Malformed username")) return true } @@ -656,7 +652,7 @@ func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage) (resul founder := channel.Founder() if founder != "" && founder != client.AccountName() { //TODO(dan): Change this to ERR_CANNOTRENAME - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "RENAME", oldName, "Only channel founders can change registered channels") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "RENAME", oldName, client.t("Only channel founders can change registered channels")) return false } @@ -675,7 +671,7 @@ func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage) (resul if mcl.capabilities.Has(caps.Rename) { mcl.Send(nil, client.nickMaskString, "RENAME", oldName, newName, reason) } else { - mcl.Send(nil, mcl.nickMaskString, "PART", oldName, fmt.Sprintf("Channel renamed: %s", reason)) + mcl.Send(nil, mcl.nickMaskString, "PART", oldName, fmt.Sprintf(mcl.t("Channel renamed: %s"), reason)) if mcl.capabilities.Has(caps.ExtendedJoin) { accountName := "*" if mcl.account != nil { @@ -695,7 +691,7 @@ func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage) (resul func joinHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { // kill JOIN 0 requests if msg.Params[0] == "0" { - client.Notice("JOIN 0 is not allowed") + client.Notice(client.t("JOIN 0 is not allowed")) return false } @@ -713,7 +709,7 @@ func joinHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } err := server.channels.Join(client, name, key) if err == NoSuchChannel { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), name, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), name, client.t("No such channel")) } } return false @@ -730,7 +726,7 @@ func partHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { for _, chname := range channels { err := server.channels.Part(client, chname, reason) if err == NoSuchChannel { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, chname, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, chname, client.t("No such channel")) } } return false @@ -742,7 +738,7 @@ func topicHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { channel := server.channels.Get(name) if err != nil || channel == nil { if len(msg.Params[0]) > 0 { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, msg.Params[0], "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, msg.Params[0], client.t("No such channel")) } return false } @@ -844,11 +840,11 @@ func privmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool if err == nil { channel := server.channels.Get(target) if channel == nil { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, client.t("No such channel")) continue } if !channel.CanSpeak(client) { - client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, "Cannot send to channel") + client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel")) continue } msgid := server.generateMessageID() @@ -917,11 +913,11 @@ func tagmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if err == nil { channel := server.channels.Get(target) if channel == nil { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, client.t("No such channel")) continue } if !channel.CanSpeak(client) { - client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, "Cannot send to channel") + client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel")) continue } msgid := server.generateMessageID() @@ -932,7 +928,7 @@ func tagmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { user := server.clients.Get(target) if err != nil || user == nil { if len(target) > 0 { - client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, target, "No such nick") + client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, target, client.t("No such nick")) } continue } @@ -982,7 +978,7 @@ func whoisHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } if len(strings.TrimSpace(masksString)) < 1 { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, "No masks given") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("No masks given")) return false } @@ -991,12 +987,12 @@ func whoisHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { for _, mask := range masks { casefoldedMask, err := Casefold(mask) if err != nil { - client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, "No such nick") + client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, client.t("No such nick")) continue } matches := server.clients.FindAll(casefoldedMask) if len(matches) == 0 { - client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, "No such nick") + client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, client.t("No such nick")) continue } for mclient := range matches { @@ -1008,13 +1004,13 @@ func whoisHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { casefoldedMask, err := Casefold(strings.Split(masksString, ",")[0]) mclient := server.clients.Get(casefoldedMask) if err != nil || mclient == nil { - client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, masksString, "No such nick") + client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, masksString, client.t("No such nick")) // fall through, ENDOFWHOIS is always sent } else { client.getWhoisOf(mclient) } } - client.Send(nil, server.name, RPL_ENDOFWHOIS, client.nick, masksString, "End of /WHOIS list") + client.Send(nil, server.name, RPL_ENDOFWHOIS, client.nick, masksString, client.t("End of /WHOIS list")) return false } @@ -1032,17 +1028,17 @@ func (client *Client) getWhoisOf(target *Client) { client.Send(nil, client.server.name, RPL_WHOISOPERATOR, client.nick, target.nick, target.whoisLine) } if client.flags[Operator] || client == target { - client.Send(nil, client.server.name, RPL_WHOISACTUALLY, client.nick, target.nick, fmt.Sprintf("%s@%s", target.username, utils.LookupHostname(target.IPString())), target.IPString(), "Actual user@host, Actual IP") + client.Send(nil, client.server.name, RPL_WHOISACTUALLY, client.nick, target.nick, fmt.Sprintf("%s@%s", target.username, utils.LookupHostname(target.IPString())), target.IPString(), client.t("Actual user@host, Actual IP")) } if target.flags[TLS] { - client.Send(nil, client.server.name, RPL_WHOISSECURE, client.nick, target.nick, "is using a secure connection") + client.Send(nil, client.server.name, RPL_WHOISSECURE, client.nick, target.nick, client.t("is using a secure connection")) } accountName := target.AccountName() if accountName != "" { - client.Send(nil, client.server.name, RPL_WHOISACCOUNT, client.nick, accountName, "is logged in as") + client.Send(nil, client.server.name, RPL_WHOISACCOUNT, client.nick, accountName, client.t("is logged in as")) } if target.flags[Bot] { - client.Send(nil, client.server.name, RPL_WHOISBOT, client.nick, target.nick, ircfmt.Unescape("is a $bBot$b on ")+client.server.networkName) + client.Send(nil, client.server.name, RPL_WHOISBOT, client.nick, target.nick, ircfmt.Unescape(fmt.Sprintf(client.t("is a $bBot$b on %s"), client.server.networkName))) } if 0 < len(target.languages) { @@ -1050,14 +1046,14 @@ func (client *Client) getWhoisOf(target *Client) { for _, str := range client.server.languages.Codes(target.languages) { params = append(params, str) } - params = append(params, "can speak these languages") + params = append(params, client.t("can speak these languages")) client.Send(nil, client.server.name, RPL_WHOISLANGUAGE, params...) } if target.certfp != "" && (client.flags[Operator] || client == target) { - client.Send(nil, client.server.name, RPL_WHOISCERTFP, client.nick, target.nick, fmt.Sprintf("has client certificate fingerprint %s", target.certfp)) + client.Send(nil, client.server.name, RPL_WHOISCERTFP, client.nick, target.nick, fmt.Sprintf(client.t("has client certificate fingerprint %s"), target.certfp)) } - client.Send(nil, client.server.name, RPL_WHOISIDLE, client.nick, target.nick, strconv.FormatUint(target.IdleSeconds(), 10), strconv.FormatInt(target.SignonTime(), 10), "seconds idle, signon time") + client.Send(nil, client.server.name, RPL_WHOISIDLE, client.nick, target.nick, strconv.FormatUint(target.IdleSeconds(), 10), strconv.FormatInt(target.SignonTime(), 10), client.t("seconds idle, signon time")) } // rplWhoReply returns the WHO reply between one user and another channel/user. @@ -1094,7 +1090,7 @@ func whoChannel(client *Client, channel *Channel, friends ClientSet) { // WHO [ [ "o" ] ] func whoHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if msg.Params[0] == "" { - client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "WHO", "First param must be a mask or channel") + client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "WHO", client.t("First param must be a mask or channel")) return false } @@ -1102,7 +1098,7 @@ func whoHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if len(msg.Params) > 0 { casefoldedMask, err := Casefold(msg.Params[0]) if err != nil { - client.Send(nil, server.name, ERR_UNKNOWNERROR, "WHO", "Mask isn't valid") + client.Send(nil, server.name, ERR_UNKNOWNERROR, "WHO", client.t("Mask isn't valid")) return false } mask = casefoldedMask @@ -1130,7 +1126,7 @@ func whoHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } } - client.Send(nil, server.name, RPL_ENDOFWHO, client.nick, mask, "End of WHO list") + client.Send(nil, server.name, RPL_ENDOFWHO, client.nick, mask, client.t("End of WHO list")) return false } @@ -1138,11 +1134,11 @@ func whoHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { func operHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { name, err := CasefoldName(msg.Params[0]) if err != nil { - client.Send(nil, server.name, ERR_PASSWDMISMATCH, client.nick, "Password incorrect") + client.Send(nil, server.name, ERR_PASSWDMISMATCH, client.nick, client.t("Password incorrect")) return true } if client.flags[Operator] == true { - client.Send(nil, server.name, ERR_UNKNOWNERROR, "OPER", "You're already opered-up!") + client.Send(nil, server.name, ERR_UNKNOWNERROR, "OPER", client.t("You're already opered-up!")) return false } server.configurableStateMutex.RLock() @@ -1152,7 +1148,7 @@ func operHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { password := []byte(msg.Params[1]) err = passwd.ComparePassword(oper.Pass, password) if (oper.Pass == nil) || (err != nil) { - client.Send(nil, server.name, ERR_PASSWDMISMATCH, client.nick, "Password incorrect") + client.Send(nil, server.name, ERR_PASSWDMISMATCH, client.nick, client.t("Password incorrect")) return true } @@ -1181,11 +1177,11 @@ func operHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { for r := range unknownChanges { runes += string(r) } - client.Notice(fmt.Sprintf("Could not apply mode changes: +%s", runes)) + client.Notice(fmt.Sprintf(client.t("Could not apply mode changes: +%s"), runes)) } } - client.Send(nil, server.name, RPL_YOUREOPER, client.nick, "You are now an IRC operator") + client.Send(nil, server.name, RPL_YOUREOPER, client.nick, client.t("You are now an IRC operator")) applied = append(applied, ModeChange{ mode: Operator, @@ -1464,7 +1460,7 @@ func (server *Server) applyConfig(config *Config, initial bool) error { } if sendRawOutputNotice { - sClient.Notice(rawIONotice) + sClient.Notice(sClient.t("This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect.")) } } } @@ -1626,7 +1622,7 @@ func rehashHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { err := server.rehash() if err == nil { - client.Send(nil, server.name, RPL_REHASHING, client.nick, "ircd.yaml", "Rehashing") + client.Send(nil, server.name, RPL_REHASHING, client.nick, "ircd.yaml", client.t("Rehashing")) } else { server.logger.Error("rehash", fmt.Sprintln("Failed to rehash:", err.Error())) client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "REHASH", err.Error()) @@ -1657,10 +1653,10 @@ func awayHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { var op ModeOp if client.flags[Away] { op = Add - client.Send(nil, server.name, RPL_NOWAWAY, client.nick, "You have been marked as being away") + client.Send(nil, server.name, RPL_NOWAWAY, client.nick, client.t("You have been marked as being away")) } else { op = Remove - client.Send(nil, server.name, RPL_UNAWAY, client.nick, "You are no longer marked as being away") + client.Send(nil, server.name, RPL_UNAWAY, client.nick, client.t("You are no longer marked as being away")) } //TODO(dan): Should this be sent automagically as part of setting the flag/mode? modech := ModeChanges{ModeChange{ @@ -1784,7 +1780,7 @@ func kickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { channels := strings.Split(msg.Params[0], ",") users := strings.Split(msg.Params[1], ",") if (len(channels) != len(users)) && (len(users) != 1) { - client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, "KICK", "Not enough parameters") + client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, "KICK", client.t("Not enough parameters")) return false } @@ -1807,14 +1803,14 @@ func kickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { casefoldedChname, err := CasefoldChannel(chname) channel := server.channels.Get(casefoldedChname) if err != nil || channel == nil { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, chname, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, chname, client.t("No such channel")) continue } casefoldedNickname, err := CasefoldName(nickname) target := server.clients.Get(casefoldedNickname) if err != nil || target == nil { - client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, nickname, "No such nick") + client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, nickname, client.t("No such nick")) continue } @@ -1912,7 +1908,7 @@ func listHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { channel := server.channels.Get(casefoldedChname) if err != nil || channel == nil || (!client.flags[Operator] && channel.flags[Secret]) { if len(chname) > 0 { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, chname, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, chname, client.t("No such channel")) } continue } @@ -1921,7 +1917,7 @@ func listHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } } } - client.Send(nil, server.name, RPL_LISTEND, client.nick, "End of LIST") + client.Send(nil, server.name, RPL_LISTEND, client.nick, client.t("End of LIST")) return false } @@ -1970,7 +1966,7 @@ func namesHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { channel := server.channels.Get(casefoldedChname) if err != nil || channel == nil { if len(chname) > 0 { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, chname, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, chname, client.t("No such channel")) } continue } @@ -1987,7 +1983,7 @@ func versionHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool } casefoldedTarget, err := Casefold(target) if target != "" && (err != nil || casefoldedTarget != server.nameCasefolded) { - client.Send(nil, server.name, ERR_NOSUCHSERVER, client.nick, target, "No such server") + client.Send(nil, server.name, ERR_NOSUCHSERVER, client.nick, target, client.t("No such server")) return false } @@ -2004,14 +2000,14 @@ func inviteHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { casefoldedNickname, err := CasefoldName(nickname) target := server.clients.Get(casefoldedNickname) if err != nil || target == nil { - client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, nickname, "No such nick") + client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, nickname, client.t("No such nick")) return false } casefoldedChannelName, err := CasefoldChannel(channelName) channel := server.channels.Get(casefoldedChannelName) if err != nil || channel == nil { - client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, channelName, "No such channel") + client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, channelName, client.t("No such channel")) return false } @@ -2027,7 +2023,7 @@ func timeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } casefoldedTarget, err := Casefold(target) if (target != "") && err != nil || (casefoldedTarget != server.nameCasefolded) { - client.Send(nil, server.name, ERR_NOSUCHSERVER, client.nick, target, "No such server") + client.Send(nil, server.name, ERR_NOSUCHSERVER, client.nick, target, client.t("No such server")) return false } client.Send(nil, server.name, RPL_TIME, client.nick, server.name, time.Now().Format(time.RFC1123)) @@ -2045,7 +2041,7 @@ func killHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { casefoldedNickname, err := CasefoldName(nickname) target := server.clients.Get(casefoldedNickname) if err != nil || target == nil { - client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nickname, "No such nick") + client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nickname, client.t("No such nick")) return false } @@ -2075,7 +2071,7 @@ func whowasHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { results := server.whoWas.Find(nickname, count) if len(results) == 0 { if len(nickname) > 0 { - client.Send(nil, server.name, ERR_WASNOSUCHNICK, client.nick, nickname, "There was no such nickname") + client.Send(nil, server.name, ERR_WASNOSUCHNICK, client.nick, nickname, client.t("There was no such nickname")) } } else { for _, whoWas := range results { @@ -2083,7 +2079,7 @@ func whowasHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { } } if len(nickname) > 0 { - client.Send(nil, server.name, RPL_ENDOFWHOWAS, client.nick, nickname, "End of WHOWAS") + client.Send(nil, server.name, RPL_ENDOFWHOWAS, client.nick, nickname, client.t("End of WHOWAS")) } } return false @@ -2103,10 +2099,10 @@ func lusersHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { opercount++ } } - client.Send(nil, server.name, RPL_LUSERCLIENT, client.nick, fmt.Sprintf("There are %d users and %d invisible on %d server(s)", totalcount, invisiblecount, 1)) - client.Send(nil, server.name, RPL_LUSEROP, client.nick, fmt.Sprintf("%d IRC Operators online", opercount)) - client.Send(nil, server.name, RPL_LUSERCHANNELS, client.nick, fmt.Sprintf("%d channels formed", server.channels.Len())) - client.Send(nil, server.name, RPL_LUSERME, client.nick, fmt.Sprintf("I have %d clients and %d servers", totalcount, 1)) + client.Send(nil, server.name, RPL_LUSERCLIENT, client.nick, fmt.Sprintf(client.t("There are %d users and %d invisible on %d server(s)"), totalcount, invisiblecount, 1)) + client.Send(nil, server.name, RPL_LUSEROP, client.nick, fmt.Sprintf(client.t("%d IRC Operators online"), opercount)) + client.Send(nil, server.name, RPL_LUSERCHANNELS, client.nick, fmt.Sprintf(client.t("%d channels formed"), server.channels.Len())) + client.Send(nil, server.name, RPL_LUSERME, client.nick, fmt.Sprintf(client.t("I have %d clients and %d servers"), totalcount, 1)) return false } @@ -2122,12 +2118,12 @@ func resumeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { oldnick := msg.Params[0] if strings.Contains(oldnick, " ") { - client.Send(nil, server.name, ERR_CANNOT_RESUME, "*", "Cannot resume connection, old nickname contains spaces") + client.Send(nil, server.name, ERR_CANNOT_RESUME, "*", client.t("Cannot resume connection, old nickname contains spaces")) return false } if client.Registered() { - client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, "Cannot resume connection, connection registration has already been completed") + client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, client.t("Cannot resume connection, connection registration has already been completed")) return false } @@ -2137,7 +2133,7 @@ func resumeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if err == nil { timestamp = &ts } else { - client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, "Timestamp is not in 2006-01-02T15:04:05.999Z format, ignoring it") + client.Send(nil, server.name, ERR_CANNOT_RESUME, oldnick, client.t("Timestamp is not in 2006-01-02T15:04:05.999Z format, ignoring it")) } } @@ -2161,7 +2157,7 @@ func userhostHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool casefoldedNickname, err := CasefoldName(nickname) target := server.clients.Get(casefoldedNickname) if err != nil || target == nil { - client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nickname, "No such nick") + client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nickname, client.t("No such nick")) return false } if returnedNicks[casefoldedNickname] { @@ -2194,7 +2190,7 @@ func languageHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool supportedLanguagesCount := server.languages.Count() if supportedLanguagesCount < len(msg.Params) { - client.Send(nil, client.server.name, ERR_TOOMANYLANGUAGES, client.nick, strconv.Itoa(supportedLanguagesCount), "You specified too many languages") + client.Send(nil, client.server.name, ERR_TOOMANYLANGUAGES, client.nick, strconv.Itoa(supportedLanguagesCount), client.t("You specified too many languages")) return false } @@ -2210,7 +2206,7 @@ func languageHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool _, exists := server.languages.Info[value] if !exists { - client.Send(nil, client.server.name, ERR_NOLANGUAGE, client.nick, "Languages are not supported by this server") + client.Send(nil, client.server.name, ERR_NOLANGUAGE, client.nick, client.t("Languages are not supported by this server")) return false }