|
@@ -2208,65 +2208,43 @@ func rehashHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
|
2208
|
2208
|
// RENAME <oldchan> <newchan> [<reason>]
|
2209
|
2209
|
func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) (result bool) {
|
2210
|
2210
|
result = false
|
2211
|
|
-
|
2212
|
|
- errorResponse := func(err error, name string) {
|
2213
|
|
- // TODO: send correct error codes, e.g., ERR_CANNOTRENAME, ERR_CHANNAMEINUSE
|
2214
|
|
- var code string
|
2215
|
|
- switch err {
|
2216
|
|
- case errNoSuchChannel:
|
2217
|
|
- code = ERR_NOSUCHCHANNEL
|
2218
|
|
- case errRenamePrivsNeeded:
|
2219
|
|
- code = ERR_CHANOPRIVSNEEDED
|
2220
|
|
- case errInvalidChannelName:
|
2221
|
|
- code = ERR_UNKNOWNERROR
|
2222
|
|
- case errChannelNameInUse:
|
2223
|
|
- code = ERR_UNKNOWNERROR
|
2224
|
|
- default:
|
2225
|
|
- code = ERR_UNKNOWNERROR
|
2226
|
|
- }
|
2227
|
|
- rb.Add(nil, server.name, code, client.Nick(), "RENAME", name, err.Error())
|
2228
|
|
- }
|
2229
|
|
-
|
2230
|
|
- oldName := strings.TrimSpace(msg.Params[0])
|
2231
|
|
- newName := strings.TrimSpace(msg.Params[1])
|
2232
|
|
- if oldName == "" || newName == "" {
|
2233
|
|
- errorResponse(errInvalidChannelName, "<empty>")
|
2234
|
|
- return
|
2235
|
|
- }
|
2236
|
|
- casefoldedOldName, err := CasefoldChannel(oldName)
|
2237
|
|
- if err != nil {
|
2238
|
|
- errorResponse(errInvalidChannelName, oldName)
|
2239
|
|
- return
|
|
2211
|
+ oldName, newName := msg.Params[0], msg.Params[1]
|
|
2212
|
+ if newName == "" {
|
|
2213
|
+ newName = "<empty>" // intentionally invalid channel name, will error as expected
|
2240
|
2214
|
}
|
2241
|
|
-
|
2242
|
|
- reason := "No reason"
|
|
2215
|
+ var reason string
|
2243
|
2216
|
if 2 < len(msg.Params) {
|
2244
|
2217
|
reason = msg.Params[2]
|
2245
|
2218
|
}
|
2246
|
2219
|
|
2247
|
2220
|
channel := server.channels.Get(oldName)
|
2248
|
2221
|
if channel == nil {
|
2249
|
|
- errorResponse(errNoSuchChannel, oldName)
|
2250
|
|
- return
|
|
2222
|
+ rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), oldName, client.t("No such channel"))
|
|
2223
|
+ return false
|
2251
|
2224
|
}
|
2252
|
|
- //TODO(dan): allow IRCops to do this?
|
2253
|
|
- if !channel.ClientIsAtLeast(client, modes.Operator) {
|
2254
|
|
- errorResponse(errRenamePrivsNeeded, oldName)
|
2255
|
|
- return
|
|
2225
|
+ casefoldedOldName := channel.NameCasefolded()
|
|
2226
|
+ if !(channel.ClientIsAtLeast(client, modes.Operator) || client.HasRoleCapabs("chanreg")) {
|
|
2227
|
+ rb.Add(nil, server.name, ERR_CHANOPRIVSNEEDED, client.Nick(), oldName, client.t("You're not a channel operator"))
|
|
2228
|
+ return false
|
2256
|
2229
|
}
|
2257
|
2230
|
|
2258
|
2231
|
founder := channel.Founder()
|
2259
|
2232
|
if founder != "" && founder != client.Account() {
|
2260
|
|
- //TODO(dan): Change this to ERR_CANNOTRENAME
|
2261
|
|
- rb.Add(nil, server.name, ERR_UNKNOWNERROR, client.nick, "RENAME", oldName, client.t("Only channel founders can change registered channels"))
|
|
2233
|
+ rb.Add(nil, server.name, ERR_CANNOTRENAME, client.Nick(), oldName, newName, client.t("Only channel founders can change registered channels"))
|
2262
|
2234
|
return false
|
2263
|
2235
|
}
|
2264
|
2236
|
|
2265
|
2237
|
// perform the channel rename
|
2266
|
|
- err = server.channels.Rename(oldName, newName)
|
|
2238
|
+ err := server.channels.Rename(oldName, newName)
|
|
2239
|
+ if err == errInvalidChannelName {
|
|
2240
|
+ rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), newName, client.t(err.Error()))
|
|
2241
|
+ } else if err == errChannelNameInUse {
|
|
2242
|
+ rb.Add(nil, server.name, ERR_CHANNAMEINUSE, client.Nick(), newName, client.t(err.Error()))
|
|
2243
|
+ } else if err != nil {
|
|
2244
|
+ rb.Add(nil, server.name, ERR_CANNOTRENAME, client.Nick(), oldName, newName, client.t("Cannot rename channel"))
|
|
2245
|
+ }
|
2267
|
2246
|
if err != nil {
|
2268
|
|
- errorResponse(err, newName)
|
2269
|
|
- return
|
|
2247
|
+ return false
|
2270
|
2248
|
}
|
2271
|
2249
|
|
2272
|
2250
|
// rename succeeded, persist it
|
|
@@ -2274,15 +2252,33 @@ func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
|
2274
|
2252
|
|
2275
|
2253
|
// send RENAME messages
|
2276
|
2254
|
for _, mcl := range channel.Members() {
|
|
2255
|
+ targetRb := rb
|
|
2256
|
+ if mcl != client {
|
|
2257
|
+ targetRb = NewResponseBuffer(mcl)
|
|
2258
|
+ }
|
|
2259
|
+ prefix := mcl.NickMaskString()
|
2277
|
2260
|
if mcl.capabilities.Has(caps.Rename) {
|
2278
|
|
- mcl.Send(nil, client.nickMaskString, "RENAME", oldName, newName, reason)
|
|
2261
|
+ if reason != "" {
|
|
2262
|
+ targetRb.Add(nil, prefix, "RENAME", oldName, newName, reason)
|
|
2263
|
+ } else {
|
|
2264
|
+ targetRb.Add(nil, prefix, "RENAME", oldName, newName)
|
|
2265
|
+ }
|
2279
|
2266
|
} else {
|
2280
|
|
- mcl.Send(nil, mcl.nickMaskString, "PART", oldName, fmt.Sprintf(mcl.t("Channel renamed: %s"), reason))
|
|
2267
|
+ if reason != "" {
|
|
2268
|
+ targetRb.Add(nil, prefix, "PART", oldName, fmt.Sprintf(mcl.t("Channel renamed: %s"), reason))
|
|
2269
|
+ } else {
|
|
2270
|
+ targetRb.Add(nil, prefix, "PART", oldName, fmt.Sprintf(mcl.t("Channel renamed")))
|
|
2271
|
+ }
|
2281
|
2272
|
if mcl.capabilities.Has(caps.ExtendedJoin) {
|
2282
|
|
- mcl.Send(nil, mcl.nickMaskString, "JOIN", newName, mcl.AccountName(), mcl.realname)
|
|
2273
|
+ targetRb.Add(nil, prefix, "JOIN", newName, mcl.AccountName(), mcl.Realname())
|
2283
|
2274
|
} else {
|
2284
|
|
- mcl.Send(nil, mcl.nickMaskString, "JOIN", newName)
|
|
2275
|
+ targetRb.Add(nil, prefix, "JOIN", newName)
|
2285
|
2276
|
}
|
|
2277
|
+ channel.SendTopic(mcl, targetRb, false)
|
|
2278
|
+ channel.Names(mcl, targetRb)
|
|
2279
|
+ }
|
|
2280
|
+ if mcl != client {
|
|
2281
|
+ targetRb.Send(false)
|
2286
|
2282
|
}
|
2287
|
2283
|
}
|
2288
|
2284
|
|