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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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 "github.com/DanielOaks/girc-go/ircmsg"
  6. // NICK <nickname>
  7. func nickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  8. if !client.authorized {
  9. client.Quit("Bad password")
  10. return true
  11. }
  12. nickname := NewName(msg.Params[0])
  13. if len(nickname) < 1 {
  14. client.Send(nil, server.nameString, ERR_NONICKNAMEGIVEN, client.nickString, "No nickname given")
  15. return false
  16. }
  17. if !nickname.IsNickname() {
  18. client.Send(nil, server.nameString, ERR_ERRONEUSNICKNAME, client.nickString, msg.Params[0], "Erroneous nickname")
  19. return false
  20. }
  21. if client.nick == nickname {
  22. return false
  23. }
  24. //TODO(dan): There's probably some races here, we should be changing this in the primary server thread
  25. target := server.clients.Get(nickname)
  26. if target != nil && target != client {
  27. client.Send(nil, server.nameString, ERR_NICKNAMEINUSE, client.nickString, msg.Params[0], "Nickname is already in use")
  28. return false
  29. }
  30. if client.registered {
  31. client.ChangeNickname(nickname)
  32. } else {
  33. client.SetNickname(nickname)
  34. }
  35. server.tryRegister(client)
  36. return false
  37. }
  38. // SANICK <oldnick> <nickname>
  39. func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  40. if !client.authorized {
  41. client.Quit("Bad password")
  42. return true
  43. }
  44. oldnick := NewName(msg.Params[0])
  45. nickname := NewName(msg.Params[1])
  46. if len(nickname) < 1 {
  47. client.Send(nil, server.nameString, ERR_NONICKNAMEGIVEN, client.nickString, "No nickname given")
  48. return false
  49. }
  50. if !nickname.IsNickname() {
  51. client.Send(nil, server.nameString, ERR_ERRONEUSNICKNAME, client.nickString, msg.Params[0], "Erroneous nickname")
  52. return false
  53. }
  54. if client.nick == nickname {
  55. return false
  56. }
  57. target := server.clients.Get(oldnick)
  58. if target == nil {
  59. client.Send(nil, server.nameString, ERR_NOSUCHNICK, msg.Params[0], "No such nick")
  60. return false
  61. }
  62. //TODO(dan): There's probably some races here, we should be changing this in the primary server thread
  63. if server.clients.Get(nickname) != nil {
  64. client.Send(nil, server.nameString, ERR_NICKNAMEINUSE, client.nickString, msg.Params[0], "Nickname is already in use")
  65. return false
  66. }
  67. target.ChangeNickname(nickname)
  68. return false
  69. }