commit cdab4b7

Alexey Yerin  ·  2021-05-18 18:25:17 +0000 UTC
parent a0e0d6c
Add /mode command
3 files changed,  +41, -0
+17, -0
 1@@ -72,6 +72,14 @@ func init() {
 2 			Desc:      "change your nickname",
 3 			Handle:    commandDoNick,
 4 		},
 5+		"MODE": {
 6+			AllowHome: true,
 7+			MinArgs:   2,
 8+			MaxArgs:   5, // <channel> <flags> <limit> <user> <ban mask>
 9+			Usage:     "<nick/channel> <flags> [args]",
10+			Desc:      "change channel or user modes",
11+			Handle:    commandDoMode,
12+		},
13 		"PART": {
14 			AllowHome: true,
15 			MaxArgs:   2,
16@@ -267,6 +275,15 @@ func commandDoNick(app *App, buffer string, args []string) (err error) {
17 	return
18 }
19 
20+func commandDoMode(app *App, buffer string, args []string) (err error) {
21+	channel := args[0]
22+	flags := args[1]
23+	mode_args := args[2:]
24+
25+	app.s.ChangeMode(channel, flags, mode_args)
26+	return
27+}
28+
29 func commandDoPart(app *App, buffer string, args []string) (err error) {
30 	channel := buffer
31 	reason := ""
+3, -0
 1@@ -146,6 +146,9 @@ _name_ is matched case-insensitively.  It can be one of the following:
 2 *NICK* <nickname>
 3 	Change your nickname.
 4 
 5+*MODE* <nick/channel> <flags> [args]
 6+	Change channel or user modes.
 7+
 8 # SEE ALSO
 9 
10 *senpai*(5)
+21, -0
 1@@ -91,6 +91,11 @@ type (
 2 	actionChangeNick struct {
 3 		Nick string
 4 	}
 5+	actionChangeMode struct {
 6+		Channel string
 7+		Flags   string
 8+		Args    []string
 9+	}
10 
11 	actionJoin struct {
12 		Channel string
13@@ -437,6 +442,20 @@ func (s *Session) changeNick(act actionChangeNick) (err error) {
14 	return
15 }
16 
17+func (s *Session) ChangeMode(channel string, flags string, args []string) {
18+	s.acts <- actionChangeMode{channel, flags, args}
19+}
20+
21+func (s *Session) changeMode(act actionChangeMode) (err error) {
22+	if strings.IndexAny(act.Channel, s.chantypes) == 0 {
23+		err = s.send("MODE %s %s %s\r\n",
24+			act.Channel, act.Flags, strings.Join(act.Args, " "))
25+	} else {
26+		err = s.send("MODE %s %s\r\n", act.Channel, act.Flags)
27+	}
28+	return
29+}
30+
31 func (s *Session) PrivMsg(target, content string) {
32 	s.acts <- actionPrivMsg{target, content}
33 }
34@@ -534,6 +553,8 @@ func (s *Session) run() {
35 				err = s.sendRaw(act)
36 			case actionChangeNick:
37 				err = s.changeNick(act)
38+			case actionChangeMode:
39+				err = s.changeMode(act)
40 			case actionJoin:
41 				err = s.join(act)
42 			case actionPart: