---
commands.go | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++
irc/session.go | 8 ++++++
2 files changed, 84 insertions(+)
diff --git a/commands.go b/commands.go
index 5dff158..e8e6807 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: "remove 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/irc/session.go b/irc/session.go
index b6d5873..4bbd0c7 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