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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. client.SetNickname(nickname)
  31. server.tryRegister(client)
  32. return false
  33. }
  34. // SANICK <oldnick> <nickname>
  35. func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  36. if !client.authorized {
  37. client.Quit("Bad password")
  38. return true
  39. }
  40. oldnick := NewName(msg.Params[0])
  41. nickname := NewName(msg.Params[1])
  42. if len(nickname) < 1 {
  43. client.Send(nil, server.nameString, ERR_NONICKNAMEGIVEN, client.nickString, "No nickname given")
  44. return false
  45. }
  46. if !nickname.IsNickname() {
  47. client.Send(nil, server.nameString, ERR_ERRONEUSNICKNAME, client.nickString, msg.Params[0], "Erroneous nickname")
  48. return false
  49. }
  50. if client.nick == nickname {
  51. return false
  52. }
  53. target := server.clients.Get(oldnick)
  54. if target == nil {
  55. client.Send(nil, server.nameString, ERR_NOSUCHNICK, msg.Params[0], "No such nick")
  56. return false
  57. }
  58. //TODO(dan): There's probably some races here, we should be changing this in the primary server thread
  59. if server.clients.Get(nickname) != nil {
  60. client.Send(nil, server.nameString, ERR_NICKNAMEINUSE, client.nickString, msg.Params[0], "Nickname is already in use")
  61. return false
  62. }
  63. target.SetNickname(nickname)
  64. return false
  65. }