--[[ State provider for currencies ]] local ADDON_NAME, Internal = ... local External = _G[ADDON_NAME] local L = Internal.L L["CYPHER_EQUIPMENT_LEVEL_TOOLTIP_GREEN"] = CYPHER_EQUIPMENT_LEVEL_TOOLTIP:gsub("%%d", "|cFF00FF00%%d|r") L["CYPHER_EQUIPMENT_LEVEL_TOOLTIP_MATH"] = CYPHER_EQUIPMENT_LEVEL_TOOLTIP:gsub("%%d", "|cFFFFFFFF%%d + %%d|r") local CharacterDataEnum = { Level = 1, Class = 2, Race = 3, Faction = 4, Gender = 5, ItemLevel = 6, ItemLevelEquipped = 7, ItemLevelPvP = 8, Money = 9, CypherEquipmentCurrentLevel = 11, CypherEquipmentMaxLevel = 12, CypherEquipmentNextLevel = 13, } local characterDataMapIDToName = { [CharacterDataEnum.Level] = L["Level"], [CharacterDataEnum.Class] = L["Class"], [CharacterDataEnum.Race] = L["Race"], [CharacterDataEnum.Faction] = L["Faction"], [CharacterDataEnum.Gender] = L["Gender"], [CharacterDataEnum.ItemLevel] = L["Item Level (Overall)"], [CharacterDataEnum.ItemLevelEquipped] = L["Item Level (Equipped)"], [CharacterDataEnum.ItemLevelPvP] = L["Item Level (PvP)"], [CharacterDataEnum.Money] = L["Money"], [CharacterDataEnum.CypherEquipmentCurrentLevel] = L["Current Cypher Equipment Level"], [CharacterDataEnum.CypherEquipmentMaxLevel] = L["Max Cypher Equipment Level"], [CharacterDataEnum.CypherEquipmentNextLevel] = L["Cyphers to Next Equipment Level"], } local characterDataMapNameToID = {} for id,name in pairs(characterDataMapIDToName) do characterDataMapNameToID[name] = id end characterDataMapNameToID[L["Sex"]] = CharacterDataEnum.Gender characterDataMapNameToID[L["Gold"]] = CharacterDataEnum.Money local CharacterMixin = CreateFromMixins(External.StateMixin) function CharacterMixin:Init(dataID) External.StateMixin.Init(self, dataID) self.name = characterDataMapIDToName[dataID] end function CharacterMixin:GetDisplayName() return string.format(L["Character: %s"], self:GetName()) end function CharacterMixin:GetUniqueKey() return "character:" .. self:GetID() end function CharacterMixin:GetName() return self.name end function CharacterMixin:GetValue(raw) if self.id == CharacterDataEnum.Level then return self:GetCharacter():GetLevel() or 1 elseif self.id == CharacterDataEnum.Class then if raw then return self:GetCharacter():GetClass() or 0 else local data = C_CreatureInfo.GetClassInfo(self:GetCharacter():GetClass() or 0) return data and data.className or "" end elseif self.id == CharacterDataEnum.Race then if raw then return self:GetCharacter():GetRace() or 0 else local data = C_CreatureInfo.GetRaceInfo(self:GetCharacter():GetRace() or 0) return data and data.raceName or "" end elseif self.id == CharacterDataEnum.Faction then if raw then return self:GetCharacter():GetRace() or 0 else local data = C_CreatureInfo.GetFactionInfo(self:GetCharacter():GetRace() or 0) return data and data.name or "" end elseif self.id == CharacterDataEnum.Sex then local gender = self:GetCharacter():GetSex() if raw then return gender else if gender == 2 then return L["Male"] elseif gender == 3 then return L["Female"] end return "" end elseif self.id == CharacterDataEnum.ItemLevel then if raw then return self:GetCharacter():GetItemLevel() or 0 else return format("%.2f", self:GetCharacter():GetItemLevel() or 0) end elseif self.id == CharacterDataEnum.ItemLevelEquipped then if raw then return self:GetCharacter():GetItemLevelEquipped() or 0 else return format("%.2f", self:GetCharacter():GetItemLevelEquipped() or 0) end elseif self.id == CharacterDataEnum.ItemLevelPvP then if raw then return self:GetCharacter():GetItemLevelPvP() or 0 else return format("%.2f", self:GetCharacter():GetItemLevelPvP() or 0) end elseif self.id == CharacterDataEnum.Money then if raw then return self:GetCharacter():GetMoney() or 0 else return GetMoneyString(self:GetCharacter():GetMoney() or 0, true) end elseif self.id == CharacterDataEnum.CypherEquipmentCurrentLevel then return self:GetCharacter():GetCurrentCypherEquipmentLevel(); elseif self.id == CharacterDataEnum.CypherEquipmentMaxLevel then return self:GetCharacter():GetMaxCypherEquipmentLevel(); elseif self.id == CharacterDataEnum.CypherEquipmentNextLevel then return self:GetCharacter():GetCyphersToNextEquipmentLevel(); end end function CharacterMixin:RegisterEventsFor(target) local id = self:GetID() if id == CharacterDataEnum.ItemLevel or id == CharacterDataEnum.ItemLevelEquipped or id == CharacterDataEnum.ItemLevelPvP then target:RegisterEvents("PLAYER_ENTERING_WORLD", "PLAYER_AVG_ITEM_LEVEL_UPDATE") elseif id == CharacterDataEnum.Money then target:RegisterEvents("PLAYER_ENTERING_WORLD", "PLAYER_MONEY") elseif id == CharacterDataEnum.CypherEquipmentCurrentLevel or id == CharacterDataEnum.CypherEquipmentMaxLevel or id == CharacterDataEnum.CypherEquipmentNextLevel then target:RegisterEvents("CYPHER_EQUIPMENT_UPDATE", "GARRISON_TALENT_COMPLETE", "GARRISON_TALENT_UPDATE") end end local CharacterProviderMixin = CreateFromMixins(External.StateProviderMixin) function CharacterProviderMixin:GetID() return "character" end function CharacterProviderMixin:GetName() return L["Character Data"] end function CharacterProviderMixin:GetAddTitle() return string.format(BTWTODO_ADD_ITEM, self:GetName()), L["Enter the type of character data below"] end function CharacterProviderMixin:Acquire(...) return CreateAndInitFromMixin(CharacterMixin, ...) end function CharacterProviderMixin:GetFunctions() return { { name = "GetValue", returnValue = "string", }, } end function CharacterProviderMixin:GetDefaults() return {}, { -- Text {"GetValue"} } end function CharacterProviderMixin:ParseInput(value) local num = tonumber(value) if num ~= nil and characterDataMapIDToName[num] then return true, num end if characterDataMapNameToID[value] then return true, characterDataMapNameToID[value] end return false, L["Invalid character data type"] end function CharacterProviderMixin:FillAutoComplete(tbl, text, offset, length) local text = strsub(text, offset, length):lower() for value in pairs(characterDataMapNameToID) do local name = value:lower() if #name >= #text and strsub(name, offset, length) == text then tbl[#tbl+1] = value end end end Internal.RegisterStateProvider(CreateFromMixins(CharacterProviderMixin))