Mirror of github.com/gissleh/irc
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.

138 lines
3.5 KiB

  1. package handlers
  2. import (
  3. "github.com/gissleh/irc"
  4. "github.com/gissleh/irc/ircutil"
  5. "time"
  6. )
  7. // Input handles the default input.
  8. func Input(event *irc.Event, client *irc.Client) {
  9. switch event.Name() {
  10. // /msg sends an action to a target specified before the message.
  11. case "input.msg":
  12. {
  13. event.PreventDefault()
  14. targetName, text := ircutil.ParseArgAndText(event.Text)
  15. if targetName == "" || text == "" {
  16. client.EmitNonBlocking(irc.NewErrorEvent("input", "Usage: /msg <target> <text...>"))
  17. break
  18. }
  19. overhead := client.PrivmsgOverhead(targetName, true)
  20. cuts := ircutil.CutMessage(text, overhead)
  21. for _, cut := range cuts {
  22. client.Sendf("PRIVMSG %s :%s", targetName, cut)
  23. }
  24. }
  25. // /text (or text without a command) sends a message to the target.
  26. case "input.text":
  27. {
  28. event.PreventDefault()
  29. if event.Text == "" {
  30. client.EmitNonBlocking(irc.NewErrorEvent("input", "Usage: /text <text...>"))
  31. break
  32. }
  33. target := event.Target("query", "channel")
  34. if target == nil {
  35. client.EmitNonBlocking(irc.NewErrorEvent("input", "Target is not a channel or query"))
  36. break
  37. }
  38. overhead := client.PrivmsgOverhead(target.Name(), false)
  39. cuts := ircutil.CutMessage(event.Text, overhead)
  40. for _, cut := range cuts {
  41. client.SendQueuedf("PRIVMSG %s :%s", target.Name(), cut)
  42. }
  43. }
  44. // /me and /action sends a CTCP ACTION.
  45. case "input.me", "input.action":
  46. {
  47. event.PreventDefault()
  48. if event.Text == "" {
  49. client.EmitNonBlocking(irc.NewErrorEvent("input", "Usage: /me <text...>"))
  50. break
  51. }
  52. target := event.Target("query", "channel")
  53. if target == nil {
  54. client.EmitNonBlocking(irc.NewErrorEvent("input", "Target is not a channel or query"))
  55. break
  56. }
  57. overhead := client.PrivmsgOverhead(target.Name(), true)
  58. cuts := ircutil.CutMessage(event.Text, overhead)
  59. for _, cut := range cuts {
  60. client.SendCTCP("ACTION", target.Name(), false, cut)
  61. if !client.CapEnabled("echo-message") {
  62. event := irc.NewEvent("echo", "action")
  63. event.Time = time.Now()
  64. event.Nick = client.Nick()
  65. event.User = client.User()
  66. event.Host = client.Host()
  67. event.Args = []string{target.Name()}
  68. event.Text = cut
  69. client.EmitNonBlocking(event)
  70. }
  71. }
  72. }
  73. // /describe sends an action to a target specified before the message, like /msg.
  74. case "input.describe":
  75. {
  76. event.PreventDefault()
  77. targetName, text := ircutil.ParseArgAndText(event.Text)
  78. if targetName == "" || text == "" {
  79. client.EmitNonBlocking(irc.NewErrorEvent("input", "Usage: /describe <target> <text...>"))
  80. break
  81. }
  82. overhead := client.PrivmsgOverhead(targetName, true)
  83. cuts := ircutil.CutMessage(text, overhead)
  84. for _, cut := range cuts {
  85. client.SendCTCP("ACTION", targetName, false, cut)
  86. if !client.CapEnabled("echo-message") {
  87. event := irc.NewEvent("echo", "action")
  88. event.Time = time.Now()
  89. event.Nick = client.Nick()
  90. event.User = client.User()
  91. event.Host = client.Host()
  92. event.Args = []string{targetName}
  93. event.Text = cut
  94. client.EmitNonBlocking(event)
  95. }
  96. }
  97. }
  98. // /m is a shorthand for /mode that targets the current channel
  99. case "input.m":
  100. {
  101. event.PreventDefault()
  102. if event.Text == "" {
  103. client.EmitNonBlocking(irc.NewErrorEvent("input", "Usage: /m <text...>"))
  104. break
  105. }
  106. channel := event.ChannelTarget()
  107. if channel == nil {
  108. client.EmitNonBlocking(irc.NewErrorEvent("input", "Target is not a channel"))
  109. break
  110. }
  111. client.SendQueuedf("MODE %s %s", channel.Name(), event.Text)
  112. }
  113. }
  114. }