---
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