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.

115 lines
2.8 KiB

  1. package main
  2. import (
  3. "bufio"
  4. "context"
  5. "encoding/json"
  6. "flag"
  7. "fmt"
  8. "github.com/gissleh/irc/handlers"
  9. "log"
  10. "os"
  11. "strings"
  12. "github.com/gissleh/irc"
  13. )
  14. var flagNick = flag.String("nick", "Test", "The client nick")
  15. var flagAlts = flag.String("alts", "Test2,Test3,Test4,Test5", "Alternative nicks to use")
  16. var flagUser = flag.String("user", "test", "The client user/ident")
  17. var flagPass = flag.String("pass", "", "The server password")
  18. var flagServer = flag.String("server", "localhost:6667", "The server to connect to")
  19. var flagSsl = flag.Bool("ssl", false, "Whether to connect securely")
  20. var flagSkipVerify = flag.Bool("skip-verify", false, "Skip SSL verification")
  21. func main() {
  22. ctx, cancel := context.WithCancel(context.Background())
  23. defer cancel()
  24. flag.Parse()
  25. client := irc.New(ctx, irc.Config{
  26. Nick: *flagNick,
  27. User: *flagUser,
  28. Alternatives: strings.Split(*flagAlts, ","),
  29. Password: *flagPass,
  30. Languages: []string{"no_NB", "no", "en_US", "en"},
  31. SkipSSLVerification: *flagSkipVerify,
  32. })
  33. client.AddHandler(handlers.Input)
  34. client.AddHandler(handlers.MRoleplay)
  35. err := client.Connect(*flagServer, *flagSsl)
  36. if err != nil {
  37. fmt.Fprintf(os.Stderr, "Failed to connect: %s", err)
  38. os.Exit(1)
  39. }
  40. var target irc.Target
  41. client.AddHandler(func(event *irc.Event, client *irc.Client) {
  42. if event.Name() == "input.target" {
  43. name := event.Arg(0)
  44. if client.ISupport().IsChannel(name) {
  45. log.Println("Set target channel", name)
  46. target = client.Target("target", name)
  47. } else if len(name) > 0 {
  48. log.Println("Set target query", name)
  49. target = client.Target("query", name)
  50. } else {
  51. log.Println("Set target status")
  52. target = client.Target("status", "status")
  53. }
  54. if target == nil {
  55. log.Println("Target does not exist, set to status")
  56. target = client.Target("status", "status")
  57. }
  58. event.PreventDefault()
  59. return
  60. }
  61. if event.Name() == "input.clientstatus" {
  62. j, err := json.MarshalIndent(client.State(), "", " ")
  63. if err != nil {
  64. return
  65. }
  66. fmt.Println(string(j))
  67. event.PreventDefault()
  68. return
  69. }
  70. if event.Name() == "hook.remove_target" {
  71. if target != nil && target.Name() == event.Arg(2) && target.Kind() == event.Arg(1) {
  72. log.Println("Unset target ", event.Arg(1), event.Arg(2))
  73. target = nil
  74. }
  75. }
  76. if event.Name() == "hook.add_target" {
  77. log.Println("Set target ", event.Arg(1), event.Arg(2))
  78. target = client.Target(event.Arg(1), event.Arg(2))
  79. }
  80. j, err := json.MarshalIndent(event, "", " ")
  81. if err != nil {
  82. return
  83. }
  84. fmt.Println(string(j))
  85. })
  86. reader := bufio.NewReader(os.Stdin)
  87. for {
  88. line, err := reader.ReadString('\n')
  89. if err != nil {
  90. break
  91. }
  92. client.EmitInput(line[:len(line)-1], target)
  93. }
  94. }