X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Firc%2Fchannel.lua;h=82bca71c999a46a1154c7fa12f90659dcf38fe3c;hb=21a59a8e39d7f1457dae23485515fbdadc8f92b8;hp=f1fbf3c3aa749bf07c0fb28cbf0c90c93337248e;hpb=b6b6af1da8146ad0063d9bf554f33515c4bb909d;p=luairc.git diff --git a/src/irc/channel.lua b/src/irc/channel.lua index f1fbf3c..82bca71 100644 --- a/src/irc/channel.lua +++ b/src/irc/channel.lua @@ -11,8 +11,7 @@ local table = require 'table' --- -- This module implements a channel object representing a single channel we --- have joined --- @release 0.02 +-- have joined. module 'irc.channel' -- object metatable {{{ @@ -99,6 +98,75 @@ end -- }}} -- }}} +-- 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 +-- }}} +-- }}} + -- constructor {{{ --- -- Creates a new Channel object. @@ -118,10 +186,10 @@ end -- @param self Channel object function each_op(self) return function(state, arg) - return misc.value_iter(state, arg, - function(v) - return v:sub(1, 1) == "@" - end) + return misc._value_iter(state, arg, + function(v) + return v:sub(1, 1) == "@" + end) end, self._members, nil @@ -134,10 +202,10 @@ end -- @param self Channel object function each_voice(self) return function(state, arg) - return misc.value_iter(state, arg, - function(v) - return v:sub(1, 1) == "+" - end) + return misc._value_iter(state, arg, + function(v) + return v:sub(1, 1) == "+" + end) end, self._members, nil @@ -150,11 +218,11 @@ end -- @param self Channel object function each_user(self) return function(state, arg) - return misc.value_iter(state, arg, - function(v) - return v:sub(1, 1) ~= "@" and - v:sub(1, 1) ~= "+" - end) + return misc._value_iter(state, arg, + function(v) + return v:sub(1, 1) ~= "@" and + v:sub(1, 1) ~= "+" + end) end, self._members, nil @@ -166,7 +234,7 @@ end -- Iterator over all users in the channel -- @param self Channel object function each_member(self) - return misc.value_iter, self._members, nil + return misc._value_iter, self._members, nil end -- }}} -- }}} @@ -324,7 +392,7 @@ function set_key(self, key) end -- }}} --- set_private() {{{ +-- set_private {{{ --- -- Set the private state of a channel. -- @param self Channel object @@ -403,50 +471,5 @@ function contains(self, nick) return false end -- }}} - --- add_user() {{{ -function add_user(self, user, mode) - mode = mode or '' - self._members[user] = mode .. user -end --- }}} - --- remove_user() {{{ -function remove_user(self, user) - self._members[user] = nil -end --- }}} - --- change_status() {{{ -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 {{{ -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 --- }}} -- }}} -- }}}