您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

nickname.go 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 || nickname == "=scene=" {
  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. client.alertMonitors()
  37. } else {
  38. client.SetNickname(nicknameRaw)
  39. }
  40. server.tryRegister(client)
  41. return false
  42. }
  43. // SANICK <oldnick> <nickname>
  44. func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  45. if !client.authorized {
  46. client.Quit("Bad password")
  47. return true
  48. }
  49. oldnick, oerr := CasefoldName(msg.Params[0])
  50. nickname, err := CasefoldName(msg.Params[1])
  51. if len(nickname) < 1 {
  52. client.Send(nil, server.name, ERR_NONICKNAMEGIVEN, client.nick, "No nickname given")
  53. return false
  54. }
  55. if oerr != nil || err != nil || len(strings.TrimSpace(msg.Params[1])) > server.limits.NickLen || nickname == "=scene=" {
  56. client.Send(nil, server.name, ERR_ERRONEUSNICKNAME, client.nick, msg.Params[0], "Erroneous nickname")
  57. return false
  58. }
  59. if client.nick == msg.Params[1] {
  60. return false
  61. }
  62. target := server.clients.Get(oldnick)
  63. if target == nil {
  64. client.Send(nil, server.name, ERR_NOSUCHNICK, msg.Params[0], "No such nick")
  65. return false
  66. }
  67. //TODO(dan): There's probably some races here, we should be changing this in the primary server thread
  68. if server.clients.Get(nickname) != nil || server.clients.Get(nickname) != target {
  69. client.Send(nil, server.name, ERR_NICKNAMEINUSE, client.nick, msg.Params[0], "Nickname is already in use")
  70. return false
  71. }
  72. target.ChangeNickname(msg.Params[1])
  73. return false
  74. }