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.

113 lines
2.8 KiB

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