comparison Import.lua @ 70:131d9190db6b

Curseforge migration
author Nenue
date Wed, 28 Dec 2016 16:31:15 -0500
parents
children
comparison
equal deleted inserted replaced
69:b14d0611c8d9 70:131d9190db6b
1 -- KrakTool
2 -- Import.lua
3 -- Created: 7/10/2016 6:20 AM
4 -- %file-revision%
5 -- Tools for first-time setup and migration from other addons.
6
7 local kb = LibStub("LibKraken").register(KeyBinder, 'Import')
8 local print = DEVIAN_WORKSPACE and function(...) print('kbi', ...) end or function() end
9
10
11 local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544
12 local SUMMON_RANDOM_FAVORITE_MOUNT_SPELLNAME = "Summon Random Favorite Mount"
13 local results = {}
14 local importSet = setmetatable({}, {__tostring = function() return 'Global Bindings' end})
15 kb.importTypes = {}
16
17 local lineNumber = 0
18 local usedBinds, usedKeys = {}, {}
19 local profileName = ''
20 local specProfile
21 local msg = function(...) return KeyBinderImportLog:AddMessage(...) end
22
23 --- Core interfaces
24 kb.ImportScan = function()
25 -- hang onto this
26 SUMMON_RANDOM_FAVORITE_MOUNT_SPELLNAME = GetSpellInfo(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL)
27
28 local hasAnyData = false
29 for addon, module in pairs(kb.importTypes) do
30 if IsAddOnLoaded(addon) then
31 local hasData = module.GetChanges(importSet)
32 if hasData then
33 kb:print("|cFFFFFF00"..addon.." is currently enabled.")
34 end
35
36 hasAnyData = (hasData or hasAnyData)
37 end
38 end
39 if hasAnyData then
40 kb:print("You can use /skb import |cFF00FF00<AddOn Name>|r to attempt to copy settings related to this character. This will also disable that AddOn.")
41 end
42
43
44 kb.ui()
45 --KeyBinderImportLog:Show()
46
47 return importSet
48 end
49
50 kb.ImportCommmit = function(self, text)
51 kb.db.buttons = importSet.buttons
52 kb.db.bound = importSet.bound
53 kb.db.commands = importSet.commands
54 kb.db.bindings = importSet.bindings
55 kb.db.macros = importSet.macros
56 kb.db[profileName] = importSet[profileName]
57 kb.profile(profileName)
58
59
60 kb:ApplyAllBindings()
61 kb.ui()
62 kb:print('Imported settings applied! Note that you will need to change active specializations and run the command again to create their respective Char+Spec profiles.')
63 end
64
65 --- Key Scan
66 kb.importTypes.KeyBinder = {}
67 kb.importTypes.BindPad = {}
68 local kbi = kb.importTypes.KeyBinder
69 local bp = kb.importTypes.BindPad
70
71 --- BindPad import process
72 -- because bindpad doesn't store class info, it is not possible to discern the identity of primary/secondary
73
74 local GetBindPadSlot = function(profile, slot, data)
75 local actionType = data.type:lower()
76 local command = data.action:gsub('CLICK BindPadKey:%s*', '')
77 local clickAction = command:match('BindPadMacro:%s*(.+)%s*$')
78 local macroName, macroText
79 if clickAction then
80 local clickType = 'spell'
81 if clickAction == SUMMON_RANDOM_FAVORITE_MOUNT_SPELLNAME then
82 clickType = 'mount'
83 clickAction = 0
84 else
85 clickType = 'spell'
86 end
87
88 macroName, macroText, command = kb.RegisterAction(nil, clickType, clickAction)
89 profile.macros[macroName] = {macroText, command}
90 end
91 print('[|cFF00FF00'.. data.type .. '|r] |cFFFF00FF' .. data.action .. '|r :: "' .. tostring(clickAction) .. '"')
92
93 results[actionType] = (results[actionType] or 0) + 1
94 profile.buttons[slot] = {
95 command,
96 command:gsub(data.type, ''),
97 data.texture
98 }
99 profile.commands[command] = slot
100
101 if usedBinds[data.action] then
102 local key1, key2 = unpack(usedBinds[data.action])
103 print('adding keybind |cFF00FFFF' .. command .. ' |cFF00FF00' .. (key1) .. ' |cFF00FF00' .. (key2 or ''))
104 profile.bindings[key1] = command
105
106 if key2 then
107 profile.bindings[key2] = command
108 end
109
110 usedBinds[data.action] = nil
111
112 msg('|cFF00FFFF'..tostring(profile)..'|r '..slot..': ' .. '|cFF00FFFF' .. command .. '|r |cFF00FF00' .. (key1 or '') .. (key2 and ('|r, |cFF00FF00key2') or '') )
113 else
114 print('|cFFFF4400no binding|r ' .. command)
115 end
116 end
117
118 local GetBindPadProfile = function(profile, bp)
119 local bpnames = {'CharacterSpecificTab1', 'CharacterSpecificTab2', 'CharacterSpecificTab3'} -- won't need this ever again, let it fall into gc
120
121 -- resolve spec ID
122 local specID = GetSpecialization()
123 local globalID = GetSpecializationInfo(GetSpecialization())
124 local activeProfile
125
126 -- setup string coercions for debugging
127 setmetatable(profile,{__tostring = function(t) return 'Character' end})
128 if GetNumSpecGroups() > 1 then
129 local activeGroup = GetActiveSpecGroup()
130 activeProfile = bp.profileForTalentGroup[activeGroup]
131 profile[specID] = kb.InitProfile(profile[specID] or {})
132 specProfile = profile[specID]
133 setmetatable(specProfile,{__tostring = function(t) return 'Spec #'..specID end})
134 end
135
136 print('-')
137
138 results.spell = 0
139 results.macro = 0
140 results.click = 0
141 results.item = 0
142
143 table.wipe(usedBinds) -- [action] = {key1, key2}
144 table.wipe(usedKeys) -- [key] = "action"
145 for id, bpProfile in ipairs(bp) do
146
147 local slots = 0
148
149 if bpProfile.AllKeyBindings then
150 for binding, command in pairs(bpProfile.AllKeyBindings) do
151 -- each binding value
152 if not usedKeys[binding] then
153 usedKeys[binding] = command
154 end
155
156 usedBinds[command] = usedBinds[command] or {}
157 tinsert(usedBinds[command], binding)
158 end
159 end
160
161
162
163 for i, name in ipairs(bpnames) do
164 -- each tab
165 if bpProfile[name] then
166 for slot, data in pairs(bpProfile[name]) do
167 if type(data) == 'table' then
168 slots = slots + 1
169
170
171 local profile = (id == activeProfile) and specProfile or profile
172 lineNumber = lineNumber + 1
173 GetBindPadSlot(profile, slot, data)
174
175 else
176 --print(type(data), slot, data)
177 end
178 end
179 end
180 end
181 end
182 end
183
184
185 bp.GetChanges = function(importSet)
186 -- ensure that subtables are there
187 kb.InitProfile(importSet)
188 if BindPadVars then
189 local globalSlots = 0
190 for k,v in pairs(BindPadVars) do
191 --print(k, type(k))
192 if type(k) == 'string' then
193 local realm, name = k:match("^PROFILE_([%S]+)_(%S+)$")
194 if realm == kb.playerRealm and name == kb.playerName then
195 profileName = realm .. '_' .. name
196 msg('Found character profile: |cFFFFFF00'.. tostring(realm) .. '|r-|cFF00FFFF'..tostring(name)..'|r')
197 importSet[profileName] = kb.InitProfile({})
198 importSet[profileName].imported = true
199 GetBindPadProfile(importSet[profileName], v)
200 end
201 elseif type(k) == 'number' and type(v) == 'table' then
202 globalSlots = globalSlots + 1
203 GetBindPadSlot(importSet, globalSlots, v)
204 end
205 end
206 end
207
208 return results
209 end