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.

roleplay.go 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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/oragono/oragono/irc/caps"
  7. "github.com/oragono/oragono/irc/modes"
  8. )
  9. const (
  10. npcNickMask = "*%s*!%s@npc.fakeuser.invalid"
  11. sceneNickMask = "=Scene=!%s@npc.fakeuser.invalid"
  12. )
  13. func sendRoleplayMessage(server *Server, client *Client, source string, targetString string, isAction bool, message string, rb *ResponseBuffer) {
  14. if isAction {
  15. message = fmt.Sprintf("\x01ACTION %s (%s)\x01", message, client.nick)
  16. } else {
  17. // block attempts to send CTCP messages to Tor clients
  18. // TODO(#395) clean this up
  19. if len(message) != 0 && message[0] == '\x01' {
  20. return
  21. }
  22. message = fmt.Sprintf("%s (%s)", message, client.nick)
  23. }
  24. target, cerr := CasefoldChannel(targetString)
  25. if cerr == nil {
  26. channel := server.channels.Get(target)
  27. if channel == nil {
  28. rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, client.t("No such channel"))
  29. return
  30. }
  31. if !channel.CanSpeak(client) {
  32. rb.Add(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
  33. return
  34. }
  35. if !channel.flags.HasMode(modes.ChanRoleplaying) {
  36. rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, channel.name, client.t("Channel doesn't have roleplaying mode available"))
  37. return
  38. }
  39. for _, member := range channel.Members() {
  40. if member == client && !client.capabilities.Has(caps.EchoMessage) {
  41. continue
  42. }
  43. if member == client {
  44. rb.Add(nil, source, "PRIVMSG", channel.name, message)
  45. } else {
  46. member.Send(nil, source, "PRIVMSG", channel.name, message)
  47. }
  48. }
  49. } else {
  50. target, err := CasefoldName(targetString)
  51. user := server.clients.Get(target)
  52. if err != nil || user == nil {
  53. rb.Add(nil, server.name, ERR_NOSUCHNICK, client.nick, target, client.t("No such nick"))
  54. return
  55. }
  56. if !user.HasMode(modes.UserRoleplaying) {
  57. rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, user.nick, client.t("User doesn't have roleplaying mode enabled"))
  58. return
  59. }
  60. cnick := client.Nick()
  61. tnick := user.Nick()
  62. user.Send(nil, source, "PRIVMSG", tnick, message)
  63. if client.capabilities.Has(caps.EchoMessage) {
  64. rb.Add(nil, source, "PRIVMSG", tnick, message)
  65. }
  66. if user.HasMode(modes.Away) {
  67. //TODO(dan): possibly implement cooldown of away notifications to users
  68. rb.Add(nil, server.name, RPL_AWAY, cnick, tnick, user.AwayMessage())
  69. }
  70. }
  71. }