diff options
author | Hubert Hirtz <hubert@hirtz.pm> | 2020-11-29 12:27:52 +0100 |
---|---|---|
committer | Hubert Hirtz <hubert@hirtz.pm> | 2020-11-29 12:58:10 +0100 |
commit | c79110642bc0f7accd8ec312ef03535e60256ed1 (patch) | |
tree | 6ec42b78bdee45caaea318f5587f7f57ddb3700b | |
parent | Don't forward outdated typing timeouts (diff) |
Make cmd/test usable
Diffstat (limited to '')
-rw-r--r-- | README.md | 12 | ||||
-rw-r--r-- | cmd/test/main.go | 119 | ||||
-rw-r--r-- | go.mod | 1 | ||||
-rw-r--r-- | go.sum | 4 |
4 files changed, 86 insertions, 50 deletions
@@ -13,8 +13,6 @@ mkdir -p ~/.config/senpai cat <<EOF >~/.config/senpai/senpai.yaml addr: irc.freenode.net:6697 nick: senpai -real: Senpai is the best senpai -user: sasluser password: "my password can't be this cute" EOF go run ./cmd/irc @@ -25,6 +23,16 @@ Then, type `/join #senpai` and have a chat! See `doc/senpai.1.scd` for more information and `doc/senpai.5.scd` for more configuration options! +## Debugging errors, testing servers + +If you run into errors and want to find the WHY OH WHY, or if you'd like to try +things out with an IRC server, then you have two options: + +1. Run senpai with the `-debug` argument (or put `debug: true`) in your config, + it will then print in `home` all the data it sends and receives. +2. Run the test client, that uses the same IRC library but exposes a simpler + interface, by running `go run ./cmd/test -help`. + ## Contributing and stuff Patches are welcome at <mailto:~taiite/public-inbox@lists.sr.ht>! diff --git a/cmd/test/main.go b/cmd/test/main.go index 5560db8..b900d40 100644 --- a/cmd/test/main.go +++ b/cmd/test/main.go @@ -1,87 +1,78 @@ package main import ( - "bufio" "crypto/tls" "flag" - "log" + "fmt" + "io" "net" "os" "git.sr.ht/~taiite/senpai" "git.sr.ht/~taiite/senpai/irc" + "golang.org/x/term" ) -func main() { - var configPath string - var address string - var nick string - var password string - var useTLS bool - flag.StringVar(&configPath, "config", "", "path to the configuration file") - flag.StringVar(&address, "address", "", "server address") - flag.StringVar(&nick, "nick", "senpai", "IRC nick/user to use") - flag.StringVar(&password, "password", "", "SASL password to use") - flag.BoolVar(&useTLS, "tls", false, "whether to use tls") - flag.Parse() - - if address == "" { - if configPath == "" { - configDir, err := os.UserConfigDir() - if err != nil { - log.Panicln(err) - } - configPath = configDir + "/senpai/senpai.yaml" - } +var ( + configPath string + address string + nick string + password string + useTLS bool +) - cfg, err := senpai.LoadConfigFile(configPath) - if err != nil { - log.Panicln(err) - } +func main() { + parseFlags() - address = cfg.Addr - nick = cfg.Nick - if cfg.Password != nil { - password = *cfg.Password - } + oldState, err := term.MakeRaw(0) + if err != nil { + panic(err) } + defer term.Restore(0, oldState) + + screen := struct { + io.Reader + io.Writer + }{os.Stdin, os.Stdout} + t := term.NewTerminal(screen, "> ") - log.Printf("Connecting to %s...\n", address) + fmt.Fprintf(t, "Connecting to %s...\n", address) var conn net.Conn - var err error if useTLS { conn, err = tls.Dial("tcp", address, nil) } else { conn, err = net.Dial("tcp", address) } if err != nil { - log.Panicf("Failed to connect to %s: %v", address, err) + panic(fmt.Sprintf("Failed to connect to %s: %v\n", address, err)) } defer conn.Close() - log.Printf("Connected. Registration in progress...\n") + fmt.Fprintf(t, "Connected. Registration in progress...\n") - var auth irc.SASLPlain + var auth irc.SASLClient if password != "" { - auth = irc.SASLPlain{Username: nick, Password: password} + auth = &irc.SASLPlain{Username: nick, Password: password} } cli, err := irc.NewSession(conn, irc.SessionParams{ Nickname: nick, Username: nick, RealName: nick, - Auth: &auth, + Auth: auth, Debug: true, }) if err != nil { - log.Panicf("Failed to connect to %s: %v", address, err) + panic(fmt.Sprintf("Failed to connect to %s: %v", address, err)) } defer cli.Stop() go func() { - r := bufio.NewScanner(os.Stdin) - for r.Scan() { - line := r.Text() + for { + line, err := t.ReadLine() + if err != nil { + break + } cli.SendRaw(line) } cli.Stop() @@ -91,15 +82,47 @@ func main() { switch ev := ev.(type) { case irc.RawMessageEvent: if ev.Outgoing { - log.Printf("C > S: %s\n", ev.Message) + fmt.Fprintf(t, "C > S: %s\n", ev.Message) } else { - log.Printf("C < S: %s\n", ev.Message) + fmt.Fprintf(t, "C < S: %s\n", ev.Message) } case error: - log.Panicln(ev) + panic(ev) default: - log.Printf("Event: %T%+v", ev, ev) + fmt.Fprintf(t, "=EVENT: %T%+v\n", ev, ev) + } + } + t.SetPrompt("") + fmt.Fprintln(t, "Disconnected") +} + +func parseFlags() { + flag.StringVar(&configPath, "config", "", "path to the configuration file") + flag.StringVar(&address, "address", "", "server address") + flag.StringVar(&nick, "nick", "senpai", "IRC nick/user to use") + flag.StringVar(&password, "password", "", "SASL password to use") + flag.BoolVar(&useTLS, "tls", false, "use tls") + flag.Parse() + + if address == "" { + if configPath == "" { + configDir, err := os.UserConfigDir() + if err != nil { + panic(err) + } + configPath = configDir + "/senpai/senpai.yaml" + } + + cfg, err := senpai.LoadConfigFile(configPath) + if err != nil { + panic(err) + } + + address = cfg.Addr + nick = cfg.Nick + if cfg.Password != nil { + password = *cfg.Password } + useTLS = true } - log.Println("Disconnected") } @@ -5,5 +5,6 @@ go 1.14 require ( github.com/gdamore/tcell/v2 v2.0.0 github.com/mattn/go-runewidth v0.0.7 + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 gopkg.in/yaml.v2 v2.3.0 ) @@ -8,6 +8,10 @@ github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+tw github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 h1:9nuHUbU8dRnRRfj9KjWUVrJeoexdbeMjttk6Oh1rD10= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= |