refactored group storing

René Welbers [02-11-16 - 17:48]
refactored group storing
made addon dependson ftc
made addon pts ready
Filename
PanicModeCombatAnalyzer.lua
PanicModeCombatAnalyzer.txt
ext/base64.lua
diff --git a/PanicModeCombatAnalyzer.lua b/PanicModeCombatAnalyzer.lua
index 95ddae7..a4e07e2 100644
--- a/PanicModeCombatAnalyzer.lua
+++ b/PanicModeCombatAnalyzer.lua
@@ -1,9 +1,10 @@

 PanicModeCombatAnalyzer = PanicModeCombatAnalyzer or {}
+base64 = base64 or {}

 PanicModeCombatAnalyzer.name		  = 'PanicModeCombatAnalyzer'
-PanicModeCombatAnalyzer.version	      = '1.0.9'
-PanicModeCombatAnalyzer.versionDB	  = 2
+PanicModeCombatAnalyzer.version	      = '1.0.10'
+PanicModeCombatAnalyzer.versionDB	  = 3
 PanicModeCombatAnalyzer.loaded	      = false
 PanicModeCombatAnalyzer.author        = 'silentgecko, deevilius'
 PanicModeCombatAnalyzer.savedVarsName = 'PMCAVars'
@@ -51,27 +52,9 @@ function PanicModeCombatAnalyzer.Initialize(_, addonName)
     --combat state
     EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_COMBAT_STATE, self.OnPlayerCombatState)

-    -- group change
-    EVENT_MANAGER:RegisterForEvent(self.name, EVENT_GROUP_UPDATE, self.onGroupChange)
-    EVENT_MANAGER:RegisterForEvent(self.name, EVENT_GROUP_MEMBER_JOINED, self.onGroupChange)
-    EVENT_MANAGER:RegisterForEvent(self.name, EVENT_GROUP_MEMBER_LEFT, self.onGroupChange)
-
     CALLBACK_MANAGER:RegisterCallback("FTC_NewDamage", self.addDamage)
 end

--- fight status
-function PanicModeCombatAnalyzer.OnPlayerCombatState(_, inCombat)
-    local self       = PanicModeCombatAnalyzer
-    local timeStamp  = GetTimeStamp()
-    local data       = self.savedVariables.data or {}
-
-    data[timeStamp]          = data[timeStamp] or {}
-    data[timeStamp]['event'] = data[timeStamp]['event'] or {}
-    table.insert(data[timeStamp]['event'], {combat = inCombat})
-
-    self.savedVariables.data[timeStamp] = data[timeStamp]
-end
-
 -- cleanup
 function PanicModeCombatAnalyzer.cleanUp()
     local self      = PanicModeCombatAnalyzer
@@ -86,6 +69,19 @@ function PanicModeCombatAnalyzer.cleanUp()
     end
 end

+-- fight status
+function PanicModeCombatAnalyzer.OnPlayerCombatState(_, inCombat)
+    local self       = PanicModeCombatAnalyzer
+    local timeStamp  = GetTimeStamp()
+    local data       = self.savedVariables.data or {}
+
+    data[timeStamp]          = data[timeStamp] or {}
+    data[timeStamp]['event'] = data[timeStamp]['event'] or {}
+    table.insert(data[timeStamp]['event'], {combat = inCombat})
+
+    self.savedVariables.data[timeStamp] = data[timeStamp]
+end
+
 -- get current trial
 function PanicModeCombatAnalyzer.getTrial()
     local self         = PanicModeCombatAnalyzer
@@ -146,6 +142,7 @@ function PanicModeCombatAnalyzer.addDamage(damage)
         -- only store, when we have damage or healing
         if next(data[lastSaveTS]['damage']) ~= nil or next(data[lastSaveTS]['healing']) ~= nil then
             data[lastSaveTS]['trial'] = self.getTrial()
+            data[lastSaveTS]['group'] = self.getGroupEnc()

             self.savedVariables.data[lastSaveTS] = data[lastSaveTS]
         end
@@ -174,37 +171,45 @@ function PanicModeCombatAnalyzer.onAlive(event)
     local timeStamp  = GetTimeStamp()
     local data       = self.savedVariables.data or {}

-    data[timeStamp]          = data[timeStamp] or {}
-    data[timeStamp]['event'] = data[timeStamp]['event'] or {}
     table.insert(data[timeStamp]['event'], {alive = true})

     self.savedVariables.data[timeStamp] = data[timeStamp]
 end

--- group change
-function PanicModeCombatAnalyzer.onGroupChange(event)
+-- player rezz
+function PanicModeCombatAnalyzer.onRezz(event, requesterCharacterName, timeLeftToAccept)
     local self       = PanicModeCombatAnalyzer
     local timeStamp  = GetTimeStamp()
     local data       = self.savedVariables.data or {}

     data[timeStamp]          = data[timeStamp] or {}
     data[timeStamp]['event'] = data[timeStamp]['event'] or {}
-    table.insert(data[timeStamp]['event'], {group = self.getGroup()})

+    table.insert(data[timeStamp]['event'], {rezz = zo_strformat("<<!aC:1>>", requesterCharacterName)})
     self.savedVariables.data[timeStamp] = data[timeStamp]
 end

--- player rezz
-function PanicModeCombatAnalyzer.onRezz(event, requesterCharacterName, timeLeftToAccept)
+
+-- group change
+function PanicModeCombatAnalyzer.getGroupEnc()
     local self       = PanicModeCombatAnalyzer
-    local timeStamp  = GetTimeStamp()
-    local data       = self.savedVariables.data or {}
+    local group      = self.getGroup()
+    local groupEnc   = ''
+    local groupStr   = ''

-    data[timeStamp]          = data[timeStamp] or {}
-    data[timeStamp]['event'] = data[timeStamp]['event'] or {}
+    --sort group
+    local groupSort = function(char1, char2) return char1.name < char2.name end
+    table.sort(group, groupSort)

-    table.insert(data[timeStamp]['event'], {rezz = zo_strformat("<<!aC:1>>", requesterCharacterName)})
-    self.savedVariables.data[timeStamp] = data[timeStamp]
+    -- encode group
+    for key,charName in pairs(group) do --actualcode
+        groupStr = groupStr .. "," .. charName.name
+    end
+    groupStr = string.sub(groupStr, 2);
+
+    groupEnc = base64.enc(groupStr)
+
+    return groupEnc
 end

 -- get group
@@ -219,7 +224,10 @@ function PanicModeCombatAnalyzer.getGroup()
             local unitTag = GetGroupUnitTagByIndex(i)
             if (DoesUnitExist(unitTag)) then
                 local charName = zo_strformat("<<!aC:1>>", GetUnitName(unitTag))
-                table.insert(group, charName)
+                local charTable = {
+                    name = charName
+                }
+                table.insert(group, charTable)
             end
         end
     end
diff --git a/PanicModeCombatAnalyzer.txt b/PanicModeCombatAnalyzer.txt
index 284aa19..e5b3d85 100644
--- a/PanicModeCombatAnalyzer.txt
+++ b/PanicModeCombatAnalyzer.txt
@@ -1,10 +1,11 @@
 ## Title: |cEFEBBEPanic Mode Combat Analyzer|r
 ## Description: Saves your dps during fight, based on FTC DPS Meter.
 ## Author: |c009ad6silentgecko|r, deevilius
-## Version: 1.0.9
-## APIVersion: 100013
+## Version: 1.0.10
+## APIVersion: 100014
 ## SavedVariables: PMCAVars
-## OptionalDependsOn: FoundryTacticalCombat
+## DependsOn: FoundryTacticalCombat

+ext/base64.lua
 OverwriteFTC.lua
 PanicModeCombatAnalyzer.lua
\ No newline at end of file
diff --git a/ext/base64.lua b/ext/base64.lua
new file mode 100644
index 0000000..7f6822c
--- /dev/null
+++ b/ext/base64.lua
@@ -0,0 +1,72 @@
+-- working lua base64 codec (c) 2006-2008 by Alex Kloss
+-- compatible with lua 5.0
+-- http://www.it-rfc.de
+-- licensed under the terms of the LGPL2
+
+-- bitshift functions (<<, >> equivalent)
+-- shift left
+base64 = {}
+
+local function lsh(value,shift)
+    return math.mod((value*(2^shift)), 256)
+end
+
+-- shift right
+local function rsh(value,shift)
+    return math.mod(math.floor(value/2^shift), 256)
+end
+
+-- return single bit (for OR)
+local function bit(x,b)
+    return (math.mod(x, 2^b) - math.mod(x, 2^(b-1)) > 0)
+end
+
+-- logic OR for number values
+local function lor(x,y)
+    local result = 0
+    for p=1,8 do result = result + (((bit(x,p) or bit(y,p)) == true) and 2^(p-1) or 0) end
+    return result
+end
+
+-- encryption table
+local base64chars = {[0]='A',[1]='B',[2]='C',[3]='D',[4]='E',[5]='F',[6]='G',[7]='H',[8]='I',[9]='J',[10]='K',[11]='L',[12]='M',[13]='N',[14]='O',[15]='P',[16]='Q',[17]='R',[18]='S',[19]='T',[20]='U',[21]='V',[22]='W',[23]='X',[24]='Y',[25]='Z',[26]='a',[27]='b',[28]='c',[29]='d',[30]='e',[31]='f',[32]='g',[33]='h',[34]='i',[35]='j',[36]='k',[37]='l',[38]='m',[39]='n',[40]='o',[41]='p',[42]='q',[43]='r',[44]='s',[45]='t',[46]='u',[47]='v',[48]='w',[49]='x',[50]='y',[51]='z',[52]='0',[53]='1',[54]='2',[55]='3',[56]='4',[57]='5',[58]='6',[59]='7',[60]='8',[61]='9',[62]='-',[63]='_'}
+
+-- function encode
+-- encodes input string to base64.
+function base64.enc(data)
+    local bytes = {}
+    local result = ""
+    for spos=0,string.len(data)-1,3 do
+        for byte=1,3 do bytes[byte] = string.byte(string.sub(data,(spos+byte))) or 0 end
+        result = string.format('%s%s%s%s%s',
+            result,
+            base64chars[rsh(bytes[1],2)],
+            base64chars[lor(lsh((math.mod(bytes[1], 4)),4), rsh(bytes[2],4))] or "=",
+            ((string.len(data)-spos) > 1) and base64chars[lor(lsh(
+                math.mod(bytes[2], 16)
+                ,2), rsh(bytes[3],6))] or "=",
+            ((string.len(data)-spos) > 2) and base64chars[(math.mod(bytes[3], 64))] or "="
+        )
+    end
+    return result
+end
+
+-- decryption table
+local base64bytes = {['A']=0,['B']=1,['C']=2,['D']=3,['E']=4,['F']=5,['G']=6,['H']=7,['I']=8,['J']=9,['K']=10,['L']=11,['M']=12,['N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,['a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,['n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,['0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['-']=62,['_']=63,['=']=nil}
+
+-- function decode
+-- decode base64 input to string
+function base64.dec(data)
+    local chars = {}
+    local result=""
+    for dpos=0,string.len(data)-1,4 do
+        for char=1,4 do chars[char] = base64bytes[(string.sub(data,(dpos+char),(dpos+char)) or "=")] end
+        result = string.format('%s%s%s%s',
+            result,
+            string.char(lor(lsh(chars[1],2), rsh(chars[2],4))),
+            (chars[3] ~= nil) and string.char(lor(lsh(chars[2],4), rsh(chars[3],2))) or "",
+            (chars[4] ~= nil) and string.char(lor(math.mod(lsh(chars[3],6), 192), (chars[4]))) or ""
+        )
+    end
+    return result
+end
\ No newline at end of file