Browse Source

add sadrop command

tags/v0.11.0-beta
Shivaram Lingamneni 6 years ago
parent
commit
fd34c78d6b
2 changed files with 39 additions and 25 deletions
  1. 22
    14
      irc/accounts.go
  2. 17
    11
      irc/nickserv.go

+ 22
- 14
irc/accounts.go View File

@@ -358,29 +358,37 @@ func unmarshalReservedNicks(nicks string) (result []string) {
358 358
 	return strings.Split(nicks, ",")
359 359
 }
360 360
 
361
-func (am *AccountManager) SetNickReserved(client *Client, nick string, reserve bool) error {
361
+func (am *AccountManager) SetNickReserved(client *Client, nick string, saUnreserve bool, reserve bool) error {
362 362
 	cfnick, err := CasefoldName(nick)
363
-	if err != nil {
364
-		return errAccountNickReservationFailed
365
-	}
366
-
367
-	// sanity check so we don't persist bad data
368
-	account := client.Account()
369
-	if account == "" || cfnick == "" || !am.server.AccountConfig().NickReservation.Enabled {
363
+	// garbage nick, or garbage options, or disabled
364
+	nrconfig := am.server.AccountConfig().NickReservation
365
+	if err != nil || cfnick == "" || (reserve && saUnreserve) || !nrconfig.Enabled {
370 366
 		return errAccountNickReservationFailed
371 367
 	}
372 368
 
373
-	limit := am.server.AccountConfig().NickReservation.AdditionalNickLimit
374
-
369
+	// the cache is in sync with the DB while we hold serialCacheUpdateMutex
375 370
 	am.serialCacheUpdateMutex.Lock()
376 371
 	defer am.serialCacheUpdateMutex.Unlock()
377 372
 
378
-	// the cache is in sync with the DB while we hold serialCacheUpdateMutex
373
+	// find the affected account, which is usually the client's:
374
+	account := client.Account()
375
+	if saUnreserve {
376
+		// unless this is a sadrop:
377
+		account = am.NickToAccount(cfnick)
378
+		if account == "" {
379
+			// nothing to do
380
+			return nil
381
+		}
382
+	}
383
+	if account == "" {
384
+		return errAccountNotLoggedIn
385
+	}
386
+
379 387
 	accountForNick := am.NickToAccount(cfnick)
380 388
 	if reserve && accountForNick != "" {
381 389
 		return errNicknameReserved
382
-	} else if !reserve && accountForNick != account {
383
-		return errAccountNickReservationFailed
390
+	} else if !reserve && !saUnreserve && accountForNick != account {
391
+		return errNicknameReserved
384 392
 	} else if !reserve && cfnick == account {
385 393
 		return errAccountCantDropPrimaryNick
386 394
 	}
@@ -405,7 +413,7 @@ func (am *AccountManager) SetNickReserved(client *Client, nick string, reserve b
405 413
 		nicks := unmarshalReservedNicks(rawNicks)
406 414
 
407 415
 		if reserve {
408
-			if len(nicks) >= limit {
416
+			if len(nicks) >= nrconfig.AdditionalNickLimit {
409 417
 				return errAccountTooManyNicks
410 418
 			}
411 419
 			nicks = append(nicks, cfnick)

+ 17
- 11
irc/nickserv.go View File

@@ -90,7 +90,10 @@ func (server *Server) nickservPrivmsgHandler(client *Client, message string, rb
90 90
 		server.nickservGroupHandler(client, rb)
91 91
 	} else if command == "drop" {
92 92
 		nick, _ := extractParam(params)
93
-		server.nickservDropHandler(client, nick, rb)
93
+		server.nickservDropHandler(client, nick, false, rb)
94
+	} else if command == "sadrop" {
95
+		nick, _ := extractParam(params)
96
+		server.nickservDropHandler(client, nick, true, rb)
94 97
 	} else {
95 98
 		rb.Notice(client.t("Command not recognised. To see the available commands, run /NS HELP"))
96 99
 	}
@@ -294,13 +297,13 @@ func (server *Server) nickservGroupHandler(client *Client, rb *ResponseBuffer) {
294 297
 	}
295 298
 
296 299
 	nick := client.NickCasefolded()
297
-	err := server.accounts.SetNickReserved(client, nick, true)
300
+	err := server.accounts.SetNickReserved(client, nick, false, true)
298 301
 	if err == nil {
299 302
 		rb.Notice(fmt.Sprintf(client.t("Successfully grouped nick %s with your account"), nick))
300 303
 	} else if err == errAccountTooManyNicks {
301 304
 		rb.Notice(client.t("You have too many nicks reserved already (you can remove some with /NS DROP)"))
302 305
 	} else if err == errNicknameReserved {
303
-		rb.Notice(client.t("That nickname is already reserved"))
306
+		rb.Notice(client.t("That nickname is already reserved by someone else"))
304 307
 	} else {
305 308
 		rb.Notice(client.t("Error reserving nickname"))
306 309
 	}
@@ -334,20 +337,23 @@ func (server *Server) nickservInfoHandler(client *Client, nick string, rb *Respo
334 337
 	}
335 338
 }
336 339
 
337
-func (server *Server) nickservDropHandler(client *Client, nick string, rb *ResponseBuffer) {
338
-	account := client.Account()
339
-	if account == "" {
340
-		rb.Notice(client.t("You're not logged into an account"))
341
-		return
340
+func (server *Server) nickservDropHandler(client *Client, nick string, sadrop bool, rb *ResponseBuffer) {
341
+	if sadrop {
342
+		if !client.HasRoleCapabs("unregister") {
343
+			rb.Notice(client.t("Insufficient oper privs"))
344
+			return
345
+		}
342 346
 	}
343 347
 
344
-	err := server.accounts.SetNickReserved(client, nick, false)
348
+	err := server.accounts.SetNickReserved(client, nick, sadrop, false)
345 349
 	if err == nil {
346 350
 		rb.Notice(fmt.Sprintf(client.t("Successfully ungrouped nick %s with your account"), nick))
351
+	} else if err == errAccountNotLoggedIn {
352
+		rb.Notice(fmt.Sprintf(client.t("You're not logged into an account")))
347 353
 	} else if err == errAccountCantDropPrimaryNick {
348 354
 		rb.Notice(fmt.Sprintf(client.t("You can't ungroup your primary nickname (try unregistering your account instead)")))
349
-	} else if err == errAccountNickReservationFailed {
350
-		rb.Notice(fmt.Sprintf(client.t("You don't own that nick")))
355
+	} else if err == errNicknameReserved {
356
+		rb.Notice(fmt.Sprintf(client.t("That nickname is already reserved by someone else")))
351 357
 	} else {
352 358
 		rb.Notice(client.t("Error ungrouping nick"))
353 359
 	}

Loading…
Cancel
Save