You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

nickname.go 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright (c) 2012-2014 Jeremy Latt
  2. // Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
  3. // released under the MIT license
  4. package irc
  5. import (
  6. "fmt"
  7. "strings"
  8. "github.com/goshuirc/irc-go/ircfmt"
  9. "github.com/goshuirc/irc-go/ircmsg"
  10. "github.com/oragono/oragono/irc/sno"
  11. )
  12. var (
  13. restrictedNicknames = map[string]bool{
  14. "=scene=": true, // used for rp commands
  15. "chanserv": true,
  16. "nickserv": true,
  17. }
  18. )
  19. // NICK <nickname>
  20. func nickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  21. if !client.authorized {
  22. client.Quit("Bad password")
  23. return true
  24. }
  25. return performNickChange(server, client, client, msg.Params[0])
  26. }
  27. func performNickChange(server *Server, client *Client, target *Client, newnick string) bool {
  28. nickname := strings.TrimSpace(newnick)
  29. cfnick, err := CasefoldName(nickname)
  30. if len(nickname) < 1 {
  31. client.Send(nil, server.name, ERR_NONICKNAMEGIVEN, client.nick, client.t("No nickname given"))
  32. return false
  33. }
  34. if err != nil || len(nickname) > server.Limits().NickLen || restrictedNicknames[cfnick] {
  35. client.Send(nil, server.name, ERR_ERRONEUSNICKNAME, client.nick, nickname, client.t("Erroneous nickname"))
  36. return false
  37. }
  38. if target.Nick() == nickname {
  39. return false
  40. }
  41. hadNick := target.HasNick()
  42. origNick := target.Nick()
  43. origNickMask := target.NickMaskString()
  44. err = client.server.clients.SetNick(target, nickname)
  45. if err == ErrNicknameInUse {
  46. client.Send(nil, server.name, ERR_NICKNAMEINUSE, client.nick, nickname, client.t("Nickname is already in use"))
  47. return false
  48. } else if err != nil {
  49. client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "NICK", fmt.Sprintf(client.t("Could not set or change nickname: %s"), err.Error()))
  50. return false
  51. }
  52. client.server.logger.Debug("nick", fmt.Sprintf("%s changed nickname to %s [%s]", origNickMask, nickname, cfnick))
  53. if hadNick {
  54. target.server.snomasks.Send(sno.LocalNicks, fmt.Sprintf(ircfmt.Unescape("$%s$r changed nickname to %s"), origNick, nickname))
  55. target.server.whoWas.Append(client)
  56. for friend := range target.Friends() {
  57. friend.Send(nil, origNickMask, "NICK", nickname)
  58. }
  59. }
  60. if target.registered {
  61. client.server.monitorManager.AlertAbout(target, true)
  62. } else {
  63. server.tryRegister(target)
  64. }
  65. return false
  66. }
  67. // SANICK <oldnick> <nickname>
  68. func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  69. targetNick := strings.TrimSpace(msg.Params[0])
  70. target := server.clients.Get(targetNick)
  71. if target == nil {
  72. client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], client.t("No such nick"))
  73. return false
  74. }
  75. return performNickChange(server, client, target, msg.Params[1])
  76. }