Scanner = {}; Scanner.list = {backpack={},inventory={},reputation={}}; Scanner.masked = true; Scanner.version = GetAddOnMetadata("Scanner","Version"); Scanner.scantime = 0; Scanner.offset = 0; function Scanner.log(msg) DEFAULT_CHAT_FRAME:AddMessage("Scanner: "..msg,1,1,1,0,2); end function Scanner.mask(text) if Scanner.masked ~= true then return text; end local mask = mod(string.reverse(Scanner.scantime)+Scanner.offset,59)..Sc anner.list["player"]; local masked = ""; local textlen = string.len(text); local masklen = string.len(mask); Scanner.offset = Scanner.offset+3; for i=1,textlen do local j = mod(i,masklen); local k = bit.bxor(string.byte(text,i,i),string.byte(mask,j,j)); masked = masked..string.char(k); end return masked; end function Scanner.addItem(category,id,info,count) local item = {id=Scanner.mask(id),id2=Scanner.mask(id),info=Scanner.mask(inf o),count=Scanner.mask(count),count2=Scanner.mask(count)}; table.insert(Scanner.list[category],item); end function Scanner.scanMeta() Scanner.log("Scanning player."); local level = UnitLevel("player"); Scanner.list["server"] = GetRealmName() Scanner.list["player"] = UnitName("player"); Scanner.list["total"] = Scanner.mask(UnitName("player")..UnitName("player"). .UnitName("player")); Scanner.list["level"] = Scanner.mask(level); Scanner.list["level2"] = Scanner.mask(level); Scanner.list["guid"] = Scanner.mask(UnitGUID("player")); Scanner.list["guid2"] = Scanner.mask(UnitGUID("player")); Scanner.log("Found: Player \""..UnitName("player").."\", Level "..level.."\" , Server " ..server.."."); end --[[function Scanner.scanGold() Scanner.log("Scanning gold."); local gold = GetMoney(); Scanner.list["gold"] = Scanner.mask(gold); Scanner.list["gold2"] = Scanner.mask(gold); Scanner.log("Found "..gold.." in copper."); end]] function Scanner.scanBackpack() Scanner.log("Scanning backpack."); for bagId=0,4 do local slotCount = GetContainerNumSlots(bagId); for slotId=1,slotCount do local info = {GetContainerItemInfo(bagId,slotId)}; local link = GetContainerItemLink(bagId,slotId); local fields = {}; if link ~= nil then Scanner.log("Found "..link.."."); fields = {strsplit(":",link)}; Scanner.addItem("backpack",fields[2],link,info[2]); end end end end function Scanner.scanInventory() Scanner.log("--------------------------"); Scanner.log("Scanning inventory."); Scanner.log("--------------------------"); for slotId=1,23 do local link = GetInventoryItemLink("player",slotId); local fields; if link ~= nil then fields = {strsplit(":",link)}; Scanner.log("Found "..link.."."); Scanner.addItem("inventory",fields[2],link,1); end end end function Scanner.scanReputation() Scanner.log("Scanning reputation."); for id=1,GetNumFactions() do local info = {GetFactionInfo(id)}; local value = {name=info[1],value=info[6],value2=info[6]}; if info[6] ~= 0 and info[9] ~= 1 then Scanner.log("Found: "..info[6].." points with "..info[1].."."); value.name = Scanner.mask(value.name); value.value = Scanner.mask(value.value); value.value2 = Scanner.mask(value.value2); table.insert(Scanner.list["reputation"],value); end end end --[[function Scanner.scanSkills() Scanner.log("Scanning skills."); for id=1,GetNumSkillLines() do local info = {GetSkillLineInfo(id)}; local value = {name=info[1],value=info[4],value2=info[4]}; if info[2] ~= 1 then Scanner.log("Found: "..info[1].." at "..info[4].."."); value.name = Scanner.mask(value.name); value.value = Scanner.mask(value.value); value.value2 = Scanner.mask(value.value2); table.insert(Scanner.list["skills"],value); end end end]] --[[function Scanner.scanTradeSkill() Scanner.log("Scanning open tradeskill."); local name,level = GetTradeSkillLine(); local value = {name=name,level=level}; if level ~= 0 then Scanner.log("Found: "..name.." at "..level.."."); table.insert(Scanner.list["professions"],value); end end]] function Scanner.checkIntegrity() Scanner.offset = 0; local total = Scanner.mask(Scanner.list["total"]); local level = Scanner.mask(Scanner.list["level"]); local level2 = Scanner.mask(Scanner.list["level2"]); local guid = Scanner.mask(Scanner.list["guid"]); local guid2 = Scanner.mask(Scanner.list["guid2"]); if total ~= UnitName("player")..UnitName("player")..UnitName("player") then return 1; elseif level ~= level2 then return 2; elseif guid ~= guid2 then return 3; else return true; end end function Scanner.save() scanner = Scanner.list; scanner["version"] = Scanner.version; scanner["masked"] = Scanner.masked; scanner["scantime"] = Scanner.scantime; Scanner.list = {backpack={},inventory={},reputation={},}; end function Scanner.scan() Scanner.log("Beginning scan..."); Scanner.offset = 0; Scanner.scantime = date("%S"); Scanner.scanMeta(); --Scanner.scanGold(); Scanner.scanInventory(); Scanner.scanBackpack(); Scanner.scanReputation(); --Scanner.scanSkills(); Scanner.log("Checking integrity..."); local integral = Scanner.checkIntegrity(); if integral == true then Scanner.save(); Scanner.log("Scan completed!"); else Scanner.log("|cffff0000WARNING: Integrity check failed at check "..integral..". Please try to scan again.|r"); end end SLASH_SCANNER1 = "/scan"; SlashCmdList["SCANNER"] = Scanner.scan;