commit c791106
Hubert Hirtz
·
2020-11-29 11:27:52 +0000 UTC
parent fd39397
Make cmd/test usable
4 files changed,
+86,
-50
+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=