~taiite/public-inbox

senpai: Implement /kick and /[un]ban commands v2 PROPOSED

Alexey Yerin: 1
 Implement /kick and /[un]ban commands

 3 files changed, 93 insertions(+), 0 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~taiite/public-inbox/patches/27138/mbox | git am -3
Learn more about email & git

[PATCH senpai v2] Implement /kick and /[un]ban commands Export this patch

---
v1 -> v2:
* Some minor wording changes I forgot about
* Add new commands to senpai.1 man page

 commands.go      | 76 ++++++++++++++++++++++++++++++++++++++++++++++++
 doc/senpai.1.scd |  9 ++++++
 irc/session.go   |  8 +++++
 3 files changed, 93 insertions(+)

diff --git a/commands.go b/commands.go
index 5dff158..403aec8 100644
--- a/commands.go
+++ b/commands.go
@@ -142,6 +142,30 @@ func init() {
			Desc:      "invite someone to a channel",
			Handle:    commandDoInvite,
		},
		"KICK": {
			AllowHome: false,
			MinArgs:   1,
			MaxArgs:   2,
			Usage:     "<nick> [channel]",
			Desc:      "eject someone from the channel",
			Handle:    commandDoKick,
		},
		"BAN": {
			AllowHome: false,
			MinArgs:   1,
			MaxArgs:   2,
			Usage:     "<nick> [channel]",
			Desc:      "ban someone from entering the channel",
			Handle:    commandDoBan,
		},
		"UNBAN": {
			AllowHome: false,
			MinArgs:   1,
			MaxArgs:   2,
			Usage:     "<nick> [channel]",
			Desc:      "remove effect of a ban from the user",
			Handle:    commandDoUnban,
		},
	}
}

@@ -506,6 +530,58 @@ func commandDoInvite(app *App, args []string) (err error) {
	return nil
}

func commandDoKick(app *App, args []string) (err error) {
	nick := args[0]
	netID, channel := app.win.CurrentBuffer()
	s := app.sessions[netID]
	if s == nil {
		return errOffline
	}
	if len(args) >= 2 {
		channel = args[1]
	} else if channel == "" {
		return fmt.Errorf("either send this command from a channel, or specify the channel")
	}
	comment := ""
	if len(args) == 3 {
		comment = args[2]
	}
	s.Kick(nick, channel, comment)
	return nil
}

func commandDoBan(app *App, args []string) (err error) {
	nick := args[0]
	netID, channel := app.win.CurrentBuffer()
	s := app.sessions[netID]
	if s == nil {
		return errOffline
	}
	if len(args) == 2 {
		channel = args[1]
	} else if channel == "" {
		return fmt.Errorf("either send this command from a channel, or specify the channel")
	}
	s.ChangeMode(channel, "+b", []string{nick})
	return nil
}

func commandDoUnban(app *App, args []string) (err error) {
	nick := args[0]
	netID, channel := app.win.CurrentBuffer()
	s := app.sessions[netID]
	if s == nil {
		return errOffline
	}
	if len(args) == 2 {
		channel = args[1]
	} else if channel == "" {
		return fmt.Errorf("either send this command from a channel, or specify the channel")
	}
	s.ChangeMode(channel, "-b", []string{nick})
	return nil
}

// implemented from https://golang.org/src/strings/strings.go?s=8055:8085#L310
func fieldsN(s string, n int) []string {
	s = strings.TrimSpace(s)
diff --git a/doc/senpai.1.scd b/doc/senpai.1.scd
index c64a82c..81e3544 100644
--- a/doc/senpai.1.scd
+++ b/doc/senpai.1.scd
@@ -165,6 +165,15 @@ _name_ is matched case-insensitively.  It can be one of the following:
*INVITE* <nick> [channel]
	Invite _nick_ to _channel_ (the current channel if not given).

*KICK* <nick> [channel]
	Eject _nick_ from _channel_ (the current channel if not given).

*BAN* <nick> [channel]
	Ban _nick_ from entering _channel_ (the current channel if not given).

*UNBAN* <nick> [channel]
	Allow _nick_ to enter _channel_ again (the current channel if not given).

# SEE ALSO

*senpai*(5)
diff --git a/irc/session.go b/irc/session.go
index 87b77b6..3dd979c 100644
--- a/irc/session.go
+++ b/irc/session.go
@@ -494,6 +494,14 @@ func (s *Session) Invite(nick, channel string) {
	s.out <- NewMessage("INVITE", nick, channel)
}

func (s *Session) Kick(nick, channel, comment string) {
	if comment == "" {
		s.out <- NewMessage("KICK", channel, nick)
	} else {
		s.out <- NewMessage("KICK", channel, nick, comment)
	}
}

func (s *Session) HandleMessage(msg Message) (Event, error) {
	if s.registered {
		return s.handleRegistered(msg)
-- 
2.34.1
Thanks, pushed!