-- Licence: No care and no responsibility -- Some code from the luatz project (MIT Licence) -- Configuration ========== local dateformat = "%Y-%m-%d, %H:%M" local Colour_Not_Complete = "#FFB67D" local Colour_Complete = "#000000" local Colour_Heading_Complete = "#58FA58" dofile "en.lua" -- default english translations -- ======================== require( "iuplua" ) require( "iupluacontrols" ) dofile "../../SavedVariables/History.lua" --os.execute( "md ..\\..\\SavedVariables\\History_Bak" ) -- fails silently if already exists. --os.execute("copy ..\\..\\SavedVariables\\History.lua ..\\..\\SavedVariables\\History_Bak\\History.lua") -- ============== Setup storage for old characters. archivef = io.open("../../SavedVariables/History.Archive", "r") if archivef ==nil then --create empty file archivef = io.open("../../SavedVariables/History.Archive", "w") archivef:write("Archive = {} \n") end archivef:close() dofile "../../SavedVariables/History.Archive" -- ============== function dump(o) if type(o) == 'table' then local s = '{ ' for k,v in pairs(o) do if type(k) ~= 'number' then k = '"'..k..'"' end s = s .. '['..k..'] = ' .. dump(v) .. ',' end return s .. '} ' else return tostring(o) end end -- newf = assert(io.open("../../SavedVariables/History.new", "w")) -- Minimally effective quoting function quote(astring) return '"' .. string.gsub(astring,"%'", "\\'") .. '"' end function write_saved(o) local escaped if type(o) == 'table' then local s = '{\n' for k,v in pairs(o) do if type(k) ~= 'number' then k = '"'..k..'"' end s = s .. '['..k..'] = ' .. write_saved(v) .. ',\n' end return s .. '}\n' elseif type(o) == 'string' then return quote(o) else return tostring(o) end end accounts = {} for i,_ in pairs(History_SV["Default"]) do accounts[i] = {} accounts[i].names = {} -- intermediate table for sorting. WIP. Array formatted. accounts[i].name = {} myaccount = i end function write_data() newf = assert(io.open("../../SavedVariables/History.new", "w")) newf:write("History_SV=" .. write_saved(History_SV)) newf:close() end --Dump it back out -- newf:write("History_SV=" .. write_saved(History_SV)) -- newf:close() -- Load up .names, as a first run through. It's a sortable array. -- This is used as an indirection to control presentation order for acc,_ in pairs (accounts) do for char, _ in pairs(History_SV["Default"][acc]["$AccountWide"]["data"]) do table.insert (accounts[acc].names, char) accounts[acc].name[char] = {} -- stub table to hold char data end end -- accounts[acc].name[char].display = {} -- Hold all the IUP tabs and boxes for that char function print_old() for i,j in pairs (History_SV["Default"][myaccount]["$AccountWide"]["old"]) do print (i .. " .. " .. dump(j)) end end -- set up some static data lbl_Status_bar = iup.label{title=L.Welcome, expand = "HORIZONTAL"} btn_archive = iup.button{title="Archive", FGCOLOR = "#FF0000"} --[[ ========================================== Iterate over all accounts and chars creating display items --]] for acc,_ in pairs (accounts) do -- ==== Accountwide Data -- Setup Log data accounts[acc].logtabs =iup.tabs{} -- Log Display table presentation accounts[acc].logtable = {} accounts[acc].logtable=iup.matrix{numcol=1, numcol_visible=1, numlin=0} accounts[acc].logtable:setcell(0,0, L.TStamp) iup.SetAttribute(accounts[acc].logtable, "ALIGNMENT0", "ACENTER") iup.SetAttribute(accounts[acc].logtable, "WIDTH0", 80) iup.SetAttribute(accounts[acc].logtable, "WIDTH1", 200) -- Load log data local Line=0 local TimeStr = "" accounts[acc].logtable.numlin = Line for i,j in ipairs (History_SV["Default"][acc]["$AccountWide"]["log"]) do Line= Line +1 accounts[acc].logtable.numlin = Line TimeStr = os.date(dateformat,j["TimeStamp"]) accounts[acc].logtable:setcell( Line,0, TimeStr) accounts[acc].logtable:setcell( Line,1, j["text"]) end -- Setup Log Display accounts[acc].log_tab=iup.vbox { ["tabtitle"] =L.LogTab, iup.label{title="LogLabel",expand="HORIZONTAL"}, accounts[acc].logtable, iup.label{SEPARATOR="HORIZONTAL"}, -- Bottom Area iup.hbox { Alignment = "ACENTER", btn_eraselog, iup.label{title = L.EraseWarning, PADDING="10X0"}, iup.fill{}, }, iup.fill{} } accounts[acc].tabs =iup.tabs{} -- Top level of Tabs, Character Info in Here -- ==== END Accountwide Data -- Creates boxes, stage from names to allow optional sorting in future. for _,char in ipairs(accounts[acc].names) do accounts[acc].name[char] = {} -- Pull in some char data for processing -- == Gender if History_SV["Default"][acc]["$AccountWide"]["data"][char].Gender =="M" then accounts[acc].name[char].gender = L.Male elseif History_SV["Default"][acc]["$AccountWide"]["data"][char].Gender == "F" then accounts[acc].name[char].gender = L.Female end -- ==Level local level = History_SV["Default"][acc]["$AccountWide"]["data"][char].level accounts[acc].name[char].level = level if (level <=50) then accounts[acc].name[char].levelstr = tostring(level) else accounts[acc].name[char].levelstr = "V" .. tostring(level -50) end -- == Cumulative TimePlayed accounts[acc].name[char].timeplayed = math.floor(History_SV["Default"][acc]["$AccountWide"]["data"][char].levels[level].time/60) -- Generate the levelling box. ============================ local leveling_box = {} accounts[acc].name[char].leveling_box = iup.matrix {numcol=5, numcol_visible=5, widthdef=60} accounts[acc].name[char].leveling_box:setcell(0,1, L.Level) accounts[acc].name[char].leveling_box:setcell(0,2, L.PTime) accounts[acc].name[char].leveling_box:setcell(0,3, L.Start) accounts[acc].name[char].leveling_box:setcell(0,4, L.Deaths) accounts[acc].name[char].leveling_box:setcell(0,5, L.APts) -- levels as stored are unsorted, so create a level table which is sorted, local levels = {} for i,_ in pairs(History_SV["Default"][acc]["$AccountWide"]["data"][char].levels) do table.insert(levels, i) end table.sort(levels) for i,j in ipairs(levels) do -- traverse in sorted order -- print (char, i,j) local timelevel = math.floor(History_SV["Default"][acc]["$AccountWide"]["data"][char].levels[j].time) accounts[acc].name[char].leveling_box.numlin = i accounts[acc].name[char].leveling_box:setcell(i,1, j) accounts[acc].name[char].leveling_box:setcell(i,2, math.floor(timelevel/60)) accounts[acc].name[char].leveling_box:setcell(i,3, os.date("%Y-%m-%d",History_SV["Default"][acc]["$AccountWide"]["data"][char].levels[j].begin)) accounts[acc].name[char].leveling_box:setcell(i,4, History_SV["Default"][acc]["$AccountWide"]["data"][char].levels[j].deaths) accounts[acc].name[char].leveling_box:setcell(i,5, History_SV["Default"][acc]["$AccountWide"]["data"][char].levels[j].Ach_Points) end -- Create Grp Dungeon Achievements Box========================= accounts[acc].name[char].Grp_box = {} accounts[acc].name[char].Grp_box = iup.matrix {numcol=4, numcol_visible=4, numlin=5, widthdef=90} --Set Column titles for i=1, 4 do accounts[acc].name[char].Grp_box:setcell(0,i, Area_names[i].medium) end --set lines accounts[acc].name[char].Grp_box:setcell(0,0, L.Level) accounts[acc].name[char].Grp_box:setcell(1,0, "10+") accounts[acc].name[char].Grp_box:setcell(2,0, "17+") accounts[acc].name[char].Grp_box:setcell(3,0, "24+") accounts[acc].name[char].Grp_box:setcell(4,0, "31+") accounts[acc].name[char].Grp_box:setcell(5,0, "38+") -- set all text to red iup.SetAttribute(accounts[acc].name[char].Grp_box, "FGCOLOR*:1", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Grp_box, "FGCOLOR*:2", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Grp_box, "FGCOLOR*:3", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Grp_box, "FGCOLOR*:4", Colour_Not_Complete) -- set text to black if achievement found. for id,_ in pairs (grp_dat) do local colour if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[id] ~= nil then colour = "FGCOLOR" .. grp_dat[id].L .. ":" .. grp_dat[id].C iup.SetAttribute(accounts[acc].name[char].Grp_box, colour, Colour_Complete) end end --Set background of heading if all done if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[1073] ~= nil then --EP Vanquisher iup.SetAttribute(accounts[acc].name[char].Grp_box, "BGCOLOR0:1", Colour_Heading_Complete) end if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[1074] ~= nil then --DC Vanquisher iup.SetAttribute(accounts[acc].name[char].Grp_box, "BGCOLOR0:2", Colour_Heading_Complete) end if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[1075] ~= nil then --AD Vanquisher iup.SetAttribute(accounts[acc].name[char].Grp_box, "BGCOLOR0:3", Colour_Heading_Complete) end for id,_ in pairs (grp_dat) do accounts[acc].name[char].Grp_box:setcell(grp_dat[id].L,grp_dat[id].C,grp_dat[id].name) end accounts[acc].name[char].Grp_box.Redraw= "ALL" -- Create Pub Dungeon Achievements Box========================== accounts[acc].name[char].Pub_box = iup.matrix {numcol=4, numcol_visible=4, numlin=5, widthdef=90} for i=1, 4 do -- Load text accounts[acc].name[char].Pub_box:setcell(0,i, Area_names[i].medium) end accounts[acc].name[char].Pub_box:setcell(0,0, L.Level) accounts[acc].name[char].Pub_box:setcell(1,0, "12-15") accounts[acc].name[char].Pub_box:setcell(2,0, "20-23") accounts[acc].name[char].Pub_box:setcell(3,0, "35-36") accounts[acc].name[char].Pub_box:setcell(4,0, "40-43") accounts[acc].name[char].Pub_box:setcell(5,0, "47-50") iup.SetAttribute(accounts[acc].name[char].Pub_box, "FGCOLOR*:1", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Pub_box, "FGCOLOR*:2", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Pub_box, "FGCOLOR*:3", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Pub_box, "FGCOLOR*:4", Colour_Not_Complete) for id,_ in pairs (pub_dat) do if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[id] ~= nil then local colour = "FGCOLOR" .. pub_dat[id].L .. ":" .. pub_dat[id].C iup.SetAttribute(accounts[acc].name[char].Pub_box, colour, Colour_Complete) end end if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[1068] ~= nil then --EP Conqueror iup.SetAttribute(accounts[acc].name[char].Pub_box, "BGCOLOR0:1", Colour_Heading_Complete) end if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[1070] ~= nil then --DC Conqueror iup.SetAttribute(accounts[acc].name[char].Pub_box, "BGCOLOR0:2", Colour_Heading_Complete) end if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[1069] ~= nil then --AD Conqueror iup.SetAttribute(accounts[acc].name[char].Pub_box, "BGCOLOR0:3", Colour_Heading_Complete) end for id,_ in pairs (pub_dat) do -- Load text accounts[acc].name[char].Pub_box:setcell(pub_dat[id].L,pub_dat[id].C,pub_dat[id].name) end accounts[acc].name[char].Pub_box.Redraw= "ALL" -- Create Vet Dungeon Achievements Box========================== accounts[acc].name[char].Vet_box= iup.matrix {numcol=5, numcol_visible=5, numlin=5, widthdef=110} for i=1, 5 do -- Load headings accounts[acc].name[char].Vet_box:setcell(0,i, Area_names[i].medium) end iup.SetAttribute(accounts[acc].name[char].Vet_box, "FGCOLOR*:1", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Vet_box, "FGCOLOR*:2", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Vet_box, "FGCOLOR*:3", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Vet_box, "FGCOLOR*:4", Colour_Not_Complete) iup.SetAttribute(accounts[acc].name[char].Vet_box, "FGCOLOR*:5", Colour_Not_Complete) -- Need to keep track of multiple achievements in Vet dungeons. Index them by dungeon LineColumn. Vet_Info={} for id,_ in pairs (vet_dat) do -- Load Dungeons Info LC is the Dungeon Identifier local L = vet_dat[id].L local C = vet_dat[id].C Vet_Info[L..C] = {count = 0} accounts[acc].name[char].Vet_box:setcell(L,C,vet_dat[id].name .. " (0)") end for id,_ in pairs (vet_dat) do -- For Achievements we have.. if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[id] ~= nil then local L = vet_dat[id].L local C = vet_dat[id].C --Set colour of LC local colour = "FGCOLOR" .. L .. ":" .. C iup.SetAttribute(accounts[acc].name[char].Vet_box, colour, Colour_Complete) -- Increment count and display Vet_Info[L..C].count = Vet_Info[L..C].count+1 accounts[acc].name[char].Vet_box:setcell(L,C,vet_dat[id].name .. " (" .. Vet_Info[L..C].count ..")") end end if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[1159] ~= nil then -- Coh All special. iup.SetAttribute(accounts[acc].name[char].Vet_box, "FGCOLOR3:3", Colour_Heading_Complete) end if History_SV["Default"][acc]["$AccountWide"]["data"][char].ach[1139] ~= nil then -- Craglorn all special. iup.SetAttribute(accounts[acc].name[char].Vet_box, "BGCOLOR0:5", Colour_Heading_Complete) end accounts[acc].name[char].Vet_box.Redraw= "ALL" -- ==================================== -- == Prepare for the user display tabs accounts[acc].name[char].tab = iup.vbox{ ["tabtitle"] = char, -- This vbox will be a tab and the tab text is this iup.hbox{ --Top Information bar Alignment = "ACENTER", iup.label{title=gender, FONT="Times,BOLD,10"}, iup.label{title=History_SV["Default"][acc]["$AccountWide"]["data"][char].Race .." / ".. History_SV["Default"][acc]["$AccountWide"]["data"][char].Class, PADDING="10X0", FONT="Times,BOLD,10"}, iup.label{title=History_SV["Default"][acc]["$AccountWide"]["data"][char].Alliance, PADDING="10X0"}, iup.label{title=L.Level .. ": ".. accounts[acc].name[char].levelstr, PADDING="10X0"}, iup.label{title=L.Created .. os.date(dateformat,History_SV["Default"][acc]["$AccountWide"]["data"][char].Recorded), PADDING="10X0"}, iup.label{title=L.LLog .. os.date(dateformat,History_SV["Default"][acc]["$AccountWide"]["data"][char].LoginTime), PADDING="10X0"}, iup.label{title=L.TPlayed .. accounts[acc].name[char].timeplayed .." " .. L.Hrs}, iup.fill{} }, iup.label{SEPARATOR="HORIZONTAL"}, iup.vbox { --Data tabs for Char iup.tabs { iup.vbox { ["tabtitle"] =L.GrpDungeon, iup.label{title=L.GrpLab,expand="HORIZONTAL"}, accounts[acc].name[char].Grp_box, iup.fill{} }, iup.vbox { ["tabtitle"] =L.PubDungeon, iup.label{title=L.PubLab,expand="HORIZONTAL"}, accounts[acc].name[char].Pub_box, iup.fill{} }, iup.vbox { ["tabtitle"] =L.VetDungeon, iup.label{title=L.VetLab,expand="HORIZONTAL"}, accounts[acc].name[char].Vet_box, iup.fill{} }, iup.vbox { ["tabtitle"] =L.Leveling, iup.label{title="LevLabel",expand="HORIZONTAL"}, accounts[acc].name[char].leveling_box, iup.fill{} }, }, -- end of tabs for dungeons }, } -- end of tabs for characters vbox iup.Append(accounts[acc].tabs,accounts[acc].name[char].tab) accounts[acc].panelsize = tostring(#accounts[acc].names * 40 +350) .. "x250" end -- Chars -- Add to end of Characters iup.Append(accounts[acc].tabs, accounts[acc].log_tab) end -- Accounts -- Load the log first time --print_old() btn_eraselog=iup.button{title=L.EraseButton, FGCOLOR = "#FF0000"} function btn_eraselog:action() History_SV["Default"][myaccount]["$AccountWide"]["log"] = {} write_data() -- write new history -- Load_Log() lbl_Status_bar.title = L.Erased end -- Create dialog dlg = iup.dialog{iup.vbox{accounts[myaccount].tabs, iup.hbox{lbl_Status_bar, -- Bottom Status bar. iup.fill{}, }, margin="5x5", }, title=L.title .. myaccount, size=accounts[myaccount].panelsize } -- Shows dialog in the center of the screen dlg:showxy(iup.CENTER, iup.CENTER) if (iup.MainLoopLevel()==0) then iup.MainLoop() end