Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

nickname.go 2.5KB

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