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

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