summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Yerin <yyp@disroot.org>2021-05-18 21:25:17 +0300
committerHubert Hirtz <hubert@hirtz.pm>2021-05-18 21:26:23 +0200
commitcdab4b7448e8425853beaee5087c51da5040c8cb (patch)
treea79e6a1614efc443f9df0c9980624d1b474986dc
parentAdd /nick (diff)
Add /mode command
Diffstat (limited to '')
-rw-r--r--commands.go17
-rw-r--r--doc/senpai.1.scd3
-rw-r--r--irc/states.go21
3 files changed, 41 insertions, 0 deletions
diff --git a/commands.go b/commands.go
index 9bf2f13..ee4274c 100644
--- a/commands.go
+++ b/commands.go
@@ -72,6 +72,14 @@ func init() {
Desc: "change your nickname",
Handle: commandDoNick,
},
+ "MODE": {
+ AllowHome: true,
+ MinArgs: 2,
+ MaxArgs: 5, // <channel> <flags> <limit> <user> <ban mask>
+ Usage: "<nick/channel> <flags> [args]",
+ Desc: "change channel or user modes",
+ Handle: commandDoMode,
+ },
"PART": {
AllowHome: true,
MaxArgs: 2,
@@ -267,6 +275,15 @@ func commandDoNick(app *App, buffer string, args []string) (err error) {
return
}
+func commandDoMode(app *App, buffer string, args []string) (err error) {
+ channel := args[0]
+ flags := args[1]
+ mode_args := args[2:]
+
+ app.s.ChangeMode(channel, flags, mode_args)
+ return
+}
+
func commandDoPart(app *App, buffer string, args []string) (err error) {
channel := buffer
reason := ""
diff --git a/doc/senpai.1.scd b/doc/senpai.1.scd
index c1d69c0..d3781e9 100644
--- a/doc/senpai.1.scd
+++ b/doc/senpai.1.scd
@@ -146,6 +146,9 @@ _name_ is matched case-insensitively. It can be one of the following:
*NICK* <nickname>
Change your nickname.
+*MODE* <nick/channel> <flags> [args]
+ Change channel or user modes.
+
# SEE ALSO
*senpai*(5)
diff --git a/irc/states.go b/irc/states.go
index d1ead27..b2a129a 100644
--- a/irc/states.go
+++ b/irc/states.go
@@ -91,6 +91,11 @@ type (
actionChangeNick struct {
Nick string
}
+ actionChangeMode struct {
+ Channel string
+ Flags string
+ Args []string
+ }
actionJoin struct {
Channel string
@@ -437,6 +442,20 @@ func (s *Session) changeNick(act actionChangeNick) (err error) {
return
}
+func (s *Session) ChangeMode(channel string, flags string, args []string) {
+ s.acts <- actionChangeMode{channel, flags, args}
+}
+
+func (s *Session) changeMode(act actionChangeMode) (err error) {
+ if strings.IndexAny(act.Channel, s.chantypes) == 0 {
+ err = s.send("MODE %s %s %s\r\n",
+ act.Channel, act.Flags, strings.Join(act.Args, " "))
+ } else {
+ err = s.send("MODE %s %s\r\n", act.Channel, act.Flags)
+ }
+ return
+}
+
func (s *Session) PrivMsg(target, content string) {
s.acts <- actionPrivMsg{target, content}
}
@@ -534,6 +553,8 @@ func (s *Session) run() {
err = s.sendRaw(act)
case actionChangeNick:
err = s.changeNick(act)
+ case actionChangeMode:
+ err = s.changeMode(act)
case actionJoin:
err = s.join(act)
case actionPart: