From 04c30c8c9b45e6a3ab401c94a612e63eafc7780b Mon Sep 17 00:00:00 2001 From: Jeremy Latt Date: Fri, 7 Mar 2014 17:35:58 -0800 Subject: [PATCH] channel invite mode/list --- irc/channel.go | 37 ++++++++++++++++++++++++------------- irc/client_lookup_set.go | 12 ++++++++++-- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/irc/channel.go b/irc/channel.go index dd7f7eb1..c44e191d 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -323,29 +323,40 @@ func (channel *Channel) applyModeMember(client *Client, mode ChannelMode, return false } -func (channel *Channel) applyModeMask(client *Client, mode ChannelMode, op ModeOp, mask string) bool { - if !channel.ClientIsOperator(client) { - client.ErrChanOPrivIsNeeded(channel) - return false +func (channel *Channel) ShowMaskList(client *Client, mode ChannelMode) { + for lmask := range channel.lists[mode].masks { + client.RplMaskList(mode, channel, lmask) } + client.RplEndOfMaskList(mode, channel) +} +func (channel *Channel) applyModeMask(client *Client, mode ChannelMode, op ModeOp, + mask string) bool { list := channel.lists[mode] if list == nil { // This should never happen, but better safe than panicky. return false } - if op == Add { - list.Add(mask) - } else if op == Remove { - list.Remove(mask) + if (op == List) || (mask == "") { + channel.ShowMaskList(client, mode) + return false } - for lmask := range channel.lists[mode].masks { - client.RplMaskList(mode, channel, lmask) + if !channel.ClientIsOperator(client) { + client.ErrChanOPrivIsNeeded(channel) + return false } - client.RplEndOfMaskList(mode, channel) - return true + + if op == Add { + return list.Add(mask) + } + + if op == Remove { + return list.Remove(mask) + } + + return false } func (channel *Channel) applyMode(client *Client, change *ChannelModeChange) bool { @@ -353,7 +364,7 @@ func (channel *Channel) applyMode(client *Client, change *ChannelModeChange) boo case BanMask, ExceptMask, InviteMask: return channel.applyModeMask(client, change.mode, change.op, change.arg) - case Moderated, NoOutside, OpOnlyTopic, Persistent, Private: + case InviteOnly, Moderated, NoOutside, OpOnlyTopic, Persistent, Private: return channel.applyModeFlag(client, change.mode, change.op) case Key: diff --git a/irc/client_lookup_set.go b/irc/client_lookup_set.go index 6c66d1da..44aa4bda 100644 --- a/irc/client_lookup_set.go +++ b/irc/client_lookup_set.go @@ -194,14 +194,22 @@ func NewUserMaskSet() *UserMaskSet { } } -func (set *UserMaskSet) Add(mask string) { +func (set *UserMaskSet) Add(mask string) bool { + if set.masks[mask] { + return false + } set.masks[mask] = true set.setRegexp() + return true } -func (set *UserMaskSet) Remove(mask string) { +func (set *UserMaskSet) Remove(mask string) bool { + if !set.masks[mask] { + return false + } delete(set.masks, mask) set.setRegexp() + return true } func (set *UserMaskSet) Match(userhost string) bool {