summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Hirtz <hubert@hirtz.pm>2020-11-29 12:27:52 +0100
committerHubert Hirtz <hubert@hirtz.pm>2020-11-29 12:58:10 +0100
commitc79110642bc0f7accd8ec312ef03535e60256ed1 (patch)
tree6ec42b78bdee45caaea318f5587f7f57ddb3700b
parentDon't forward outdated typing timeouts (diff)
Make cmd/test usable
Diffstat (limited to '')
-rw-r--r--README.md12
-rw-r--r--cmd/test/main.go119
-rw-r--r--go.mod1
-rw-r--r--go.sum4
4 files changed, 86 insertions, 50 deletions
diff --git a/README.md b/README.md
index aaee433..705d1e3 100644
--- a/README.md
+++ b/README.md
@@ -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")
}
diff --git a/go.mod b/go.mod
index c3dca9c..55237a8 100644
--- a/go.mod
+++ b/go.mod
@@ -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
)
diff --git a/go.sum b/go.sum
index 932da5d..1ce7c3b 100644
--- a/go.sum
+++ b/go.sum
@@ -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=