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

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