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

roleplay.go 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
  2. // released under the MIT license
  3. package irc
  4. import (
  5. "fmt"
  6. "github.com/goshuirc/irc-go/ircmsg"
  7. "github.com/oragono/oragono/irc/caps"
  8. )
  9. const (
  10. npcNickMask = "*%s*!%s@npc.fakeuser.invalid"
  11. sceneNickMask = "=Scene=!%s@npc.fakeuser.invalid"
  12. )
  13. // SCENE <target> <text to be sent>
  14. func sceneHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  15. target := msg.Params[0]
  16. message := msg.Params[1]
  17. sourceString := fmt.Sprintf(sceneNickMask, client.nick)
  18. sendRoleplayMessage(server, client, sourceString, target, false, message)
  19. return false
  20. }
  21. // NPC <target> <sourcenick> <text to be sent>
  22. func npcHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  23. target := msg.Params[0]
  24. fakeSource := msg.Params[1]
  25. message := msg.Params[2]
  26. _, err := CasefoldName(fakeSource)
  27. if err != nil {
  28. client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, client.t("Fake source must be a valid nickname"))
  29. return false
  30. }
  31. sourceString := fmt.Sprintf(npcNickMask, fakeSource, client.nick)
  32. sendRoleplayMessage(server, client, sourceString, target, false, message)
  33. return false
  34. }
  35. // NPCA <target> <sourcenick> <text to be sent>
  36. func npcaHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
  37. target := msg.Params[0]
  38. fakeSource := msg.Params[1]
  39. message := msg.Params[2]
  40. sourceString := fmt.Sprintf(npcNickMask, fakeSource, client.nick)
  41. _, err := CasefoldName(fakeSource)
  42. if err != nil {
  43. client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, client.t("Fake source must be a valid nickname"))
  44. return false
  45. }
  46. sendRoleplayMessage(server, client, sourceString, target, true, message)
  47. return false
  48. }
  49. func sendRoleplayMessage(server *Server, client *Client, source string, targetString string, isAction bool, message string) {
  50. if isAction {
  51. message = fmt.Sprintf("\x01ACTION %s (%s)\x01", message, client.nick)
  52. } else {
  53. message = fmt.Sprintf("%s (%s)", message, client.nick)
  54. }
  55. target, cerr := CasefoldChannel(targetString)
  56. if cerr == nil {
  57. channel := server.channels.Get(target)
  58. if channel == nil {
  59. client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, client.t("No such channel"))
  60. return
  61. }
  62. if !channel.CanSpeak(client) {
  63. client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
  64. return
  65. }
  66. if !channel.flags[ChanRoleplaying] {
  67. client.Send(nil, client.server.name, ERR_CANNOTSENDRP, channel.name, client.t("Channel doesn't have roleplaying mode available"))
  68. return
  69. }
  70. for _, member := range channel.Members() {
  71. if member == client && !client.capabilities.Has(caps.EchoMessage) {
  72. continue
  73. }
  74. member.Send(nil, source, "PRIVMSG", channel.name, message)
  75. }
  76. } else {
  77. target, err := CasefoldName(targetString)
  78. user := server.clients.Get(target)
  79. if err != nil || user == nil {
  80. client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, target, client.t("No such nick"))
  81. return
  82. }
  83. if !user.flags[UserRoleplaying] {
  84. client.Send(nil, client.server.name, ERR_CANNOTSENDRP, user.nick, client.t("User doesn't have roleplaying mode enabled"))
  85. return
  86. }
  87. user.Send(nil, source, "PRIVMSG", user.nick, message)
  88. if client.capabilities.Has(caps.EchoMessage) {
  89. client.Send(nil, source, "PRIVMSG", user.nick, message)
  90. }
  91. if user.flags[Away] {
  92. //TODO(dan): possibly implement cooldown of away notifications to users
  93. client.Send(nil, server.name, RPL_AWAY, user.nick, user.awayMessage)
  94. }
  95. }
  96. }