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) |