+-- internal methods {{{
+-- TODO: is there a better way to do this? also, storing op/voice as initial
+-- substrings of the username is just ugly
+-- _add_user {{{
+--
+-- Add a user to the channel's internal user list.
+-- @param self Channel object
+-- @param user Nick of the user to add
+-- @param mode Mode (op/voice) of the user, in symbolic form (@/+)
+function _add_user(self, user, mode)
+ mode = mode or ''
+ self._members[user] = mode .. user
+end
+-- }}}
+
+-- _remove_user {{{
+--
+-- Remove a user from the channel's internal user list.
+-- @param self Channel object
+-- @param user Nick of the user to remove
+function _remove_user(self, user)
+ self._members[user] = nil
+end
+-- }}}
+
+-- _change_status {{{
+--
+-- Change the op/voice status of a user in the channel's internal user list.
+-- @param self Channel object
+-- @param user Nick of the user to affect
+-- @param on True if the mode is being set, false if it's being unset
+-- @param mode 'o' for op, 'v' for voice
+function _change_status(self, user, on, mode)
+ if on then
+ if mode == 'o' then
+ self._members[user] = '@' .. user
+ elseif mode == 'v' then
+ self._members[user] = '+' .. user
+ end
+ else
+ if (mode == 'o' and self._members[user]:sub(1, 1) == '@') or
+ (mode == 'v' and self._members[user]:sub(1, 1) == '+') then
+ self._members[user] = user
+ end
+ end
+end
+-- }}}
+
+-- _change_nick {{{
+--
+-- Change the nick of a user in the channel's internal user list.
+-- @param self Channel object
+-- @param old_nick User's old nick
+-- @param new_nick User's new nick
+function _change_nick(self, old_nick, new_nick)
+ for member in self:each_member() do
+ local member_nick = member:gsub('@+', '')
+ if member_nick == old_nick then
+ local mode = self._members[old_nick]:sub(1, 1)
+ if mode ~= '@' and mode ~= '+' then mode = "" end
+ self._members[old_nick] = nil
+ self._members[new_nick] = mode .. new_nick
+ break
+ end
+ end
+end
+-- }}}
+-- }}}
+