WoWInterface SVN ccUnspammer

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

trunk/ccUnspammer.lua New file
0,0 → 1,189
CCU = {
defaults = {
cache_maxAge = 120,
cache_purgeTime = 180,
chat_unignore = {}
},
 
settings = {
},
 
handlers = {
onLoad = function()
CCU.settings = CCU.copyTable(CCU.defaults)
 
CCU.handlers.Original_ChatFrame_MessageEventHandler = ChatFrame_MessageEventHandler
ChatFrame_MessageEventHandler = CCU.handlers.ChatFrame_MessageEventHandler
 
SLASH_CCUNSPAMMER1, SLASH_CCUNSPAMMER2, SLASH_CCUNSPAMMER3, SLASH_CCUNSPAMMER4, SLASH_CCUNSPAMMER5 = '/ccus', '/unspam', '/ccunspammer', '/ccu';
SlashCmdList['CCUNSPAMMER'] = CCU.handlers.slashCommand
 
CCU.frame:UnregisterEvent('PLAYER_ENTERING_WORLD')
end,
 
slashCommand = function(msg, editbox)
local command, rest = msg:match("^(%S*)%s*(.-)$");
 
command = strlower(command)
if command == "set" and rest ~= "" then
local setting, value = rest:match("^(%S*)%s*(.-)$")
if value == '' or not CCU.inList(setting, {'cache_maxAge','cache_purgeTime', 'chat_unignore'}) then
print("Syntax: /ccu set setting [value] value="..value);
elseif setting == 'chat_unignore' then
table.insert(CCU.settings.chat_unignore, value)
else
CCU.settings[setting] = value
end;
elseif command == "reset" then
if rest ~= '' then
-- reset only a specific one
if CCU.inList(setting, {'cache_maxAge','cache_purgeTime', 'chat_unignore'}) then
print('ccUnspammer: unknown setting provided')
else
CCU.settings[rest] = CCU.defaults[rest]
end;
else
CCU.settings = CCU.copyTable(CCU.defaults)
end
elseif command == 'unignore' and rest ~= '' then
table.insert(CCU.settings.chat_unignore, rest);
print('ccUnspammer: showing all messages for '..rest);
elseif command == 'list' then
if rest ~= '' then
print('CCU: ['..rest..'] = '..CCU.concatTable(CCU.settings[rest]))
else
print('CCU: listing settings');
for k,v in pairs(CCU.settings) do
if type(v) == 'table' then
v = '['..CCU.concatTable(v)..']'
end;
print(' ['..k..'] = '..v)
end;
end
else
-- |cffffff00 = yellow
-- |cff00ff00 = green
print("|cff00ff00cc_Unspammer|r v2.0.1");
print("Syntax: |cff00ff00/ccu|r");
print(" |cffffff00set|r |cff00ff00foo bar|r - sets setting |cff00ff00foo|r to value |cff00ff00bar|r");
print(" |cffffff00reset|r [|cff00ff00foo|r] - resets setting |cff00ff00foo|r, if none provided does a full reset of all settings");
print(" |cffffff00list|r [|cff00ff00foo|r] - shows the value for setting |cff00ff00foo|r, if none provided shows values for all settings");
end;
end,
 
ChatFrame_MessageEventHandler = function(self, event, ...)
if event == 'CHAT_MSG_CHANNEL' then
if not CCU.cache[self:GetName()] then
CCU.cache[self:GetName()] = {}
end
 
-- do some preprocessing
local timeCheck = (time() - CCU.settings.cache_maxAge)
local msg, author, _, channel = ...
if not CCU.inList(author, CCU.settings.chat_unignore) then
if CCU.cache[self:GetName()][author] then
-- search the list to see if the message has been posted < 2 min ago
for k,v in pairs(CCU.cache[self:GetName()][author]) do
if v['msg'] == msg and v['channel'] == channel and v['time'] > timeCheck then
-- spam, let's skip it
return
end
end
else
CCU.cache[self:GetName()][author] = {}
end
 
-- cache the entry so we won't miss it next time
table.insert(CCU.cache[self:GetName()][author],
{
msg=msg,
time=time(),
channel=channel
}
)
end
end
 
CCU.handlers.Original_ChatFrame_MessageEventHandler(self, event, ...)
end
},
 
inList = function(needle, haystack)
if haystack == nil then
return false
end
 
for k,v in pairs(haystack) do
if v == needle then
return true
end;
end;
return false;
end,
 
copyTable = function(t,deep)
if deep == nil then
deep = true
end;
local t2 = {}
for k,v in pairs(t) do
if type(v) == 'table' and deep then
v = CCU.copyTable(v,true)
end;
t2[k] = v
end
return t2
end,
 
concatTable = function(t)
if type(t) ~= 'table' then
return t
end;
 
rStr = ''
for k,v in pairs(t) do
if type(v) == 'table' then
rStr = rStr..'['..CCU.concatTable(v)..'], '
else
rStr = rStr..v..', '
end
end
return rStr
end,
 
purge = function()
local timeCheck = (time() - CCU.settings.cache_maxAge)
local cleanCache = {}
for frame,chatList in pairs(CCU.cache) do
for author,chat in pairs(chatList) do
local tempCache = {}
local i = 0
for k,v in pairs(chat) do
if v['time'] > timeCheck then
table.insert(tempCache, v)
i = i+1
end
end
if i > 0 then
cleanCache[author] = tempCache
end
end
CCU.cache[frame] = cleanCache
end
 
CCU.purged = 0
end,
 
cache = {},
purged = 0,
frame = CreateFrame('Frame'),
}
 
CCU.frame:RegisterEvent('PLAYER_ENTERING_WORLD')
CCU.frame:SetScript('OnEvent', function(self, event, ...) CCU.handlers.onLoad() end)
CCU.frame:SetScript('OnUpdate', function(self,elapsed)
if CCU.purged + elapsed > CCU.settings.cache_purgeTime then
CCU.purge()
end
CCU.purged = CCU.purged + elapsed
end)
\ No newline at end of file Property changes : Added: svn:eol-style + native
trunk/ccUnspammer.toc New file
0,0 → 1,7
## Interface: 40000
## Title: ccUnspammer
## Version: 2.0.1
## Notes: Unspams all channels. Basically it removes any duplicate messages that are posted < 2 minutes from eachother. Fully configurable via /ccu
## Author: Illiai of Sylvanas
 
ccUnspammer.lua
Property changes : Added: svn:eol-style + native