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
+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