From 66f9b42125a1f2c48779ce25f11f02ea75f57f19 Mon Sep 17 00:00:00 2001 From: Jeremy Latt Date: Tue, 25 Feb 2014 22:16:23 -0800 Subject: [PATCH] avoid duplicate mode changes --- irc/channel.go | 17 ++++++++++++++++- irc/constants.go | 2 +- irc/server.go | 9 +++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/irc/channel.go b/irc/channel.go index f31a72b8..91a5fbed 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -248,10 +248,16 @@ func (channel *Channel) applyModeFlag(client *Client, mode ChannelMode, switch op { case Add: + if channel.flags[mode] { + return false + } channel.flags[mode] = true return true case Remove: + if !channel.flags[mode] { + return false + } delete(channel.flags, mode) return true } @@ -283,10 +289,16 @@ func (channel *Channel) applyModeMember(client *Client, mode ChannelMode, switch op { case Add: + if channel.members[target][mode] { + return false + } channel.members[target][mode] = true return true case Remove: + if !channel.members[target][mode] { + return false + } channel.members[target][mode] = false return true } @@ -318,6 +330,9 @@ func (channel *Channel) applyMode(client *Client, change *ChannelModeChange) boo client.ErrNeedMoreParams("MODE") return false } + if change.arg == channel.key { + return false + } channel.key = change.arg return true @@ -333,7 +348,7 @@ func (channel *Channel) applyMode(client *Client, change *ChannelModeChange) boo client.ErrNeedMoreParams("MODE") return false } - if limit == 0 { + if (limit == 0) || (limit == channel.userLimit) { return false } diff --git a/irc/constants.go b/irc/constants.go index 3c62e79c..a129d762 100644 --- a/irc/constants.go +++ b/irc/constants.go @@ -23,7 +23,7 @@ var ( ) const ( - SEM_VER = "ergonomadic-1.2.2" + SEM_VER = "ergonomadic-1.2.3" CRLF = "\r\n" MAX_REPLY_LEN = 512 - len(CRLF) diff --git a/irc/server.go b/irc/server.go index f10b2e89..7b249f3e 100644 --- a/irc/server.go +++ b/irc/server.go @@ -525,16 +525,25 @@ func (m *ModeCommand) HandleServer(s *Server) { case Invisible, ServerNotice, WallOps: switch change.op { case Add: + if target.flags[change.mode] { + continue + } target.flags[change.mode] = true changes = append(changes, change) case Remove: + if !target.flags[change.mode] { + continue + } delete(target.flags, change.mode) changes = append(changes, change) } case Operator, LocalOperator: if change.op == Remove { + if !target.flags[change.mode] { + continue + } delete(target.flags, change.mode) changes = append(changes, change) }