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

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