commit c791106

Hubert Hirtz  ·  2020-11-29 11:27:52 +0000 UTC
parent fd39397
Make cmd/test usable
4 files changed,  +86, -50
M go.mod
M go.sum
+10, -2
 1@@ -13,8 +13,6 @@ mkdir -p ~/.config/senpai
 2 cat <<EOF >~/.config/senpai/senpai.yaml
 3 addr: irc.freenode.net:6697
 4 nick: senpai
 5-real: Senpai is the best senpai
 6-user: sasluser
 7 password: "my password can't be this cute"
 8 EOF
 9 go run ./cmd/irc
10@@ -25,6 +23,16 @@ Then, type `/join #senpai` and have a chat!
11 See `doc/senpai.1.scd` for more information and `doc/senpai.5.scd` for more
12 configuration options!
13 
14+## Debugging errors, testing servers
15+
16+If you run into errors and want to find the WHY OH WHY, or if you'd like to try
17+things out with an IRC server, then you have two options:
18+
19+1. Run senpai with the `-debug` argument (or put `debug: true`) in your config,
20+   it will then print in `home` all the data it sends and receives.
21+2. Run the test client, that uses the same IRC library but exposes a simpler
22+   interface, by running `go run ./cmd/test -help`.
23+
24 ## Contributing and stuff
25 
26 Patches are welcome at <mailto:~taiite/public-inbox@lists.sr.ht>!
+71, -48
  1@@ -1,87 +1,78 @@
  2 package main
  3 
  4 import (
  5-	"bufio"
  6 	"crypto/tls"
  7 	"flag"
  8-	"log"
  9+	"fmt"
 10+	"io"
 11 	"net"
 12 	"os"
 13 
 14 	"git.sr.ht/~taiite/senpai"
 15 	"git.sr.ht/~taiite/senpai/irc"
 16+	"golang.org/x/term"
 17 )
 18 
 19-func main() {
 20-	var configPath string
 21-	var address string
 22-	var nick string
 23-	var password string
 24-	var useTLS bool
 25-	flag.StringVar(&configPath, "config", "", "path to the configuration file")
 26-	flag.StringVar(&address, "address", "", "server address")
 27-	flag.StringVar(&nick, "nick", "senpai", "IRC nick/user to use")
 28-	flag.StringVar(&password, "password", "", "SASL password to use")
 29-	flag.BoolVar(&useTLS, "tls", false, "whether to use tls")
 30-	flag.Parse()
 31-
 32-	if address == "" {
 33-		if configPath == "" {
 34-			configDir, err := os.UserConfigDir()
 35-			if err != nil {
 36-				log.Panicln(err)
 37-			}
 38-			configPath = configDir + "/senpai/senpai.yaml"
 39-		}
 40+var (
 41+	configPath string
 42+	address    string
 43+	nick       string
 44+	password   string
 45+	useTLS     bool
 46+)
 47 
 48-		cfg, err := senpai.LoadConfigFile(configPath)
 49-		if err != nil {
 50-			log.Panicln(err)
 51-		}
 52+func main() {
 53+	parseFlags()
 54 
 55-		address = cfg.Addr
 56-		nick = cfg.Nick
 57-		if cfg.Password != nil {
 58-			password = *cfg.Password
 59-		}
 60+	oldState, err := term.MakeRaw(0)
 61+	if err != nil {
 62+		panic(err)
 63 	}
 64+	defer term.Restore(0, oldState)
 65+
 66+	screen := struct {
 67+		io.Reader
 68+		io.Writer
 69+	}{os.Stdin, os.Stdout}
 70+	t := term.NewTerminal(screen, "> ")
 71 
 72-	log.Printf("Connecting to %s...\n", address)
 73+	fmt.Fprintf(t, "Connecting to %s...\n", address)
 74 
 75 	var conn net.Conn
 76-	var err error
 77 	if useTLS {
 78 		conn, err = tls.Dial("tcp", address, nil)
 79 	} else {
 80 		conn, err = net.Dial("tcp", address)
 81 	}
 82 	if err != nil {
 83-		log.Panicf("Failed to connect to %s: %v", address, err)
 84+		panic(fmt.Sprintf("Failed to connect to %s: %v\n", address, err))
 85 	}
 86 	defer conn.Close()
 87 
 88-	log.Printf("Connected. Registration in progress...\n")
 89+	fmt.Fprintf(t, "Connected. Registration in progress...\n")
 90 
 91-	var auth irc.SASLPlain
 92+	var auth irc.SASLClient
 93 	if password != "" {
 94-		auth = irc.SASLPlain{Username: nick, Password: password}
 95+		auth = &irc.SASLPlain{Username: nick, Password: password}
 96 	}
 97 	cli, err := irc.NewSession(conn, irc.SessionParams{
 98 		Nickname: nick,
 99 		Username: nick,
100 		RealName: nick,
101-		Auth:     &auth,
102+		Auth:     auth,
103 		Debug:    true,
104 	})
105 	if err != nil {
106-		log.Panicf("Failed to connect to %s: %v", address, err)
107+		panic(fmt.Sprintf("Failed to connect to %s: %v", address, err))
108 	}
109 	defer cli.Stop()
110 
111 	go func() {
112-		r := bufio.NewScanner(os.Stdin)
113-		for r.Scan() {
114-			line := r.Text()
115+		for {
116+			line, err := t.ReadLine()
117+			if err != nil {
118+				break
119+			}
120 			cli.SendRaw(line)
121 		}
122 		cli.Stop()
123@@ -91,15 +82,47 @@ func main() {
124 		switch ev := ev.(type) {
125 		case irc.RawMessageEvent:
126 			if ev.Outgoing {
127-				log.Printf("C  > S: %s\n", ev.Message)
128+				fmt.Fprintf(t, "C  > S: %s\n", ev.Message)
129 			} else {
130-				log.Printf("C <  S: %s\n", ev.Message)
131+				fmt.Fprintf(t, "C <  S: %s\n", ev.Message)
132 			}
133 		case error:
134-			log.Panicln(ev)
135+			panic(ev)
136 		default:
137-			log.Printf("Event: %T%+v", ev, ev)
138+			fmt.Fprintf(t, "=EVENT: %T%+v\n", ev, ev)
139+		}
140+	}
141+	t.SetPrompt("")
142+	fmt.Fprintln(t, "Disconnected")
143+}
144+
145+func parseFlags() {
146+	flag.StringVar(&configPath, "config", "", "path to the configuration file")
147+	flag.StringVar(&address, "address", "", "server address")
148+	flag.StringVar(&nick, "nick", "senpai", "IRC nick/user to use")
149+	flag.StringVar(&password, "password", "", "SASL password to use")
150+	flag.BoolVar(&useTLS, "tls", false, "use tls")
151+	flag.Parse()
152+
153+	if address == "" {
154+		if configPath == "" {
155+			configDir, err := os.UserConfigDir()
156+			if err != nil {
157+				panic(err)
158+			}
159+			configPath = configDir + "/senpai/senpai.yaml"
160+		}
161+
162+		cfg, err := senpai.LoadConfigFile(configPath)
163+		if err != nil {
164+			panic(err)
165+		}
166+
167+		address = cfg.Addr
168+		nick = cfg.Nick
169+		if cfg.Password != nil {
170+			password = *cfg.Password
171 		}
172+		useTLS = true
173 	}
174-	log.Println("Disconnected")
175 }
M go.mod
+1, -0
1@@ -5,5 +5,6 @@ go 1.14
2 require (
3 	github.com/gdamore/tcell/v2 v2.0.0
4 	github.com/mattn/go-runewidth v0.0.7
5+	golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
6 	gopkg.in/yaml.v2 v2.3.0
7 )
M go.sum
+4, -0
 1@@ -8,6 +8,10 @@ github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+tw
 2 github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 3 golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 h1:9nuHUbU8dRnRRfj9KjWUVrJeoexdbeMjttk6Oh1rD10=
 4 golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 5+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
 6+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 7+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
 8+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 9 golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
10 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
11 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=