vanilla-wow-addons – Rev 1
?pathlinks?
--[[
Healers Assist by Kiki of European Cho'gall (Alliance)
Regexpr functions
Taken from SWStats by Artack - Thanks !
]]
--------------- Constantes ---------------
--------------- Shared variables ---------------
HA_RegEx_Lookup = {};
--------------- Local variables ---------------
local HA_SL_RegExCreate = 0;
local HA_SL_RegExAdded = 0;
local HA_MAX_ARGS = 4;
HA_DefaultMap= {
["CHAT_MSG_SPELL_SELF_BUFF"] = {
[1] = "HEALEDCRITSELFSELF",
[2] = "HEALEDCRITSELFOTHER",
[3] = "HEALEDSELFSELF",
[4] = "HEALEDSELFOTHER",
},
["CHAT_MSG_SPELL_PARTY_BUFF"] = {
[1] = "HEALEDCRITOTHERSELF",
[2] = "HEALEDCRITOTHEROTHER",
[3] = "HEALEDOTHERSELF",
[4] = "HEALEDOTHEROTHER",
},
["CHAT_MSG_SPELL_FRIENDLYPLAYER_BUFF"] = {
[1] = "HEALEDCRITOTHERSELF",
[2] = "HEALEDCRITOTHEROTHER",
[3] = "HEALEDOTHERSELF",
[4] = "HEALEDOTHEROTHER",
},
["CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF"] = {
[1] = "HEALEDCRITOTHERSELF",
[2] = "HEALEDCRITOTHEROTHER",
[3] = "HEALEDOTHERSELF",
[4] = "HEALEDOTHEROTHER",
},
["CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"] = {
[1] = "PERIODICAURAHEALSELFSELF",
},
["CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS"] = {
[1] = "PERIODICAURAHEALSELFOTHER",
},
["CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS"] = {
[1] = "PERIODICAURAHEALSELFOTHER",
},
};
--------------- Internal functions ---------------
local function HA_g1(doMe, withInfo)
_,_,v1 = string.find(doMe, withInfo["r"])
if v1 == nil then return nil; end
return {v1};
end
local function HA_g2(doMe, withInfo)
_,_,v1, v2 = string.find(doMe, withInfo["r"])
if v2 == nil then return nil; end
return {v1, v2};
end
local function HA_g3(doMe, withInfo)
_,_,v1, v2, v3 = string.find(doMe, withInfo["r"])
if v3 == nil then return nil; end
return {v1, v2, v3};
end
local function HA_g4(doMe, withInfo)
_,_,v1, v2, v3, v4 = string.find(doMe, withInfo["r"])
if v4 == nil then return nil; end
return {v1, v2, v3, v4};
end
local HA_Func_Lookup = {HA_g1,HA_g2,HA_g3,HA_g4}; -- Must be declared after functions
-- here we resort the values via the mapping that was created during the init
local function HA_sortVals(vals, withInfo)
if vals == nil then return nil; end
local ret = {};
for k,v in pairs(withInfo["p"]) do
ret[v] = vals[k];
end
return ret;
end
function HA_getInfo(doMe, withInfo )
-- if we don't have a function or # of captures is invlid return nil
if withInfo["r"] == nil or withInfo["i"] > HA_MAX_ARGS or withInfo["i"] < 1 then return nil; end
-- resort if we have to
if withInfo["p"] == nil then
return HA_Func_Lookup[withInfo["i"]](doMe, withInfo);
else
return HA_sortVals(HA_Func_Lookup[withInfo["i"]](doMe, withInfo), withInfo);
end
end
local function _HA_InitVar(varName,types,fromSelf,toSelf,isCrit)
local str = getglobal(varName);
if str == nil then return end;
if types == nil then return end;
--fixes ambiguous strings
-- fix log strings is a localized function
local strTmp = HA_FixLogStrings(str);
if(str ~= strTmp)
then
setglobal(varName, strTmp);
str = strTmp;
end
HA_SL_RegExCreate = HA_SL_RegExCreate +1;
HA_RegEx_Lookup[varName] ={};
-- "p" stands for positions maps found for numbered vals (e.g. %3$s)
-- in a different langugage these might be used in a different order
HA_RegEx_Lookup[varName]["p"] ={};
HA_RegEx_Lookup[varName]["types"] = types;
if(fromSelf)
then
HA_RegEx_Lookup[varName]["fromSelf"] = 1;
end
if(toSelf)
then
HA_RegEx_Lookup[varName]["toSelf"] = 1;
end
if(isCrit)
then
HA_RegEx_Lookup[varName]["isCrit"] = 1;
end
local index=0;
local needPosLookup = false;
-- first we have to "sanitze" the string ^()%.[]*+-? are special chars in a regex (dont escape the $ and %)
-- so we are escaping these with %
str = string.gsub(str, "([%.%(%)%+%-%?%[%]%^])", "%%%1");
-- the inner function actually does the work
str = string.gsub(str,'(%%(%d?)$?([sd]))',
function(all,num,type) -- e.g. %3$s all = %3$s num=3 type=s
index = index+1;
--1.0.2 , fixed the french version bug through "tonumber .. omg DOH .. oh well
-- this will help all non english versions
HA_RegEx_Lookup[varName]["p"][index] = tonumber(num);
if(num ~= "")
then
-- if num is "" then the string e.g. only used %s and not %1$s
-- and we dont need a lookup - its already in order
needPosLookup = true;
end
--this is the actual replacement that makes the regex
-- use non greedy for strings
if(type == 's')
then
return ('(.-)');
else
return ('(%d+)');
end
end
);
-- saves how many captures to expect later using this regex
HA_RegEx_Lookup[varName]["i"] = index;
--generate maps for heal dmg etc info
if(index == getn(types))
then
local playerName = "";
local mm = {};
local medm = {};
local i;
local max = getn(types);
--1 = target
--2 = caster/attacker/initiator
--3 = someString (normally spell names, or item names)
-- 51 = dmg 52 = heal
--{from,to,dmg,heal, what}
for i, val in ipairs(types)
do
if(val == 2)
then
mm[1] = i;
medm[1] = i;
elseif(val == 1)
then
mm[2] = i;
medm[2] = i;
elseif(val == 51)
then
mm[3] = i;
medm[3] = i;
elseif(val == 52)
then
mm[4] = i;
medm[4] = i;
elseif(val == 3)
then
mm[5] = i;
medm[5] = i;
elseif(val == 7)
then
mm[6] = i;
medm[6] = i;
end
end
if(fromSelf)
then
mm[1]= -1;
end
if(toSelf)
then
mm[2]= -1;
end
HA_RegEx_Lookup[varName]["basicInfo"] = mm;
else
HA_ChatWarning("_HA_InitVar "..varName.." "..index.."~="..getn(types).." caputerN~=TypeN");
end
if (needPosLookup)
then
-- check if we really do need it
-- could be in order anyways
needPosLookup = false;
for k, v in pairs(HA_RegEx_Lookup[varName]["p"])
do
-- make k, v numbers, so they will compare
-- k,v are of different types so this wouldn't work otherwise
k = k+0;
v = v+0;
if(k ~= v)
then
needPosLookup = true;
break;
end
end
end
-- now we are sure if we need it or not
if(not needPosLookup)
then
-- %s %d etc. used info is "in order"
-- or %1$s %2$d etc. was used but all in correct order
-- just junk it
HA_RegEx_Lookup[varName]["p"] = nil;
end
HA_RegEx_Lookup[varName]["r"] = "^"..str; -- the regex
end
--------------- Shared functions ---------------
function HA_findEventMatch(event,callback)
-- only interested in stuff with numbers
-- V0.92 Changed this regex
--V 1.1.0 Added () -- fix for french crit vals
if (not arg1 or not string.find (arg1, "[%s%.%:%(]%d+[%s%.%)]")) then
return;
end
if(HA_DefaultMap[event] ~= nil)
then
for _,v in ipairs(HA_DefaultMap[event])
do
r = HA_getInfo(arg1,HA_RegEx_Lookup[v]);
if(r ~= nil)
then
local re = HA_RegEx_Lookup[v];
local reBI= re["basicInfo"];
local from = reBI[1];
local to = reBI[2];
local what = reBI[5];
local school = reBI[6];
local heal = tonumber(r[reBI[4]]);
local crit = false;
if from == -1 then from = HA_PlayerName; else from = r[from]; end
if to == -1 then to = HA_PlayerName; else to = r[to] end
if(re["isCrit"] == 1) then crit = true; end
if(what) then what = r[what]; end
callback(event, from, to, what, heal, crit);
return;
end
end
end
end
function HA_CreateRegexFromGlobals()
HA_RegEx_Lookup = {};
HA_SL_RegExCreate = 0;
HA_SL_RegExAdded = 0;
--1 = target
--2 = caster/attacker/initiator
--3 = someString (normally spell names, or item names)
-- 51 = dmg 52 = heal
--{from,to,dmg,heal, what}
_HA_InitVar("HEALEDSELFSELF",{3,52},true,true,nil);
_HA_InitVar("HEALEDSELFOTHER",{3,1,52},true,nil,nil);
_HA_InitVar("HEALEDCRITSELFSELF",{3,52},true,true,true);
_HA_InitVar("HEALEDCRITSELFOTHER",{3,1,52},true,nil,true);
_HA_InitVar("HEALEDOTHERSELF",{2,3,52},nil,true,nil);
_HA_InitVar("HEALEDOTHEROTHER",{2,3,1,52},nil,nil,nil);
_HA_InitVar("HEALEDCRITOTHERSELF",{2,3,52},nil,true,true);
_HA_InitVar("HEALEDCRITOTHEROTHER",{2,3,1,52},nil,nil,true);
-- Hots
_HA_InitVar("PERIODICAURAHEALSELFSELF",{52,3},true,true,nil);
_HA_InitVar("PERIODICAURAHEALSELFOTHER",{1,52,3},true,nil,nil);
--SPELLFAILCASTSELF
end