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.

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