commit 4327d1c

delthas  ·  2023-08-10 09:29:13 +0000 UTC
parent 9cbfcba
Add the -nickname CLI option

This enables configuring the nickname with a CLI argument, which
could be useful for e.g. public instances started with a script.
4 files changed,  +70, -36
M app.go
M app.go
+13, -0
 1@@ -109,6 +109,19 @@ type App struct {
 2 }
 3 
 4 func NewApp(cfg Config) (app *App, err error) {
 5+	if cfg.Addr == "" {
 6+		return nil, errors.New("address is required")
 7+	}
 8+	if cfg.Nick == "" {
 9+		return nil, errors.New("nick is required")
10+	}
11+	if cfg.User == "" {
12+		cfg.User = cfg.Nick
13+	}
14+	if cfg.Real == "" {
15+		cfg.Real = cfg.Nick
16+	}
17+
18 	app = &App{
19 		networks: map[string]struct{}{
20 			"": {}, // add the master network by default
+8, -1
 1@@ -20,8 +20,10 @@ func main() {
 2 	tcell.SetEncodingFallback(tcell.EncodingFallbackASCII)
 3 
 4 	var configPath string
 5+	var nickname string
 6 	var debug bool
 7 	flag.StringVar(&configPath, "config", "", "path to the configuration file")
 8+	flag.StringVar(&nickname, "nickname", "", "nick name/display name to use")
 9 	flag.BoolVar(&debug, "debug", false, "show raw protocol data in the home buffer")
10 	flag.Parse()
11 
12@@ -119,10 +121,15 @@ func main() {
13 	}
14 
15 	cfg.Debug = cfg.Debug || debug
16+	if nickname != "" {
17+		cfg.Nick = nickname
18+	}
19 
20 	app, err := senpai.NewApp(cfg)
21 	if err != nil {
22-		panic(err)
23+		fmt.Fprintf(os.Stderr, "failed to run: %s\n", err)
24+		os.Exit(1)
25+		return
26 	}
27 
28 	if !cfg.Transient {
+44, -34
 1@@ -1,7 +1,6 @@
 2 package senpai
 3 
 4 import (
 5-	"errors"
 6 	"fmt"
 7 	"net/url"
 8 	"os"
 9@@ -118,46 +117,57 @@ func Defaults() Config {
10 	}
11 }
12 
13-func LoadConfigFile(filename string) (cfg Config, err error) {
14-	cfg = Defaults()
15-
16-	err = unmarshal(filename, &cfg)
17+func ParseAddr(addr string, cfg *Config) error {
18+	if addr == "" {
19+		return nil
20+	}
21+	if !strings.Contains(addr, "://") {
22+		addr = "irc://" + addr
23+	}
24+	u, err := url.Parse(addr)
25 	if err != nil {
26-		return cfg, err
27+		return err
28 	}
29-	if cfg.Addr == "" {
30-		return cfg, errors.New("addr is required")
31+	switch u.Scheme {
32+	case "ircs+insecure":
33+		cfg.TLS = true
34+		cfg.TLSSkipVerify = true
35+	case "ircs":
36+		cfg.TLS = true
37+	case "irc+insecure":
38+		cfg.TLS = false
39+	case "irc":
40+		// Could be TLS or plaintext, keep TLS as is.
41+	default:
42+		return fmt.Errorf("invalid IRC addr scheme: %v", addr)
43 	}
44-	if cfg.Nick == "" {
45-		return cfg, errors.New("nick is required")
46+	if u := u.User; u != nil {
47+		cfg.User = u.Username()
48+		if p, ok := u.Password(); ok {
49+			cfg.Password = &p
50+		} else {
51+			cfg.Password = nil
52+		}
53 	}
54-	if cfg.User == "" {
55-		cfg.User = cfg.Nick
56+	cfg.Addr = u.Host
57+	target, _, _ := strings.Cut(strings.TrimLeft(u.Path, "/"), "/")
58+	if target != "" {
59+		cfg.Channels = []string{target}
60 	}
61-	if cfg.Real == "" {
62-		cfg.Real = cfg.Nick
63+	return nil
64+}
65+
66+func LoadConfigFile(filename string) (Config, error) {
67+	cfg := Defaults()
68+
69+	err := unmarshal(filename, &cfg)
70+	if err != nil {
71+		return Config{}, err
72 	}
73-	if u, err := url.Parse(cfg.Addr); err == nil && u.Scheme != "" {
74-		switch u.Scheme {
75-		case "ircs+insecure":
76-			cfg.TLS = true
77-			cfg.TLSSkipVerify = true
78-		case "ircs":
79-			cfg.TLS = true
80-		case "irc+insecure":
81-			cfg.TLS = false
82-		case "irc":
83-			// Could be TLS or plaintext, keep TLS as is.
84-		default:
85-			if u.Host != "" {
86-				return cfg, fmt.Errorf("invalid IRC addr scheme: %v", cfg.Addr)
87-			}
88-		}
89-		if u.Host != "" {
90-			cfg.Addr = u.Host
91-		}
92+	if err := ParseAddr(cfg.Addr, &cfg); err != nil {
93+		return Config{}, err
94 	}
95-	return
96+	return cfg, nil
97 }
98 
99 func unmarshal(filename string, cfg *Config) (err error) {
+5, -1
 1@@ -13,8 +13,12 @@ senpai - your everyday IRC student
 2 *-config* <path>
 3 	Use a different path for the configuration file.
 4 
 5+*-nickname* <nickname>
 6+	Advanced. Nick name to connect as. Overrides the configuration item of the
 7+	same name.
 8+
 9 *-debug*
10-	Show all IRC messages that are received from/sent to the server.
11+	Advanced. Show all IRC messages that are received from/sent to the server.
12 
13 # DESCRIPTION
14