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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. message = fmt.Sprintf("%s (%s)", message, client.nick)
  18. }
  19. target, cerr := CasefoldChannel(targetString)
  20. if cerr == nil {
  21. channel := server.channels.Get(target)
  22. if channel == nil {
  23. rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, client.t("No such channel"))
  24. return
  25. }
  26. if !channel.CanSpeak(client) {
  27. rb.Add(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
  28. return
  29. }
  30. if !channel.flags[modes.ChanRoleplaying] {
  31. rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, channel.name, client.t("Channel doesn't have roleplaying mode available"))
  32. return
  33. }
  34. for _, member := range channel.Members() {
  35. if member == client && !client.capabilities.Has(caps.EchoMessage) {
  36. continue
  37. }
  38. if member == client {
  39. rb.Add(nil, source, "PRIVMSG", channel.name, message)
  40. } else {
  41. member.Send(nil, source, "PRIVMSG", channel.name, message)
  42. }
  43. }
  44. } else {
  45. target, err := CasefoldName(targetString)
  46. user := server.clients.Get(target)
  47. if err != nil || user == nil {
  48. rb.Add(nil, server.name, ERR_NOSUCHNICK, client.nick, target, client.t("No such nick"))
  49. return
  50. }
  51. if !user.flags[modes.UserRoleplaying] {
  52. rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, user.nick, client.t("User doesn't have roleplaying mode enabled"))
  53. return
  54. }
  55. user.Send(nil, source, "PRIVMSG", user.nick, message)
  56. if client.capabilities.Has(caps.EchoMessage) {
  57. rb.Add(nil, source, "PRIVMSG", user.nick, message)
  58. }
  59. if user.flags[modes.Away] {
  60. //TODO(dan): possibly implement cooldown of away notifications to users
  61. rb.Add(nil, server.name, RPL_AWAY, user.nick, user.awayMessage)
  62. }
  63. }
  64. }