/trunk/StopTradeSpam
## Title: StopTradeSpam |
## Notes: Detect spam in trade-channel based on a blacklist and a whitelist, adding a trade-ignorelist. |
## Author: Meredy-Das Syndikat (EU) |
## Version: 0.7.2.wowi:revision |
## Version: 0.7.3.wowi:revision |
## eMail: zam@abwesend.de |
## DefaultState: Enabled |
## SavedVariables: STS_SV |
--function STS_ResetSV() -- reset anything except ignorelist |
--function STS_InitSV() |
--function STS_SetLanguage(setlang) |
--local function STS_DelLanguage(setlang) |
--function STS_List(...) |
--function STS_Find(key, list) |
--function STS_AddIgnore(ign_name, ign_reason) |
--function STS_DelIgnore(ign_name) |
--function STS_Add(key, list) |
--function STS_Remove(key, list) |
--function STS_ColoredNameLink(...) |
--local function STS_Update(oldv) --TODO: were changes made to the SV? |
--function STS_Statistic(...) |
--function STS_Settings(...) |
--function STS_GetNumIgnore() |
if select(4,GetAddOnInfo("StopTradeSpam_Options")) == 1 then DisableAddOn("StopTradeSpam_Options") end |
local version = 0.1 |
local lang = "enUS" |
--[[ |
local pname = { |
["STSOPanel"] = "StopTradeSpam", |
["STSOPanel_white"] = "Whitelist", |
["STSOPanel_black"] = "Blacklist", |
["STSOPanel_ignore"] = "Trade-Ignorelist", |
}--]] |
local options = { |
["enUS"] = true, |
["STSOPanel"] = { |
["enUS"] = "StopTradeSpam", |
["headline"] = { |
["headline1"] = { |
["left"] = 0, |
["top"] = -15, |
["enUS"] = "StopTradeSpam Configuration", |
}, |
}, |
["checkbutton"] = { |
["enabletign"] = { |
["left"] = 20, |
["top"] = -30, |
["def"] = true, |
["enUS"] = "Enable adding spammers to t-ignorelist. (NYI)", |
["enUS"] = "Enable adding spammers to t-ignorelist.", |
}, |
["CHAT_MSG_CHANNEL_1"] = { |
["complainchat"] = { |
["left"] = 20, |
["top"] = -60, |
["def"] = true, |
["enUS"] = "Enable automatic reporting spam to gamemasters.", |
}, |
["blockgold"] = { |
["left"] = 20, |
["top"] = -80, |
["def"] = true, |
["enUS"] = "Automatically report obvious gold-seller messages.", |
}, |
}, |
}, |
["STSOPanelChatMsg"] = { |
["enUS"] = "Chat Messages", |
["headline"] = { |
["headline1"] = { |
["left"] = 0, |
["top"] = -15, |
["enUS"] = "Enable Ignoring for different message types", |
}, |
}, |
["checkbutton"] = { |
["CHAT_MSG_SAY"] = { |
["left"] = 20, |
["top"] = -30, |
["def"] = true, |
["global"] = CHAT_MSG_SAY, |
}, |
["CHAT_MSG_EMOTE"] = { |
["left"] = 20, |
["top"] = -50, |
["def"] = true, |
["global"] = CHAT_MSG_EMOTE, |
}, |
["CHAT_MSG_TEXT_EMOTE"] = { |
["left"] = 20, |
["top"] = -70, |
["def"] = true, |
["global"] = CHAT_MSG_TEXT_EMOTE, |
}, |
["CHAT_MSG_YELL"] = { |
["left"] = 20, |
["top"] = -90, |
["def"] = true, |
["global"] = CHAT_MSG_YELL, |
}, |
["CHAT_MSG_ACHIEVEMENT"] = { |
["left"] = 20, |
["top"] = -110, |
["def"] = true, |
["global"] = CHAT_MSG_ACHIEVEMENT, |
}, |
["CHAT_MSG_GUILD"] = { |
["left"] = 20, |
["top"] = -135, |
["def"] = false, |
["global"] = CHAT_MSG_GUILD, |
}, |
["CHAT_MSG_OFFICER"] = { |
["left"] = 20, |
["top"] = -155, |
["def"] = false, |
["global"] = CHAT_MSG_OFFICER, |
}, |
["CHAT_MSG_GUILD_ACHIEVEMENT"] = { |
["left"] = 20, |
["top"] = -175, |
["def"] = false, |
["global"] = CHAT_MSG_GUILD_ACHIEVEMENT, |
}, |
["CHAT_MSG_WHISPER"] = { |
["left"] = 20, |
["top"] = -195, |
["def"] = false, |
["global"] = CHAT_MSG_WHISPER, |
}, |
["CHAT_MSG_WHISPER_INFORM"] = { |
["left"] = 20, |
["top"] = -215, |
["def"] = false, |
["global"] = CHAT_MSG_WHISPER_INFORM, |
}, |
["CHAT_MSG_PARTY"] = { |
["left"] = 20, |
["top"] = -235, |
["def"] = false, |
["global"] = CHAT_MSG_PARTY, |
}, |
["CHAT_MSG_PARTY_LEADER"] = { |
["left"] = 20, |
["top"] = -255, |
["def"] = false, |
["global"] = CHAT_MSG_PARTY_LEADER, |
}, |
["CHAT_MSG_RAID"] = { |
["left"] = 20, |
["top"] = -275, |
["def"] = false, |
["global"] = CHAT_MSG_RAID, |
}, |
["CHAT_MSG_RAID_LEADER"] = { |
["left"] = 20, |
["top"] = -295, |
["def"] = false, |
["global"] = CHAT_MSG_RAID_LEADER, |
}, |
["CHAT_MSG_RAID_WARNING"] = { |
["left"] = 20, |
["top"] = -315, |
["def"] = false, |
["global"] = CHAT_MSG_RAID_WARNING, |
}, |
["CHAT_MSG_BATTLEGROUND"] = { |
["left"] = 20, |
["top"] = -335, |
["def"] = false, |
["global"] = CHAT_MSG_BATTLEGROUND, |
}, |
["CHAT_MSG_BATTLEGROUND_LEADER"] = { |
["left"] = 20, |
["top"] = -355, |
["def"] = false, |
["global"] = CHAT_MSG_BATTLEGROUND_LEADER, |
}, |
}, |
}, |
["STSOPanelCostumChannel"] = { |
["enUS"] = "Costum Channels", |
["headline"] = { |
["headline1"] = { |
["left"] = 0, |
["top"] = -15, |
["enUS"] = "Enable Ignoring for costum channels", |
}, |
}, |
["checkbutton"] = { |
["CHAT_MSG_CHANNEL_1"] = { |
["left"] = 20, |
["top"] = -30, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '1'", |
}, |
["CHAT_MSG_CHANNEL_2"] = { |
["left"] = 20, |
["top"] = -70, |
["top"] = -50, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '2'", |
}, |
["CHAT_MSG_CHANNEL_3"] = { |
["left"] = 20, |
["top"] = -90, |
["top"] = -70, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '3'", |
}, |
["CHAT_MSG_CHANNEL_4"] = { |
["left"] = 20, |
["top"] = -110, |
["top"] = -90, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '4'", |
}, |
["CHAT_MSG_CHANNEL_5"] = { |
["left"] = 20, |
["top"] = -130, |
["top"] = -110, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '5'", |
}, |
["CHAT_MSG_CHANNEL_6"] = { |
["left"] = 20, |
["top"] = -150, |
["top"] = -130, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '6'", |
}, |
["CHAT_MSG_CHANNEL_7"] = { |
["left"] = 20, |
["top"] = -170, |
["top"] = -150, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '7'", |
}, |
["CHAT_MSG_CHANNEL_8"] = { |
["left"] = 20, |
["top"] = -190, |
["top"] = -170, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '8'", |
}, |
["CHAT_MSG_CHANNEL_9"] = { |
["left"] = 20, |
["top"] = -210, |
["top"] = -190, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '9'", |
}, |
["CHAT_MSG_CHANNEL_10"] = { |
["left"] = 20, |
["top"] = -230, |
["top"] = -210, |
["def"] = true, |
["enUS"] = "Enable ignoring players in Channel '10'", |
}, |
["complainchat"] = { |
["left"] = 20, |
["top"] = -250, |
["def"] = true, |
["enUS"] = "Enable automatic repoting spam to gamemasters", |
}, |
["blockgold"] = { |
["left"] = 20, |
["top"] = -270, |
["def"] = true, |
["enUS"] = "Filter obvious gold-seller messages, and report them automatically. (no ignore here)", |
}, |
}, |
}, |
} |
if options[GetLocale()] then lang = GetLocale() end |
function STSO_GetTableKey(frame) |
local upperkey = strmatch(frame:GetName(),"^%w-_(.-)_%w-$") |
local lowerkey = strmatch(frame:GetName(),"_(%w-)$") |
local name = frame |
if type(name) ~= "string" then name = frame:GetName() end |
local upperkey = strmatch(name,"^%w-_(.-)_%d-$") |
local lowerkey = strmatch(name,"^%w-_(.-)$") |
if upperkey then lowerkey = strmatch(name,"_(%d-)$") end |
if strlen(lowerkey) <= 2 then |
lowerkey = tonumber(lowerkey) |
end |
STS_Settings("SET",upperkey,lowerkey,value) |
end |
end |
function STSO_Build() |
local newpanel = CreateFrame("Frame", "STSOPanel", UIParent) |
STSO_Load(newpanel) |
for panel,_ in pairs(options) do |
if strfind(panel,"STSOPanel%w+$") then |
local newpanel = CreateFrame("Frame", panel, UIParent) |
STSO_Load(newpanel) |
end |
end |
end |
function STSO_Load(self) |
if not strfind(self:GetName(),"_") then |
self.name = options[self:GetName()][lang] |
self.okay = STSO_Okay |
self.cancel = STSO_Cancel |
self.default = STSO_Default |
-- if self:GetName() ~= "STSOPanel" then |
-- self.parent = pname["STSOPanel"] |
-- end |
local newcb |
local newtext = "" |
local newfs |
--TODO: Dynamically build frame |
if self:GetName() ~= "STSOPanel" then |
self.parent = options["STSOPanel"][lang] |
end |
local newcb |
local newtext = "" |
local newfs |
local newloc = "" |
--Dynamically build frame |
--Checkbuttons |
for cbname,cbstat in pairs(options[self:GetName()]["checkbutton"]) do |
newcb = CreateFrame("CheckButton", "$parent_"..cbname, self, "ChatConfigCheckButtonTemplate") |
newcb:SetPoint("TOPLEFT", self:GetName(), "TOPLEFT", cbstat["left"], cbstat["top"]) |
newcb.OnLoad = STSO_Load(newcb) |
newtext = "$parent_static_"..cbname |
newfs = self:CreateFontString(newtext,"OVERLAY","STSO_static_text") |
newfs:SetText(cbstat[lang]) |
if cbstat["global"] then newloc = cbstat["global"] |
else newloc = cbstat[lang] end |
newfs:SetText(newloc) |
newfs:SetPoint("TOPLEFT", self, "TOPLEFT", cbstat["left"]+25, cbstat["top"]-5); |
end |
--Headline(s) (fontstring) |
for hlname,hlstat in pairs(options[self:GetName()]["headline"]) do |
newtext = "$parent_static_"..hlname |
newfs = self:CreateFontString(newtext,"OVERLAY","GameFontNormal") |
if hlstat["global"] then newloc = hlstat["global"] |
else newloc = hlstat[lang] end |
newfs:SetText(newloc) |
newfs:SetPoint("TOP", self, "TOP", hlstat["left"], hlstat["top"]) |
end |
InterfaceOptions_AddCategory(self) |
elseif self.GetChecked then |
self:SetChecked(STSO_Get(self) == true) |
for cbname,cbstat in pairs(options[self:GetName()]["checkbutton"]) do |
getglobal(self:GetName().."_"..cbname):SetChecked(cbstat["def"]) |
end |
-- print("Defaults aren't implemented yet.") |
end |
function STSO_CheckButton_OnClick(self) |
end |
--[[ |
local panel = CreateFrame("Frame", "STSO_Panel", UIParent) |
panel.name = "StopTradeSpam" |
panel.okay = STSO_Okay |
panel.cancel = STSO_Cancel |
panel.default = STSO_Default |
InterfaceOptions_AddCategory(panel); |
panel = CreateFrame("Frame", "STSO_Panel_white", STSO_Panel) |
panel.parent = "StopTradeSpam" |
panel.name = "Whitelist" |
panel.okay = STSO_Okay |
panel.cancel = STSO_Cancel |
panel.default = STSO_Default |
InterfaceOptions_AddCategory(panel); |
panel = CreateFrame("Frame", "STSO_Panel_black", STSO_Panel) |
panel.parent = "StopTradeSpam" |
panel.name = "Blacklist" |
panel.okay = STSO_Okay |
panel.cancel = STSO_Cancel |
panel.default = STSO_Default |
InterfaceOptions_AddCategory(panel); |
panel = CreateFrame("Frame", "STSO_Panel_ignore", STSO_Panel) |
panel.parent = "StopTradeSpam" |
panel.name = "Trade-Ignorelist" |
panel.okay = STSO_Okay |
panel.cancel = STSO_Cancel |
panel.default = STSO_Default |
InterfaceOptions_AddCategory(panel); |
--]] |
--[[ |
function STSO_ButtonClick() |
DEFAULT_CHAT_FRAME:AddMessage(STSO_EditBox:GetText()) |
STSO_EditBox:SetText("") |
end |
function STSO_Close() |
STS_Options:Hide() |
end |
-- DEFAULT_CHAT_FRAME:AddMessage(...) |
-- Event Handler |
--]] |
["notify_new"] = "<is now T-ignored>", |
["notify_tign"] = "<tign>", |
["CHAT_MSG_CHANNEL"] = {true, true, true, true, true, true, true, true, true, true}, |
["CHAT_MSG_ACHIEVEMENT"] = true, |
["CHAT_MSG_BATTLEGROUND"] = false, |
["CHAT_MSG_BATTLEGROUND_LEADER"] = false, |
["CHAT_MSG_EMOTE"] = true, |
["CHAT_MSG_GUILD"] = false, |
["CHAT_MSG_GUILD_ACHIEVEMENT"] = false, |
["CHAT_MSG_OFFICER"] = false, |
["CHAT_MSG_PARTY"] = false, |
["CHAT_MSG_PARTY_LEADER"] = false, |
["CHAT_MSG_RAID"] = false, |
["CHAT_MSG_RAID_LEADER"] = false, |
["CHAT_MSG_RAID_WARNING"] = false, |
["CHAT_MSG_SAY"] = true, |
["CHAT_MSG_TEXT_EMOTE"] = true, |
["CHAT_MSG_WHISPER"] = false, |
["CHAT_MSG_WHISPER_INFORM"] = false, |
["CHAT_MSG_YELL"] = true, |
} |
if not STS_SV["ignore"] then |
STS_SV["ignore"] = { } |
}, |
} |
end |
if oldv <= 7.2 then |
STS_SV["settings"]["CHAT_MSG_ACHIEVEMENT"] = true |
STS_SV["settings"]["CHAT_MSG_BATTLEGROUND"] = false |
STS_SV["settings"]["CHAT_MSG_BATTLEGROUND_LEADER"] = false |
STS_SV["settings"]["CHAT_MSG_EMOTE"] = true |
STS_SV["settings"]["CHAT_MSG_GUILD"] = false |
STS_SV["settings"]["CHAT_MSG_GUILD_ACHIEVEMENT"] = false |
STS_SV["settings"]["CHAT_MSG_OFFICER"] = false |
STS_SV["settings"]["CHAT_MSG_PARTY"] = false |
STS_SV["settings"]["CHAT_MSG_PARTY_LEADER"] = false |
STS_SV["settings"]["CHAT_MSG_RAID"] = false |
STS_SV["settings"]["CHAT_MSG_RAID_LEADER"] = false |
STS_SV["settings"]["CHAT_MSG_RAID_WARNING"] = false |
STS_SV["settings"]["CHAT_MSG_SAY"] = true |
STS_SV["settings"]["CHAT_MSG_TEXT_EMOTE"] = true |
STS_SV["settings"]["CHAT_MSG_WHISPER"] = false |
STS_SV["settings"]["CHAT_MSG_WHISPER_INFORM"] = false |
STS_SV["settings"]["CHAT_MSG_YELL"] = true |
end |
sts_quiet = 0 |
return version |
local version = 7.2 |
local version = tonumber(strmatch(GetAddOnMetadata("StopTradeSpam","Version"),"^%d+.(%d+.%d+)")) |
sts_session_all = 0 |
sts_session_filtered = 0 |
sts_last_action = 0 |
tignlist = "" |
sts_numignore = -1 |
-- Events where author is ignored, but msg should not be filtered out (only notify) |
tign_notify = { |
["CHAT_MSG_BATTLEGROUND"] = true, |
["CHAT_MSG_BATTLEGROUND"] = true, |
["CHAT_MSG_BATTLEGROUND_LEADER"] = true, |
["CHAT_MSG_GUILD"] = true, --TODO: Maybe unignore if this is seen. |
["CHAT_MSG_OFFICER"] = true, --TODO: Same as guild? |
["CHAT_MSG_PARTY"] = true, |
["CHAT_MSG_PARTY_LEADER"] = true, |
["CHAT_MSG_RAID"] = true, |
["CHAT_MSG_RAID_LEADER"] = true, |
["CHAT_MSG_RAID_WARNING"] = true, |
["CHAT_MSG_SAY"] = true, |
["CHAT_MSG_WHISPER"] = true, |
["CHAT_MSG_WHISPER_INFORM"] = true, |
local tign_events = { |
"CHAT_MSG_BATTLEGROUND", |
"CHAT_MSG_BATTLEGROUND_LEADER", |
"CHAT_MSG_GUILD", --TODO: Maybe unignore if this is seen. |
"CHAT_MSG_OFFICER", --TODO: Same as guild? |
"CHAT_MSG_PARTY", |
"CHAT_MSG_PARTY_LEADER", |
"CHAT_MSG_RAID", |
"CHAT_MSG_RAID_LEADER", |
"CHAT_MSG_RAID_WARNING", |
"CHAT_MSG_SAY", |
"CHAT_MSG_WHISPER", |
"CHAT_MSG_WHISPER_INFORM", |
-- "CHAT_MSG_CHANNEL_JOIN", TODO: maybe add again |
-- "CHAT_MSG_CHANNEL_LEAVE", TODO: maybe add again |
"CHAT_MSG_EMOTE", |
"CHAT_MSG_ACHIEVEMENT", |
"CHAT_MSG_GUILD_ACHIEVEMENT", |
"CHAT_MSG_TEXT_EMOTE", |
"CHAT_MSG_YELL", |
} |
--Events where author is ignored and should be filtered |
tign_filterthis = { |
["CHAT_MSG_CHANNEL_JOIN"] = true, |
["CHAT_MSG_CHANNEL_LEAVE"] = true, |
["CHAT_MSG_EMOTE"] = true, |
["CHAT_MSG_GUILD_ACHIEVEMENT"] = true, |
["CHAT_MSG_TEXT_EMOTE"] = true, |
["CHAT_MSG_YELL"] = true, |
} |
function dcfa(...) |
if sts_quiet > 0 then |
end |
function STS_AddIgnore(ign_name, ign_reason) |
if not STS_SV["ignore"][tignlist][ign_name] then |
if not STS_SV["settings"]["enabletign"] then |
dcfa("Ignoring not possible! Ignorelist disabled in settings.") |
return false |
elseif not STS_SV["ignore"][tignlist][ign_name] then |
if not ign_reason then |
ign_reason = "" |
end |
spamfound = spamfound + lv |
end |
end |
--[[ rewritten |
for _,wle in pairs(STS_SV[sts_lang]["whitelist"]) do |
if strfind(msg, wle) then |
spamfound = spamfound - 2 --TODO: evaluate numbers |
--sp = sp..wle.." # " --debug |
end |
end |
for _,ble in pairs(STS_SV[sts_lang]["blacklist"]) do |
if strfind(msg, ble) then |
spamfound = spamfound + 1 |
--sp = sp..ble.." # " --debug |
end |
end |
--sp = sp.."# #" --debug |
]]-- |
if STS_SV["settings"]["blockgold"] and spamfound > 7 then |
ComplainChat(select(11,...)) |
sts_last_action = 1 |
--debug w/: return false,sts_last_msgtext,select(2,...),select(3,...),select(4,...),select(5,...),select(6,...),select(7,...),select(8,...),select(9,...),select(10,...),select(11,...),select(12,...) |
end |
end |
elseif tign_notify[event] and STS_SV["ignore"][tignlist][select(2,...)] then |
elseif STS_SV["settings"][event] and STS_SV["ignore"][tignlist][select(2,...)] then |
sts_last_action = -1 |
sts_last_msgtext = strsub(sts_notify..STS_SV["settings"]["notify_tign"].."\124r "..select(1,...),1,255) |
return false, sts_last_msgtext,select(2,...),select(3,...),select(4,...),select(5,...),select(6,...),select(7,...),select(8,...),select(9,...),select(10,...),select(11,...),select(12,...) |
elseif tign_filterthis[event] and STS_SV["ignore"][tignlist][select(2,...)] then |
elseif STS_SV["ignore"][tignlist][select(2,...)] then --not STS_SV["settings"][event] |
sts_last_action = 1 |
return true |
else |
f:RegisterEvent("CHAT_MSG_ADDON") |
if STS_SV["debug"] then f:RegisterEvent("WHO_LIST_UPDATE") end |
ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL", STS_ChatFilter) |
for event,_ in pairs(tign_notify) do |
for _,event in pairs(tign_events) do |
ChatFrame_AddMessageEventFilter(event, STS_ChatFilter) |
end |
for event,_ in pairs(tign_filterthis) do |
ChatFrame_AddMessageEventFilter(event, STS_ChatFilter) |
end |
STSO_Build() |
elseif event == "CHAT_MSG_ADDON" and strsub(select(1,...),1,3) == "STS" then |
if strsub(select(1,...),4,12) == "_?Version" then |
type = "launcher", |
icon = "Interface\\Icons\\Spell_Nature_StormReach", |
OnClick = function(clickedframe, button) |
print(clickedframe, button) |
STS_Options() |
if button == "LeftButton" then STS_Options() end |
--elseif TODO other buttons |
end, |
}) |