Alexey Yerin: 1 Implement /kick and /[un]ban commands 3 files changed, 93 insertions(+), 0 deletions(-)
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 -3Learn more about email & git
--- 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!