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.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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/DanielOaks/girc-go/ircmsg"
  9. )
  10. var (
  11. restrictedNicknames = map[string]bool{
  12. "=scene=": true, // used for rp commands
  13. "chanserv": true,
  14. "nickserv": true,
  15. }
  16. )
  17. // NICK <nickname>
  18. func nickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  19. if !client.authorized {
  20. client.Quit("Bad password")
  21. return true
  22. }
  23. nicknameRaw := strings.TrimSpace(msg.Params[0])
  24. nickname, err := CasefoldName(nicknameRaw)
  25. if len(nicknameRaw) < 1 {
  26. client.Send(nil, server.name, ERR_NONICKNAMEGIVEN, client.nick, "No nickname given")
  27. return false
  28. }
  29. if err != nil || len(nicknameRaw) > server.limits.NickLen || restrictedNicknames[nickname] {
  30. client.Send(nil, server.name, ERR_ERRONEUSNICKNAME, client.nick, nicknameRaw, "Erroneous nickname")
  31. return false
  32. }
  33. if client.nick == nickname {
  34. return false
  35. }
  36. // bleh, this will be replaced and done below
  37. if client.registered {
  38. err = client.ChangeNickname(nicknameRaw)
  39. } else {
  40. err = client.SetNickname(nicknameRaw)
  41. }
  42. if err == ErrNicknameInUse {
  43. client.Send(nil, server.name, ERR_NICKNAMEINUSE, client.nick, nicknameRaw, "Nickname is already in use")
  44. return false
  45. } else if err != nil {
  46. client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "NICK", fmt.Sprintf("Could not set or change nickname: %s", err.Error()))
  47. return false
  48. }
  49. if client.registered {
  50. client.alertMonitors()
  51. }
  52. server.tryRegister(client)
  53. return false
  54. }
  55. // SANICK <oldnick> <nickname>
  56. func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  57. if !client.authorized {
  58. client.Quit("Bad password")
  59. return true
  60. }
  61. oldnick, oerr := CasefoldName(msg.Params[0])
  62. nickname, err := CasefoldName(msg.Params[1])
  63. if len(nickname) < 1 {
  64. client.Send(nil, server.name, ERR_NONICKNAMEGIVEN, client.nick, "No nickname given")
  65. return false
  66. }
  67. if oerr != nil || err != nil || len(strings.TrimSpace(msg.Params[1])) > server.limits.NickLen || restrictedNicknames[nickname] {
  68. client.Send(nil, server.name, ERR_ERRONEUSNICKNAME, client.nick, msg.Params[0], "Erroneous nickname")
  69. return false
  70. }
  71. if client.nick == msg.Params[1] {
  72. return false
  73. }
  74. target := server.clients.Get(oldnick)
  75. if target == nil {
  76. client.Send(nil, server.name, ERR_NOSUCHNICK, msg.Params[0], "No such nick")
  77. return false
  78. }
  79. //TODO(dan): There's probably some races here, we should be changing this in the primary server thread
  80. if server.clients.Get(nickname) != nil || server.clients.Get(nickname) != target {
  81. client.Send(nil, server.name, ERR_NICKNAMEINUSE, client.nick, msg.Params[0], "Nickname is already in use")
  82. return false
  83. }
  84. target.ChangeNickname(msg.Params[1])
  85. return false
  86. }