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.

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