Zerotorescue@11
|
1 -- You can access this addon's object through: LibStub("AceAddon-3.0"):GetAddon("Inventorium")
|
Zerotorescue@17
|
2 local addon = select(2, ...);
|
Zerotorescue@17
|
3 addon = LibStub("AceAddon-3.0"):NewAddon(addon, "Inventorium", "AceEvent-3.0");
|
Zerotorescue@1
|
4
|
Zerotorescue@122
|
5 local _G = _G;
|
Zerotorescue@122
|
6 local sformat, ssplit, slower, strim, smatch = _G.string.format, _G.string.split, _G.string.lower, _G.string.trim, _G.string.match;
|
Zerotorescue@128
|
7 local floor, print, pairs, tonumber = _G.floor, _G.print, _G.pairs, _G.tonumber;
|
Zerotorescue@122
|
8
|
Zerotorescue@61
|
9 --@debug@
|
Zerotorescue@180
|
10 local addonRevision = 1; -- used to update the database whenever required
|
Zerotorescue@61
|
11 --@end-debug@
|
Zerotorescue@61
|
12 --[===[@non-debug@
|
Zerotorescue@61
|
13 local addonRevision = @project-revision@;
|
Zerotorescue@61
|
14 --@end-non-debug@]===]
|
Zerotorescue@61
|
15
|
Zerotorescue@62
|
16 -- All modules must be able to retrieve our supported addons database, thus keep it a part of the addon object rather than local
|
Zerotorescue@13
|
17 addon.supportedAddons = {};
|
Zerotorescue@13
|
18 addon.supportedAddons.auctionPricing = {};
|
Zerotorescue@13
|
19 addon.supportedAddons.itemCount = {};
|
Zerotorescue@13
|
20 addon.supportedAddons.crafting = {};
|
Zerotorescue@0
|
21
|
Zerotorescue@120
|
22 addon.Locations = {
|
Zerotorescue@120
|
23 ["Bag"] = "Bag",
|
Zerotorescue@120
|
24 ["Bank"] = "Bank",
|
Zerotorescue@120
|
25 ["Guild"] = "Guild",
|
Zerotorescue@120
|
26 ["Mailbox"] = "Mailbox",
|
Zerotorescue@120
|
27 ["Merchant"] = "Merchant",
|
Zerotorescue@120
|
28 };
|
Zerotorescue@120
|
29
|
Zerotorescue@0
|
30 function addon:OnInitialize()
|
Zerotorescue@0
|
31 -- SAVED VARIABLES
|
Zerotorescue@0
|
32
|
Zerotorescue@0
|
33 local defaults = {
|
Zerotorescue@0
|
34 global = {
|
Zerotorescue@61
|
35 version = nil,
|
Zerotorescue@61
|
36 },
|
Zerotorescue@61
|
37 profile = {
|
Zerotorescue@0
|
38 defaults = {
|
Zerotorescue@157
|
39 -- General
|
Zerotorescue@13
|
40 auctionPricingAddon = "Auctioneer",
|
Zerotorescue@192
|
41 itemCountAddon = "DataStore (with guilds)",
|
Zerotorescue@13
|
42 craftingAddon = "AdvancedTradeSkillWindow",
|
Zerotorescue@157
|
43 trackAtCharacters = { },
|
Zerotorescue@176
|
44 dontAlertAtCharacters = { },
|
Zerotorescue@157
|
45 localItemData = {
|
Zerotorescue@157
|
46 ["Bag"] = true,
|
Zerotorescue@157
|
47 ["Auction House"] = true,
|
Zerotorescue@157
|
48 },
|
Zerotorescue@157
|
49
|
Zerotorescue@157
|
50 -- Minimumm stock
|
Zerotorescue@61
|
51 minLocalStock = 20,
|
Zerotorescue@57
|
52 alertBelowLocalMinimum = true,
|
Zerotorescue@82
|
53 autoRefill = true,
|
Zerotorescue@101
|
54 autoRefillSkipConfirm = false,
|
Zerotorescue@193
|
55 minGlobalStock = 40,
|
Zerotorescue@61
|
56 alertBelowGlobalMinimum = true,
|
Zerotorescue@157
|
57
|
Zerotorescue@157
|
58 -- Queueing
|
Zerotorescue@193
|
59 restockTarget = 40,
|
Zerotorescue@0
|
60 minCraftingQueue = 0.05,
|
Zerotorescue@193
|
61 bonusQueue = 100, -- 10.000%
|
Zerotorescue@0
|
62 priceThreshold = 0,
|
Zerotorescue@157
|
63
|
Zerotorescue@157
|
64 -- Summary
|
Zerotorescue@157
|
65 summaryThresholdShow = 10,
|
Zerotorescue@13
|
66 summaryHidePriceThreshold = false,
|
Zerotorescue@157
|
67
|
Zerotorescue@157
|
68 -- Global (can't be overridden)
|
Zerotorescue@210
|
69 minimapIcon = true,
|
Zerotorescue@106
|
70 hideHelp = false,
|
Zerotorescue@176
|
71 scanInterval = "0.1", -- string because the associated select requires it to be
|
Zerotorescue@13
|
72 summary = {
|
Zerotorescue@193
|
73 speed = 20,
|
Zerotorescue@74
|
74 width = 700,
|
Zerotorescue@13
|
75 height = 600,
|
Zerotorescue@13
|
76 },
|
Zerotorescue@0
|
77 colors = {
|
Zerotorescue@17
|
78 red = 0,
|
Zerotorescue@17
|
79 orange = 0.3,
|
Zerotorescue@17
|
80 yellow = 0.6,
|
Zerotorescue@17
|
81 green = 0.95,
|
Zerotorescue@0
|
82 },
|
Zerotorescue@157
|
83 itemCountGuildsExcluded = { },
|
Zerotorescue@0
|
84 },
|
Zerotorescue@61
|
85 groups = {
|
Zerotorescue@140
|
86 -- items = {},
|
Zerotorescue@140
|
87 -- isVirtual = nil,
|
Zerotorescue@61
|
88 },
|
Zerotorescue@0
|
89 },
|
Zerotorescue@0
|
90 factionrealm = {
|
Zerotorescue@40
|
91 characters = {
|
Zerotorescue@40
|
92 },
|
Zerotorescue@0
|
93 },
|
Zerotorescue@0
|
94 };
|
Zerotorescue@0
|
95
|
Zerotorescue@0
|
96 -- Register our saved variables database
|
Zerotorescue@11
|
97 self.db = LibStub("AceDB-3.0"):New("InventoriumDB", defaults, true);
|
Zerotorescue@61
|
98
|
Zerotorescue@62
|
99 -- SLASH COMMANDS
|
Zerotorescue@62
|
100
|
Zerotorescue@62
|
101 -- Disable the AddonLoader slash commands
|
Zerotorescue@62
|
102 SLASH_INVENTORIUM1 = nil;
|
Zerotorescue@62
|
103 SLASH_IM1 = nil;
|
Zerotorescue@62
|
104
|
Zerotorescue@62
|
105 -- Register our own slash commands
|
Zerotorescue@62
|
106 SLASH_INVENTORIUM1 = "/inventorium";
|
Zerotorescue@62
|
107 SLASH_INVENTORIUM2 = "/im";
|
Zerotorescue@62
|
108 SlashCmdList["INVENTORIUM"] = function(msg)
|
Zerotorescue@62
|
109 addon:CommandHandler(msg);
|
Zerotorescue@62
|
110 end;
|
Zerotorescue@62
|
111
|
Zerotorescue@62
|
112 -- Debug command handling
|
Zerotorescue@62
|
113 self:RegisterSlash(function(this)
|
Zerotorescue@62
|
114 this.debugChannel = false;
|
Zerotorescue@62
|
115 for i = 1, NUM_CHAT_WINDOWS do
|
Zerotorescue@62
|
116 local name = GetChatWindowInfo(i);
|
Zerotorescue@62
|
117
|
Zerotorescue@176
|
118 if string.upper(name) == "IMDEBUG" then
|
Zerotorescue@128
|
119 addon:Print("A debug channel already exists, removing the old one... (" .. i .. ")");
|
Zerotorescue@128
|
120 FCF_Close(_G["ChatFrame" .. i]);
|
Zerotorescue@62
|
121 end
|
Zerotorescue@62
|
122 end
|
Zerotorescue@62
|
123
|
Zerotorescue@62
|
124 if not this.debugChannel then
|
Zerotorescue@62
|
125 -- Create a new debug channel
|
Zerotorescue@176
|
126 local chatFrame = FCF_OpenNewWindow('IMDebug');
|
Zerotorescue@62
|
127 ChatFrame_RemoveAllMessageGroups(chatFrame);
|
Zerotorescue@62
|
128 this.debugChannel = chatFrame;
|
Zerotorescue@62
|
129
|
Zerotorescue@98
|
130 addon:Print("New debug channel created.");
|
Zerotorescue@62
|
131 end
|
Zerotorescue@176
|
132 end, { "d", "debug", "imdebug" });
|
Zerotorescue@62
|
133
|
Zerotorescue@62
|
134 -- Remember this character is on this account
|
Zerotorescue@62
|
135 local playerName = UnitName("player");
|
Zerotorescue@62
|
136 if not self.db.factionrealm.characters[playerName] then
|
Zerotorescue@62
|
137 self.db.factionrealm.characters[playerName] = true;
|
Zerotorescue@62
|
138
|
Zerotorescue@62
|
139 -- Default to tracking on all chars, untracking is a convenience, not tracking by default would probably get multiple issue reports.
|
Zerotorescue@62
|
140 self.db.profile.defaults.trackAtCharacters[playerName] = true;
|
Zerotorescue@62
|
141 end
|
Zerotorescue@66
|
142
|
Zerotorescue@66
|
143 self:UpdateDatabase();
|
Zerotorescue@62
|
144 end
|
Zerotorescue@62
|
145
|
Zerotorescue@65
|
146
|
Zerotorescue@65
|
147
|
Zerotorescue@65
|
148
|
Zerotorescue@65
|
149
|
Zerotorescue@65
|
150 -- Database patching after new revisions
|
Zerotorescue@65
|
151
|
Zerotorescue@62
|
152 function addon:UpdateDatabase()
|
Zerotorescue@61
|
153 if not self.db.global.version or self.db.global.version < addonRevision then
|
Zerotorescue@61
|
154 -- Is our database outdated? Then patch it.
|
Zerotorescue@61
|
155
|
Zerotorescue@217
|
156 --[[if self.db.global.version < 1337 then
|
Zerotorescue@217
|
157 end]]
|
Zerotorescue@61
|
158
|
Zerotorescue@61
|
159 -- Remember the version of our database
|
Zerotorescue@61
|
160 self.db.global.version = addonRevision;
|
Zerotorescue@61
|
161 end
|
Zerotorescue@46
|
162 end
|
Zerotorescue@46
|
163
|
Zerotorescue@62
|
164 function addon:GetOptionByKey(groupName, optionName, noDefault)
|
Zerotorescue@62
|
165 if groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName][optionName] ~= nil then
|
Zerotorescue@62
|
166 -- If this option exists within the settings of this group
|
Zerotorescue@62
|
167
|
Zerotorescue@62
|
168 return addon.db.profile.groups[groupName][optionName];
|
Zerotorescue@62
|
169 elseif groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName].virtualGroup ~= "" and not noDefault then
|
Zerotorescue@62
|
170 -- If a virtual group was selected
|
Zerotorescue@62
|
171
|
Zerotorescue@62
|
172 return self:GetOptionByKey(addon.db.profile.groups[groupName].virtualGroup, optionName, noDefault);
|
Zerotorescue@62
|
173 elseif addon.db.profile.defaults[optionName] and not noDefault then
|
Zerotorescue@62
|
174 return addon.db.profile.defaults[optionName];
|
Zerotorescue@62
|
175 else
|
Zerotorescue@62
|
176 return nil;
|
Zerotorescue@0
|
177 end
|
Zerotorescue@0
|
178 end
|
Zerotorescue@0
|
179
|
Zerotorescue@215
|
180 local autoSelectedItemCountAddon;
|
Zerotorescue@35
|
181 function addon:GetItemCountAddon(group)
|
Zerotorescue@35
|
182 local selectedExternalAddon = self:GetOptionByKey(group, "itemCountAddon");
|
Zerotorescue@35
|
183
|
Zerotorescue@35
|
184 if self.supportedAddons.itemCount[selectedExternalAddon] and self.supportedAddons.itemCount[selectedExternalAddon].IsEnabled() then
|
Zerotorescue@35
|
185 -- Try to use the default item count addon
|
Zerotorescue@35
|
186
|
Zerotorescue@157
|
187 if self.supportedAddons.itemCount[selectedExternalAddon].SetGuildState then
|
Zerotorescue@157
|
188 self.supportedAddons.itemCount[selectedExternalAddon].SetGuildState(self.db.profile.defaults.itemCountGuildsExcluded);
|
Zerotorescue@157
|
189 end
|
Zerotorescue@157
|
190
|
Zerotorescue@35
|
191 return self.supportedAddons.itemCount[selectedExternalAddon], selectedExternalAddon;
|
Zerotorescue@215
|
192 elseif self.supportedAddons.itemCount[autoSelectedItemCountAddon] and self.supportedAddons.itemCount[autoSelectedItemCountAddon].IsEnabled() then
|
Zerotorescue@215
|
193 -- Use previously automatically selected addon
|
Zerotorescue@215
|
194
|
Zerotorescue@215
|
195 if self.supportedAddons.itemCount[autoSelectedItemCountAddon].SetGuildState then
|
Zerotorescue@215
|
196 self.supportedAddons.itemCount[autoSelectedItemCountAddon].SetGuildState(self.db.profile.defaults.itemCountGuildsExcluded);
|
Zerotorescue@215
|
197 end
|
Zerotorescue@215
|
198
|
Zerotorescue@215
|
199 return self.supportedAddons.itemCount[autoSelectedItemCountAddon], autoSelectedItemCountAddon;
|
Zerotorescue@35
|
200 else
|
Zerotorescue@35
|
201 -- Default not available, get the first one then
|
Zerotorescue@35
|
202
|
Zerotorescue@215
|
203 -- We are finding the best match, quality is used to compare everything
|
Zerotorescue@215
|
204 local altName, altValue, altQuality;
|
Zerotorescue@215
|
205
|
Zerotorescue@35
|
206 for name, value in pairs(self.supportedAddons.itemCount) do
|
Zerotorescue@35
|
207 if value.IsEnabled() then
|
Zerotorescue@215
|
208 -- Quality is based on functionality supported; TotalCount, LocalCount & GuildSelect = 3; TotalCount & LocalCount = 2, TotalCount = 1
|
Zerotorescue@215
|
209 local quality = ((value.GetTotalCount and value.GetCharacterCount and value.SetGuildState and 3) or (value.GetTotalCount and value.GetCharacterCount and 2) or (value.GetTotalCount and 1) or 0);
|
Zerotorescue@215
|
210
|
Zerotorescue@215
|
211 if quality == 3 then
|
Zerotorescue@215
|
212 -- Best quality means instant return
|
Zerotorescue@215
|
213
|
Zerotorescue@215
|
214 -- Remember this was auto selected so we don't loop again
|
Zerotorescue@215
|
215 autoSelectedItemCountAddon = name;
|
Zerotorescue@215
|
216
|
Zerotorescue@215
|
217 return value, name;
|
Zerotorescue@215
|
218 elseif not altQuality or quality > altQuality then
|
Zerotorescue@215
|
219 -- Compare quality; improvement? = overwrite
|
Zerotorescue@215
|
220 altName = name;
|
Zerotorescue@215
|
221 altValue = value;
|
Zerotorescue@215
|
222 altQuality = quality;
|
Zerotorescue@157
|
223 end
|
Zerotorescue@35
|
224 end
|
Zerotorescue@35
|
225 end
|
Zerotorescue@215
|
226
|
Zerotorescue@215
|
227 if altName and altValue and altQuality then
|
Zerotorescue@215
|
228 -- Remember this was auto selected so we don't loop again
|
Zerotorescue@215
|
229 autoSelectedItemCountAddon = altName;
|
Zerotorescue@215
|
230
|
Zerotorescue@215
|
231 return altValue, altName;
|
Zerotorescue@215
|
232 end
|
Zerotorescue@35
|
233 end
|
Zerotorescue@35
|
234
|
Zerotorescue@35
|
235 return;
|
Zerotorescue@35
|
236 end
|
Zerotorescue@35
|
237
|
Zerotorescue@23
|
238 function addon:GetItemCount(itemId, group)
|
Zerotorescue@13
|
239 itemId = tonumber(itemId);
|
Zerotorescue@13
|
240
|
Zerotorescue@13
|
241 if not itemId then return; end
|
Zerotorescue@13
|
242
|
Zerotorescue@35
|
243 local itemCountAddon = self:GetItemCountAddon(group);
|
Zerotorescue@23
|
244
|
Zerotorescue@215
|
245 return (itemCountAddon and itemCountAddon.GetTotalCount and itemCountAddon.GetTotalCount(itemId)) or -1;
|
Zerotorescue@0
|
246 end
|
Zerotorescue@0
|
247
|
Zerotorescue@50
|
248 function addon:GetLocalItemCount(itemId, group)
|
Zerotorescue@50
|
249 itemId = tonumber(itemId);
|
Zerotorescue@50
|
250
|
Zerotorescue@50
|
251 if not itemId then return; end
|
Zerotorescue@50
|
252
|
Zerotorescue@50
|
253 local itemCountAddon = self:GetItemCountAddon(group);
|
Zerotorescue@50
|
254
|
Zerotorescue@50
|
255 local currentItemCount;
|
Zerotorescue@50
|
256
|
Zerotorescue@50
|
257 if itemCountAddon and itemCountAddon.GetCharacterCount then
|
Zerotorescue@50
|
258 local bag, bank, auctionHouse, mail = itemCountAddon.GetCharacterCount(itemId);
|
Zerotorescue@50
|
259
|
Zerotorescue@50
|
260 local selectedLocalItemCountSources = self:GetOptionByKey(group, "localItemData");
|
Zerotorescue@50
|
261
|
Zerotorescue@50
|
262 currentItemCount = 0;
|
Zerotorescue@50
|
263 if selectedLocalItemCountSources["Bag"] then
|
Zerotorescue@50
|
264 currentItemCount = currentItemCount + bag;
|
Zerotorescue@50
|
265 end
|
Zerotorescue@50
|
266 if selectedLocalItemCountSources["Bank"] then
|
Zerotorescue@50
|
267 currentItemCount = currentItemCount + bank;
|
Zerotorescue@50
|
268 end
|
Zerotorescue@50
|
269 if selectedLocalItemCountSources["Auction House"] then
|
Zerotorescue@50
|
270 currentItemCount = currentItemCount + auctionHouse;
|
Zerotorescue@50
|
271 end
|
Zerotorescue@50
|
272 if selectedLocalItemCountSources["Mailbox"] then
|
Zerotorescue@50
|
273 currentItemCount = currentItemCount + mail;
|
Zerotorescue@50
|
274 end
|
Zerotorescue@50
|
275 end
|
Zerotorescue@50
|
276
|
Zerotorescue@50
|
277 return currentItemCount or -1;
|
Zerotorescue@50
|
278 end
|
Zerotorescue@50
|
279
|
Zerotorescue@23
|
280 function addon:GetAuctionValue(itemLink, group)
|
Zerotorescue@23
|
281 if not itemLink then return -5; end
|
Zerotorescue@13
|
282
|
Zerotorescue@23
|
283 local selectedExternalAddon = self:GetOptionByKey(group, "auctionPricingAddon");
|
Zerotorescue@23
|
284
|
Zerotorescue@23
|
285 if self.supportedAddons.auctionPricing[selectedExternalAddon] and self.supportedAddons.auctionPricing[selectedExternalAddon].IsEnabled() then
|
Zerotorescue@13
|
286 -- Try to use the default auction pricing addon
|
Zerotorescue@1
|
287
|
Zerotorescue@23
|
288 return self.supportedAddons.auctionPricing[selectedExternalAddon].GetValue(itemLink);
|
Zerotorescue@13
|
289 else
|
Zerotorescue@13
|
290 -- Default not available, get the first one then
|
Zerotorescue@1
|
291
|
Zerotorescue@13
|
292 for name, value in pairs(self.supportedAddons.auctionPricing) do
|
Zerotorescue@13
|
293 if value.IsEnabled() then
|
Zerotorescue@13
|
294 return value.GetValue(itemLink);
|
Zerotorescue@13
|
295 end
|
Zerotorescue@1
|
296 end
|
Zerotorescue@1
|
297 end
|
Zerotorescue@7
|
298
|
Zerotorescue@7
|
299 return -2;
|
Zerotorescue@1
|
300 end
|
Zerotorescue@1
|
301
|
Zerotorescue@65
|
302
|
Zerotorescue@65
|
303
|
Zerotorescue@65
|
304
|
Zerotorescue@65
|
305
|
Zerotorescue@62
|
306 -- Slash commands
|
Zerotorescue@62
|
307
|
Zerotorescue@62
|
308 local slashArgs = {};
|
Zerotorescue@62
|
309 local slashError = "Wrong argument, the following arguments are available:";
|
Zerotorescue@62
|
310
|
Zerotorescue@62
|
311 function addon:CommandHandler(message)
|
Zerotorescue@122
|
312 local cmd, arg = ssplit(" ", (message or ""), 2);
|
Zerotorescue@122
|
313 cmd = slower(cmd);
|
Zerotorescue@62
|
314
|
Zerotorescue@62
|
315 if slashArgs[cmd] then
|
Zerotorescue@62
|
316 -- Pass a reference to the addon (to be used as "self") and the provided arg
|
Zerotorescue@62
|
317 slashArgs[cmd](addon, arg);
|
Zerotorescue@62
|
318 else
|
Zerotorescue@98
|
319 addon:Print(slashError);
|
Zerotorescue@62
|
320 end
|
Zerotorescue@62
|
321 end
|
Zerotorescue@62
|
322
|
Zerotorescue@62
|
323 function addon:RegisterSlash(func, args, description)
|
Zerotorescue@62
|
324 for _, arg in pairs(args) do
|
Zerotorescue@62
|
325 slashArgs[arg] = func;
|
Zerotorescue@62
|
326 end
|
Zerotorescue@62
|
327
|
Zerotorescue@62
|
328 if description then
|
Zerotorescue@62
|
329 slashError = slashError .. "\n" .. description;
|
Zerotorescue@62
|
330 end
|
Zerotorescue@62
|
331 end
|
Zerotorescue@62
|
332
|
Zerotorescue@65
|
333
|
Zerotorescue@65
|
334
|
Zerotorescue@65
|
335
|
Zerotorescue@65
|
336
|
Zerotorescue@106
|
337 function addon:ColorCode(num, required)
|
Zerotorescue@106
|
338 local percentage = ( num / required );
|
Zerotorescue@106
|
339
|
Zerotorescue@106
|
340 if percentage >= addon.db.profile.defaults.colors.green then
|
Zerotorescue@106
|
341 return sformat("|cff00ff00%d|r", num);
|
Zerotorescue@106
|
342 elseif percentage >= addon.db.profile.defaults.colors.yellow then
|
Zerotorescue@106
|
343 return sformat("|cffffff00%d|r", num);
|
Zerotorescue@106
|
344 elseif percentage >= addon.db.profile.defaults.colors.orange then
|
Zerotorescue@106
|
345 return sformat("|cffff9933%d|r", num);
|
Zerotorescue@106
|
346 elseif percentage >= addon.db.profile.defaults.colors.red then
|
Zerotorescue@106
|
347 return sformat("|cffff0000%d|r", num);
|
Zerotorescue@106
|
348 else
|
Zerotorescue@106
|
349 return num;
|
Zerotorescue@106
|
350 end
|
Zerotorescue@106
|
351 end
|
Zerotorescue@106
|
352
|
Zerotorescue@106
|
353 function addon:DisplayItemCount(value, minimumStock)
|
Zerotorescue@106
|
354 if value == -1 then
|
Zerotorescue@106
|
355 return "|cffffff00Unknown|r";
|
Zerotorescue@188
|
356 elseif value == -2 then
|
Zerotorescue@188
|
357 return "|cffffff00-|r";
|
Zerotorescue@106
|
358 elseif value == -3 then
|
Zerotorescue@106
|
359 return "|cffffff00Unknown|r";
|
Zerotorescue@106
|
360 else
|
Zerotorescue@106
|
361 return sformat("%s / %d", self:ColorCode(value, minimumStock), minimumStock);
|
Zerotorescue@106
|
362 end
|
Zerotorescue@106
|
363 end
|
Zerotorescue@106
|
364
|
Zerotorescue@62
|
365 -- Readable money
|
Zerotorescue@62
|
366
|
Zerotorescue@62
|
367 local goldText = "%s%d|cffffd700g|r ";
|
Zerotorescue@62
|
368 local silverText = "%s%d|cffc7c7cfs|r ";
|
Zerotorescue@62
|
369 local copperText = "%s%d|cffeda55fc|r";
|
Zerotorescue@62
|
370
|
Zerotorescue@62
|
371 function addon:ReadableMoney(copper, clean)
|
Zerotorescue@62
|
372 local text = "";
|
Zerotorescue@62
|
373
|
Zerotorescue@128
|
374 local gold = floor( copper / COPPER_PER_GOLD );
|
Zerotorescue@62
|
375 if gold > 0 then
|
Zerotorescue@106
|
376 text = sformat(goldText, text, gold);
|
Zerotorescue@62
|
377 end
|
Zerotorescue@62
|
378
|
Zerotorescue@62
|
379 if not clean or (not gold or gold < 10) then
|
Zerotorescue@128
|
380 local silver = floor( ( copper % COPPER_PER_GOLD ) / COPPER_PER_SILVER );
|
Zerotorescue@62
|
381 if silver > 0 then
|
Zerotorescue@106
|
382 text = sformat(silverText, text, silver);
|
Zerotorescue@62
|
383 end
|
Zerotorescue@62
|
384
|
Zerotorescue@62
|
385 if not clean or (not gold or gold < 1) then
|
Zerotorescue@128
|
386 local copper = floor( copper % COPPER_PER_SILVER );
|
Zerotorescue@62
|
387 if copper > 0 or text == "" then
|
Zerotorescue@106
|
388 text = sformat(copperText, text, copper);
|
Zerotorescue@62
|
389 end
|
Zerotorescue@62
|
390 end
|
Zerotorescue@62
|
391 end
|
Zerotorescue@62
|
392
|
Zerotorescue@62
|
393
|
Zerotorescue@122
|
394 return strim(text);
|
Zerotorescue@62
|
395 end
|
Zerotorescue@62
|
396
|
Zerotorescue@62
|
397 function addon:ReadableMoneyToCopper(value)
|
Zerotorescue@62
|
398 -- If a player enters a value it will be filled without color codes
|
Zerotorescue@62
|
399 -- If it is retrieved from the database, it will be colored coded
|
Zerotorescue@62
|
400 -- Thus we look for both
|
Zerotorescue@122
|
401 local gold = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+g|r") or smatch(value, "(%d+)g"));
|
Zerotorescue@122
|
402 local silver = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+s|r") or smatch(value, "(%d+)s"));
|
Zerotorescue@122
|
403 local copper = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+c|r") or smatch(value, "(%d+)c"));
|
Zerotorescue@62
|
404
|
Zerotorescue@62
|
405 return ( (gold or 0) * COPPER_PER_GOLD ) + ( (silver or 0) * COPPER_PER_SILVER ) + (copper or 0);
|
Zerotorescue@62
|
406 end
|
Zerotorescue@62
|
407
|
Zerotorescue@62
|
408 function addon:ValidateReadableMoney(info, value)
|
Zerotorescue@62
|
409 -- If a player enters a value it will be filled without color codes
|
Zerotorescue@62
|
410 -- If it is retrieved from the database, it will be colored coded
|
Zerotorescue@62
|
411 -- Thus we look for both
|
Zerotorescue@122
|
412 local gold = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+g|r") or smatch(value, "(%d+)g"));
|
Zerotorescue@122
|
413 local silver = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+s|r") or smatch(value, "(%d+)s"));
|
Zerotorescue@122
|
414 local copper = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+c|r") or smatch(value, "(%d+)c"));
|
Zerotorescue@62
|
415
|
Zerotorescue@62
|
416 if not gold and not silver and not copper then
|
Zerotorescue@62
|
417 return "The provided amount of money is invalid. Please provide the amount of money as #g#s#c, e.g. 591617g24s43c.";
|
Zerotorescue@62
|
418 else
|
Zerotorescue@62
|
419 return true;
|
Zerotorescue@62
|
420 end
|
Zerotorescue@62
|
421 end
|
Zerotorescue@62
|
422
|
Zerotorescue@0
|
423
|
Zerotorescue@0
|
424
|
Zerotorescue@65
|
425
|
Zerotorescue@65
|
426
|
Zerotorescue@13
|
427 -- Public
|
Zerotorescue@13
|
428
|
Zerotorescue@36
|
429 function IMRegisterPricingAddon(name, get, enabled, onSelect)
|
Zerotorescue@13
|
430 addon.supportedAddons.auctionPricing[name] = {
|
Zerotorescue@156
|
431 ["GetValue"] = get,
|
Zerotorescue@156
|
432 ["IsEnabled"] = enabled,
|
Zerotorescue@156
|
433 ["OnSelect"] = onSelect,
|
Zerotorescue@13
|
434 };
|
Zerotorescue@13
|
435 end
|
Zerotorescue@13
|
436
|
Zerotorescue@156
|
437 function IMRegisterItemCountAddon(name, getTotal, getCharacter, enabled, onSelect, getGuildNames, setGuildState)
|
Zerotorescue@13
|
438 addon.supportedAddons.itemCount[name] = {
|
Zerotorescue@156
|
439 ["GetTotalCount"] = getTotal,
|
Zerotorescue@156
|
440 ["GetCharacterCount"] = getCharacter,
|
Zerotorescue@156
|
441 ["IsEnabled"] = enabled,
|
Zerotorescue@156
|
442 ["OnSelect"] = onSelect,
|
Zerotorescue@156
|
443 ["GetGuildNames"] = getGuildNames,
|
Zerotorescue@156
|
444 ["SetGuildState"] = setGuildState,
|
Zerotorescue@13
|
445 };
|
Zerotorescue@13
|
446 end
|
Zerotorescue@13
|
447
|
Zerotorescue@50
|
448 function IMRegisterCraftingAddon(name, queue, enabled, onSelect)
|
Zerotorescue@13
|
449 addon.supportedAddons.crafting[name] = {
|
Zerotorescue@156
|
450 ["Queue"] = queue,
|
Zerotorescue@156
|
451 ["IsEnabled"] = enabled,
|
Zerotorescue@156
|
452 ["OnSelect"] = onSelect,
|
Zerotorescue@13
|
453 };
|
Zerotorescue@13
|
454 end
|
Zerotorescue@13
|
455
|
Zerotorescue@62
|
456 -- We need a global command handler for our chat-links
|
Zerotorescue@62
|
457 function InventoriumCommandHandler(msg)
|
Zerotorescue@62
|
458 addon:CommandHandler(msg);
|
Zerotorescue@62
|
459 end
|
Zerotorescue@62
|
460
|
Zerotorescue@13
|
461
|
Zerotorescue@13
|
462
|
Zerotorescue@65
|
463
|
Zerotorescue@65
|
464
|
Zerotorescue@76
|
465 -- General
|
Zerotorescue@76
|
466
|
Zerotorescue@76
|
467 addon.Colors = {
|
Zerotorescue@157
|
468 ["Red"] = { 1, 0, 0 },
|
Zerotorescue@157
|
469 ["Orange"] = { 1, .46, .1 },
|
Zerotorescue@157
|
470 ["Green"] = { 0, 1, 0 },
|
Zerotorescue@157
|
471 ["Blue"] = { 0, 0, 1 },
|
Zerotorescue@157
|
472 ["Yellow"] = { 1, 1, 0 },
|
Zerotorescue@157
|
473 ["Cyan"] = { 0, 1, 1 },
|
Zerotorescue@76
|
474 }; -- easy to extend if more colors are needed
|
Zerotorescue@76
|
475 function addon:Print(text, color)
|
Zerotorescue@76
|
476 local red, green, blue;
|
Zerotorescue@76
|
477
|
Zerotorescue@76
|
478 if color then
|
Zerotorescue@76
|
479 red, green, blue = color[1], color[2], color[3];
|
Zerotorescue@76
|
480 end
|
Zerotorescue@76
|
481
|
Zerotorescue@76
|
482 DEFAULT_CHAT_FRAME:AddMessage(text or "", red, green, blue, nil, 5);
|
Zerotorescue@76
|
483 end
|
Zerotorescue@76
|
484
|
Zerotorescue@95
|
485 function addon:GetItemId(itemLink)
|
Zerotorescue@84
|
486 itemLink = itemLink and itemLink:match("|Hitem:([-0-9]+):"); -- if itemLink is nil, it won't execute the second part
|
Zerotorescue@84
|
487 itemLink = itemLink and tonumber(itemLink);
|
Zerotorescue@84
|
488
|
Zerotorescue@84
|
489 return itemLink;
|
Zerotorescue@84
|
490 end
|
Zerotorescue@84
|
491
|
Zerotorescue@13
|
492 -- Debug
|
Zerotorescue@0
|
493
|
Zerotorescue@176
|
494 local function ReadableTable(t, includeKeys, jumps)
|
Zerotorescue@176
|
495 local tabs = "";
|
Zerotorescue@176
|
496 for i = 1, (jumps or 0) do
|
Zerotorescue@176
|
497 tabs = tabs .. " ";
|
Zerotorescue@176
|
498 end
|
Zerotorescue@176
|
499
|
Zerotorescue@176
|
500 local temp = "{\n";
|
Zerotorescue@176
|
501
|
Zerotorescue@169
|
502 for i, v in pairs(t) do
|
Zerotorescue@169
|
503 if type(v) == "table" then
|
Zerotorescue@176
|
504 if includeKeys then
|
Zerotorescue@188
|
505 local key = (type(i) == "number" and tostring(i)) or sformat("\"%s\"", tostring(i));
|
Zerotorescue@176
|
506
|
Zerotorescue@188
|
507 temp = sformat("%s%s [%s] => %s,\n", temp, tabs, key, ReadableTable(v, includeKeys, (jumps or 0) + 1));
|
Zerotorescue@176
|
508 else
|
Zerotorescue@188
|
509 temp = sformat("%s%s %s,\n", temp, tabs, ReadableTable(v, includeKeys, (jumps or 0) + 1));
|
Zerotorescue@176
|
510 end
|
Zerotorescue@169
|
511 else
|
Zerotorescue@176
|
512 if includeKeys then
|
Zerotorescue@188
|
513 local key = (type(i) == "number" and tostring(i)) or sformat("\"%s\"", tostring(i));
|
Zerotorescue@188
|
514 local value = (type(v) == "number" and tostring(v)) or sformat("\"%s\"", tostring(v));
|
Zerotorescue@176
|
515
|
Zerotorescue@188
|
516 temp = sformat("%s%s [%s] => %s,\n", temp, tabs, key, value);
|
Zerotorescue@176
|
517 else
|
Zerotorescue@188
|
518 local value = (type(v) == "number" and tostring(v)) or sformat("\"%s\"", tostring(v));
|
Zerotorescue@176
|
519
|
Zerotorescue@188
|
520 temp = sformat("%s%s %s,\n", temp, tabs, value);
|
Zerotorescue@176
|
521 end
|
Zerotorescue@169
|
522 end
|
Zerotorescue@169
|
523 end
|
Zerotorescue@176
|
524 temp = temp .. tabs .. "}";
|
Zerotorescue@176
|
525
|
Zerotorescue@169
|
526 return temp;
|
Zerotorescue@169
|
527 end
|
Zerotorescue@169
|
528
|
Zerotorescue@89
|
529 function addon:Debug(t, ...)
|
Zerotorescue@0
|
530 if not self.debugChannel and self.debugChannel ~= false then
|
Zerotorescue@0
|
531 -- We want to check just once, so if you add a debug channel later just do a /reload (registering an event for this is wasted resources)
|
Zerotorescue@0
|
532 self.debugChannel = false;
|
Zerotorescue@0
|
533
|
Zerotorescue@0
|
534 for i = 1, NUM_CHAT_WINDOWS do
|
Zerotorescue@0
|
535 local name = GetChatWindowInfo(i);
|
Zerotorescue@0
|
536
|
Zerotorescue@176
|
537 if name:upper() == "IMDEBUG" then
|
Zerotorescue@0
|
538 self.debugChannel = _G["ChatFrame" .. i];
|
Zerotorescue@0
|
539 end
|
Zerotorescue@0
|
540 end
|
Zerotorescue@0
|
541 end
|
Zerotorescue@0
|
542
|
Zerotorescue@0
|
543 if self.debugChannel then
|
Zerotorescue@169
|
544 if type(t) == "table" then
|
Zerotorescue@176
|
545 t = ReadableTable(t, true);
|
Zerotorescue@169
|
546 end
|
Zerotorescue@169
|
547
|
Zerotorescue@110
|
548 self.debugChannel:AddMessage("|cffffff00Inventorium|r:" .. sformat(t, ...));
|
Zerotorescue@0
|
549 end
|
Zerotorescue@0
|
550 end
|