commit 7a9fe74

delthas  ·  2022-05-10 09:21:33 +0000 UTC
parent d525e50
/mode: enable getting the channel modes without parameters
2 files changed,  +23, -21
+18, -20
 1@@ -17,6 +17,8 @@ var (
 2 	errOffline = fmt.Errorf("you are disconnected from the server, retry later")
 3 )
 4 
 5+const maxArgsInfinite = -1
 6+
 7 type command struct {
 8 	AllowHome bool
 9 	MinArgs   int
10@@ -77,9 +79,8 @@ func init() {
11 		},
12 		"MODE": {
13 			AllowHome: true,
14-			MinArgs:   1,
15-			MaxArgs:   5, // <channel> <flags> <limit> <user> <ban mask>
16-			Usage:     "[<nick/channel>] <flags> [args]",
17+			MaxArgs:   maxArgsInfinite,
18+			Usage:     "[<nick/channel>] [<flags>] [args]",
19 			Desc:      "change channel or user modes",
20 			Handle:    commandDoMode,
21 		},
22@@ -382,28 +383,23 @@ func commandDoNick(app *App, args []string) (err error) {
23 }
24 
25 func commandDoMode(app *App, args []string) (err error) {
26-	hasModePrefix := strings.HasPrefix(args[0], "+") || strings.HasPrefix(args[0], "-")
27-	hasChanPrefix := strings.HasPrefix(args[0], "#")
28-
29-	if !hasModePrefix && !hasChanPrefix {
30-		return errors.New("invalid argument")
31+	_, target := app.win.CurrentBuffer()
32+	if len(args) > 0 && !strings.HasPrefix(args[0], "+") && !strings.HasPrefix(args[0], "-") {
33+		target = args[0]
34+		args = args[1:]
35 	}
36-
37-	if hasModePrefix {
38-		// if we do eg /MODE +P, automatically insert the current channel: /MODE #<current-chan> +P
39-		_, channel := app.win.CurrentBuffer()
40-		args = append([]string{channel}, args...)
41+	flags := ""
42+	if len(args) > 0 {
43+		flags = args[0]
44+		args = args[1:]
45 	}
46-
47-	channel := args[0]
48-	flags := args[1]
49-	modeArgs := args[2:]
50+	modeArgs := args
51 
52 	s := app.CurrentSession()
53 	if s == nil {
54 		return errOffline
55 	}
56-	s.ChangeMode(channel, flags, modeArgs)
57+	s.ChangeMode(target, flags, modeArgs)
58 	return nil
59 }
60 
61@@ -613,7 +609,9 @@ func fieldsN(s string, n int) []string {
62 	if n == 1 {
63 		return []string{s}
64 	}
65-	n--
66+	if n == maxArgsInfinite {
67+		n--
68+	}
69 	// Start of the ASCII fast path.
70 	var a []string
71 	na := 0
72@@ -637,7 +635,7 @@ func fieldsN(s string, n int) []string {
73 			i++
74 		}
75 		fieldStart = i
76-		if n <= na {
77+		if n != maxArgsInfinite && n <= na {
78 			a = append(a, s[fieldStart:])
79 			return a
80 		}
+5, -1
 1@@ -359,7 +359,11 @@ func (s *Session) ChangeNick(nick string) {
 2 }
 3 
 4 func (s *Session) ChangeMode(channel, flags string, args []string) {
 5-	args = append([]string{channel, flags}, args...)
 6+	if flags != "" {
 7+		args = append([]string{channel, flags}, args...)
 8+	} else {
 9+		args = append([]string{channel}, args...)
10+	}
11 	s.out <- NewMessage("MODE", args...)
12 }
13