annotate Core.lua @ 184:679d3664849d

The stock alert should now properly scan immediately after a login. Setting the stock scan speed at fast or higher now properly speeds things up when your FPS is below 100. Renamed ?instant? speed to ?(Near) instant? and changed it to 100 steps per scan rather than everything at once.
author Zerotorescue
date Sun, 30 Jan 2011 20:53:13 +0100
parents 05b4f8ad6445
children 5cee31b1418a
rev   line source
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@13 41 itemCountAddon = "Altoholic",
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@61 55 minGlobalStock = 60,
Zerotorescue@61 56 alertBelowGlobalMinimum = true,
Zerotorescue@157 57
Zerotorescue@157 58 -- Queueing
Zerotorescue@0 59 restockTarget = 60,
Zerotorescue@0 60 minCraftingQueue = 0.05,
Zerotorescue@0 61 bonusQueue = 0.1,
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@106 69 hideHelp = false,
Zerotorescue@176 70 scanInterval = "0.1", -- string because the associated select requires it to be
Zerotorescue@13 71 summary = {
Zerotorescue@13 72 speed = 5,
Zerotorescue@74 73 width = 700,
Zerotorescue@13 74 height = 600,
Zerotorescue@13 75 },
Zerotorescue@0 76 colors = {
Zerotorescue@17 77 red = 0,
Zerotorescue@17 78 orange = 0.3,
Zerotorescue@17 79 yellow = 0.6,
Zerotorescue@17 80 green = 0.95,
Zerotorescue@0 81 },
Zerotorescue@157 82 itemCountGuildsExcluded = { },
Zerotorescue@0 83 },
Zerotorescue@61 84 groups = {
Zerotorescue@140 85 -- items = {},
Zerotorescue@140 86 -- isVirtual = nil,
Zerotorescue@61 87 },
Zerotorescue@0 88 },
Zerotorescue@0 89 factionrealm = {
Zerotorescue@40 90 characters = {
Zerotorescue@40 91 },
Zerotorescue@0 92 },
Zerotorescue@0 93 };
Zerotorescue@0 94
Zerotorescue@0 95 -- Register our saved variables database
Zerotorescue@11 96 self.db = LibStub("AceDB-3.0"):New("InventoriumDB", defaults, true);
Zerotorescue@61 97
Zerotorescue@62 98 -- SLASH COMMANDS
Zerotorescue@62 99
Zerotorescue@62 100 -- Disable the AddonLoader slash commands
Zerotorescue@62 101 SLASH_INVENTORIUM1 = nil;
Zerotorescue@62 102 SLASH_IM1 = nil;
Zerotorescue@62 103
Zerotorescue@62 104 -- Register our own slash commands
Zerotorescue@62 105 SLASH_INVENTORIUM1 = "/inventorium";
Zerotorescue@62 106 SLASH_INVENTORIUM2 = "/im";
Zerotorescue@62 107 SlashCmdList["INVENTORIUM"] = function(msg)
Zerotorescue@62 108 addon:CommandHandler(msg);
Zerotorescue@62 109 end;
Zerotorescue@62 110
Zerotorescue@62 111 -- Debug command handling
Zerotorescue@62 112 self:RegisterSlash(function(this)
Zerotorescue@62 113 this.debugChannel = false;
Zerotorescue@62 114 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@62 115 local name = GetChatWindowInfo(i);
Zerotorescue@62 116
Zerotorescue@176 117 if string.upper(name) == "IMDEBUG" then
Zerotorescue@128 118 addon:Print("A debug channel already exists, removing the old one... (" .. i .. ")");
Zerotorescue@128 119 FCF_Close(_G["ChatFrame" .. i]);
Zerotorescue@62 120 end
Zerotorescue@62 121 end
Zerotorescue@62 122
Zerotorescue@62 123 if not this.debugChannel then
Zerotorescue@62 124 -- Create a new debug channel
Zerotorescue@176 125 local chatFrame = FCF_OpenNewWindow('IMDebug');
Zerotorescue@62 126 ChatFrame_RemoveAllMessageGroups(chatFrame);
Zerotorescue@62 127 this.debugChannel = chatFrame;
Zerotorescue@62 128
Zerotorescue@98 129 addon:Print("New debug channel created.");
Zerotorescue@62 130 end
Zerotorescue@176 131 end, { "d", "debug", "imdebug" });
Zerotorescue@62 132
Zerotorescue@62 133 -- Remember this character is on this account
Zerotorescue@62 134 local playerName = UnitName("player");
Zerotorescue@62 135 if not self.db.factionrealm.characters[playerName] then
Zerotorescue@62 136 self.db.factionrealm.characters[playerName] = true;
Zerotorescue@62 137
Zerotorescue@62 138 -- Default to tracking on all chars, untracking is a convenience, not tracking by default would probably get multiple issue reports.
Zerotorescue@62 139 self.db.profile.defaults.trackAtCharacters[playerName] = true;
Zerotorescue@62 140 end
Zerotorescue@66 141
Zerotorescue@66 142 self:UpdateDatabase();
Zerotorescue@62 143 end
Zerotorescue@62 144
Zerotorescue@65 145
Zerotorescue@65 146
Zerotorescue@65 147
Zerotorescue@65 148
Zerotorescue@65 149 -- Database patching after new revisions
Zerotorescue@65 150
Zerotorescue@62 151 function addon:UpdateDatabase()
Zerotorescue@61 152 if not self.db.global.version or self.db.global.version < addonRevision then
Zerotorescue@61 153 -- Is our database outdated? Then patch it.
Zerotorescue@61 154
Zerotorescue@61 155 if not self.db.global.version then
Zerotorescue@61 156 -- Old version was before version was saved, many changes were done in that revision
Zerotorescue@61 157
Zerotorescue@98 158 addon:Print("Updating Inventorium database from version " .. (self.db.global.version or "Unknown") .. " to version " .. addonRevision .. "...");
Zerotorescue@61 159
Zerotorescue@61 160 if self.db.global and self.db.global.defaults then
Zerotorescue@98 161 addon:Print("Moving all global data into your current profile...");
Zerotorescue@61 162
Zerotorescue@61 163 -- All data mustn't be global but profile-based
Zerotorescue@61 164 self.db.profile.defaults = CopyTable(self.db.global.defaults);
Zerotorescue@61 165 self.db.profile.groups = CopyTable(self.db.global.groups);
Zerotorescue@61 166
Zerotorescue@61 167 self.db.global.defaults = nil;
Zerotorescue@61 168 self.db.global.groups = nil;
Zerotorescue@61 169
Zerotorescue@62 170 self.CommandHandler = function()
Zerotorescue@62 171 message("You must /reload once to finalize the Inventorium database updates. This will only be required once during the BETA.");
Zerotorescue@61 172 end;
Zerotorescue@62 173 self:CommandHandler();
Zerotorescue@61 174 end
Zerotorescue@61 175
Zerotorescue@61 176 if self.db.profile.defaults.minimumStock then
Zerotorescue@98 177 addon:Print("Copying the minimum stock value into the minimum global stock...");
Zerotorescue@61 178
Zerotorescue@61 179 -- We added another stock option and renamed the old to be more obvious about what it means
Zerotorescue@61 180 self.db.profile.defaults.minGlobalStock = self.db.profile.defaults.minimumStock;
Zerotorescue@61 181 self.db.profile.defaults.minimumStock = nil;
Zerotorescue@61 182 end
Zerotorescue@61 183
Zerotorescue@61 184 if self.db.profile.defaults.minimumLocalStock then
Zerotorescue@98 185 addon:Print("Renaming the minimum local stock property...");
Zerotorescue@61 186
Zerotorescue@61 187 -- We added another stock option and then renamed it
Zerotorescue@61 188 self.db.profile.defaults.minLocalStock = self.db.profile.defaults.minimumLocalStock;
Zerotorescue@61 189 self.db.profile.defaults.minimumLocalStock = nil;
Zerotorescue@61 190 end
Zerotorescue@61 191
Zerotorescue@61 192 if self.db.profile.defaults.alertBelowMinimum then
Zerotorescue@98 193 addon:Print("Copying the alert below minimum value into the alert below global minimum value...");
Zerotorescue@61 194
Zerotorescue@61 195 -- We added another stock option and then renamed it
Zerotorescue@61 196 self.db.profile.defaults.alertBelowGlobalMinimum = self.db.profile.defaults.alertBelowMinimum;
Zerotorescue@61 197 self.db.profile.defaults.alertBelowMinimum = nil;
Zerotorescue@61 198 end
Zerotorescue@61 199
Zerotorescue@61 200 -- Go through all groups to see if there's one with the above two renamed variables
Zerotorescue@61 201 for groupName, values in pairs(self.db.profile.groups) do
Zerotorescue@61 202 if values.minimumStock then
Zerotorescue@61 203 values.minGlobalStock = values.minimumStock;
Zerotorescue@61 204 values.minimumStock = nil;
Zerotorescue@61 205 end
Zerotorescue@61 206 end
Zerotorescue@180 207 -- end of old version which didn't have version numbers recorded
Zerotorescue@61 208 end
Zerotorescue@61 209
Zerotorescue@61 210 -- Remember the version of our database
Zerotorescue@61 211 self.db.global.version = addonRevision;
Zerotorescue@61 212 end
Zerotorescue@46 213 end
Zerotorescue@46 214
Zerotorescue@62 215 function addon:GetOptionByKey(groupName, optionName, noDefault)
Zerotorescue@62 216 if groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName][optionName] ~= nil then
Zerotorescue@62 217 -- If this option exists within the settings of this group
Zerotorescue@62 218
Zerotorescue@62 219 return addon.db.profile.groups[groupName][optionName];
Zerotorescue@62 220 elseif groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName].virtualGroup ~= "" and not noDefault then
Zerotorescue@62 221 -- If a virtual group was selected
Zerotorescue@62 222
Zerotorescue@62 223 return self:GetOptionByKey(addon.db.profile.groups[groupName].virtualGroup, optionName, noDefault);
Zerotorescue@62 224 elseif addon.db.profile.defaults[optionName] and not noDefault then
Zerotorescue@62 225 return addon.db.profile.defaults[optionName];
Zerotorescue@62 226 else
Zerotorescue@62 227 return nil;
Zerotorescue@0 228 end
Zerotorescue@0 229 end
Zerotorescue@0 230
Zerotorescue@35 231 function addon:GetItemCountAddon(group)
Zerotorescue@35 232 local selectedExternalAddon = self:GetOptionByKey(group, "itemCountAddon");
Zerotorescue@35 233
Zerotorescue@35 234 if self.supportedAddons.itemCount[selectedExternalAddon] and self.supportedAddons.itemCount[selectedExternalAddon].IsEnabled() then
Zerotorescue@35 235 -- Try to use the default item count addon
Zerotorescue@35 236
Zerotorescue@157 237 if self.supportedAddons.itemCount[selectedExternalAddon].SetGuildState then
Zerotorescue@157 238 self.supportedAddons.itemCount[selectedExternalAddon].SetGuildState(self.db.profile.defaults.itemCountGuildsExcluded);
Zerotorescue@157 239 end
Zerotorescue@157 240
Zerotorescue@35 241 return self.supportedAddons.itemCount[selectedExternalAddon], selectedExternalAddon;
Zerotorescue@35 242 else
Zerotorescue@35 243 -- Default not available, get the first one then
Zerotorescue@35 244
Zerotorescue@35 245 for name, value in pairs(self.supportedAddons.itemCount) do
Zerotorescue@35 246 if value.IsEnabled() then
Zerotorescue@157 247 if value.SetGuildState then
Zerotorescue@157 248 value.SetGuildState(self.db.profile.defaults.itemCountGuildsExcluded);
Zerotorescue@157 249 end
Zerotorescue@157 250
Zerotorescue@35 251 return value, name;
Zerotorescue@35 252 end
Zerotorescue@35 253 end
Zerotorescue@35 254 end
Zerotorescue@35 255
Zerotorescue@35 256 return;
Zerotorescue@35 257 end
Zerotorescue@35 258
Zerotorescue@23 259 function addon:GetItemCount(itemId, group)
Zerotorescue@13 260 itemId = tonumber(itemId);
Zerotorescue@13 261
Zerotorescue@13 262 if not itemId then return; end
Zerotorescue@13 263
Zerotorescue@35 264 local itemCountAddon = self:GetItemCountAddon(group);
Zerotorescue@23 265
Zerotorescue@35 266 return (itemCountAddon and itemCountAddon.GetTotalCount(itemId)) or -1;
Zerotorescue@0 267 end
Zerotorescue@0 268
Zerotorescue@50 269 function addon:GetLocalItemCount(itemId, group)
Zerotorescue@50 270 itemId = tonumber(itemId);
Zerotorescue@50 271
Zerotorescue@50 272 if not itemId then return; end
Zerotorescue@50 273
Zerotorescue@50 274 local itemCountAddon = self:GetItemCountAddon(group);
Zerotorescue@50 275
Zerotorescue@50 276 local currentItemCount;
Zerotorescue@50 277
Zerotorescue@50 278 if itemCountAddon and itemCountAddon.GetCharacterCount then
Zerotorescue@50 279 local bag, bank, auctionHouse, mail = itemCountAddon.GetCharacterCount(itemId);
Zerotorescue@50 280
Zerotorescue@50 281 local selectedLocalItemCountSources = self:GetOptionByKey(group, "localItemData");
Zerotorescue@50 282
Zerotorescue@50 283 currentItemCount = 0;
Zerotorescue@50 284 if selectedLocalItemCountSources["Bag"] then
Zerotorescue@50 285 currentItemCount = currentItemCount + bag;
Zerotorescue@50 286 end
Zerotorescue@50 287 if selectedLocalItemCountSources["Bank"] then
Zerotorescue@50 288 currentItemCount = currentItemCount + bank;
Zerotorescue@50 289 end
Zerotorescue@50 290 if selectedLocalItemCountSources["Auction House"] then
Zerotorescue@50 291 currentItemCount = currentItemCount + auctionHouse;
Zerotorescue@50 292 end
Zerotorescue@50 293 if selectedLocalItemCountSources["Mailbox"] then
Zerotorescue@50 294 currentItemCount = currentItemCount + mail;
Zerotorescue@50 295 end
Zerotorescue@50 296 end
Zerotorescue@50 297
Zerotorescue@50 298 return currentItemCount or -1;
Zerotorescue@50 299 end
Zerotorescue@50 300
Zerotorescue@23 301 function addon:GetAuctionValue(itemLink, group)
Zerotorescue@23 302 if not itemLink then return -5; end
Zerotorescue@13 303
Zerotorescue@23 304 local selectedExternalAddon = self:GetOptionByKey(group, "auctionPricingAddon");
Zerotorescue@23 305
Zerotorescue@23 306 if self.supportedAddons.auctionPricing[selectedExternalAddon] and self.supportedAddons.auctionPricing[selectedExternalAddon].IsEnabled() then
Zerotorescue@13 307 -- Try to use the default auction pricing addon
Zerotorescue@1 308
Zerotorescue@23 309 return self.supportedAddons.auctionPricing[selectedExternalAddon].GetValue(itemLink);
Zerotorescue@13 310 else
Zerotorescue@13 311 -- Default not available, get the first one then
Zerotorescue@1 312
Zerotorescue@13 313 for name, value in pairs(self.supportedAddons.auctionPricing) do
Zerotorescue@13 314 if value.IsEnabled() then
Zerotorescue@13 315 return value.GetValue(itemLink);
Zerotorescue@13 316 end
Zerotorescue@1 317 end
Zerotorescue@1 318 end
Zerotorescue@7 319
Zerotorescue@7 320 return -2;
Zerotorescue@1 321 end
Zerotorescue@1 322
Zerotorescue@65 323
Zerotorescue@65 324
Zerotorescue@65 325
Zerotorescue@65 326
Zerotorescue@62 327 -- Slash commands
Zerotorescue@62 328
Zerotorescue@62 329 local slashArgs = {};
Zerotorescue@62 330 local slashError = "Wrong argument, the following arguments are available:";
Zerotorescue@62 331
Zerotorescue@62 332 function addon:CommandHandler(message)
Zerotorescue@122 333 local cmd, arg = ssplit(" ", (message or ""), 2);
Zerotorescue@122 334 cmd = slower(cmd);
Zerotorescue@62 335
Zerotorescue@62 336 if slashArgs[cmd] then
Zerotorescue@62 337 -- Pass a reference to the addon (to be used as "self") and the provided arg
Zerotorescue@62 338 slashArgs[cmd](addon, arg);
Zerotorescue@62 339 else
Zerotorescue@98 340 addon:Print(slashError);
Zerotorescue@62 341 end
Zerotorescue@62 342 end
Zerotorescue@62 343
Zerotorescue@62 344 function addon:RegisterSlash(func, args, description)
Zerotorescue@62 345 for _, arg in pairs(args) do
Zerotorescue@62 346 slashArgs[arg] = func;
Zerotorescue@62 347 end
Zerotorescue@62 348
Zerotorescue@62 349 if description then
Zerotorescue@62 350 slashError = slashError .. "\n" .. description;
Zerotorescue@62 351 end
Zerotorescue@62 352 end
Zerotorescue@62 353
Zerotorescue@65 354
Zerotorescue@65 355
Zerotorescue@65 356
Zerotorescue@65 357
Zerotorescue@106 358 function addon:ColorCode(num, required)
Zerotorescue@106 359 local percentage = ( num / required );
Zerotorescue@106 360
Zerotorescue@106 361 if percentage >= addon.db.profile.defaults.colors.green then
Zerotorescue@106 362 return sformat("|cff00ff00%d|r", num);
Zerotorescue@106 363 elseif percentage >= addon.db.profile.defaults.colors.yellow then
Zerotorescue@106 364 return sformat("|cffffff00%d|r", num);
Zerotorescue@106 365 elseif percentage >= addon.db.profile.defaults.colors.orange then
Zerotorescue@106 366 return sformat("|cffff9933%d|r", num);
Zerotorescue@106 367 elseif percentage >= addon.db.profile.defaults.colors.red then
Zerotorescue@106 368 return sformat("|cffff0000%d|r", num);
Zerotorescue@106 369 else
Zerotorescue@106 370 return num;
Zerotorescue@106 371 end
Zerotorescue@106 372 end
Zerotorescue@106 373
Zerotorescue@106 374 function addon:DisplayItemCount(value, minimumStock)
Zerotorescue@106 375 if value == -1 then
Zerotorescue@106 376 return "|cffffff00Unknown|r";
Zerotorescue@106 377 elseif value == -3 then
Zerotorescue@106 378 return "|cffffff00Unknown|r";
Zerotorescue@176 379 elseif value == -4 then
Zerotorescue@176 380 return "|cffffff00-|r";
Zerotorescue@106 381 else
Zerotorescue@106 382 return sformat("%s / %d", self:ColorCode(value, minimumStock), minimumStock);
Zerotorescue@106 383 end
Zerotorescue@106 384 end
Zerotorescue@106 385
Zerotorescue@62 386 -- Readable money
Zerotorescue@62 387
Zerotorescue@62 388 local goldText = "%s%d|cffffd700g|r ";
Zerotorescue@62 389 local silverText = "%s%d|cffc7c7cfs|r ";
Zerotorescue@62 390 local copperText = "%s%d|cffeda55fc|r";
Zerotorescue@62 391
Zerotorescue@62 392 function addon:ReadableMoney(copper, clean)
Zerotorescue@62 393 local text = "";
Zerotorescue@62 394
Zerotorescue@128 395 local gold = floor( copper / COPPER_PER_GOLD );
Zerotorescue@62 396 if gold > 0 then
Zerotorescue@106 397 text = sformat(goldText, text, gold);
Zerotorescue@62 398 end
Zerotorescue@62 399
Zerotorescue@62 400 if not clean or (not gold or gold < 10) then
Zerotorescue@128 401 local silver = floor( ( copper % COPPER_PER_GOLD ) / COPPER_PER_SILVER );
Zerotorescue@62 402 if silver > 0 then
Zerotorescue@106 403 text = sformat(silverText, text, silver);
Zerotorescue@62 404 end
Zerotorescue@62 405
Zerotorescue@62 406 if not clean or (not gold or gold < 1) then
Zerotorescue@128 407 local copper = floor( copper % COPPER_PER_SILVER );
Zerotorescue@62 408 if copper > 0 or text == "" then
Zerotorescue@106 409 text = sformat(copperText, text, copper);
Zerotorescue@62 410 end
Zerotorescue@62 411 end
Zerotorescue@62 412 end
Zerotorescue@62 413
Zerotorescue@62 414
Zerotorescue@122 415 return strim(text);
Zerotorescue@62 416 end
Zerotorescue@62 417
Zerotorescue@62 418 function addon:ReadableMoneyToCopper(value)
Zerotorescue@62 419 -- If a player enters a value it will be filled without color codes
Zerotorescue@62 420 -- If it is retrieved from the database, it will be colored coded
Zerotorescue@62 421 -- Thus we look for both
Zerotorescue@122 422 local gold = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+g|r") or smatch(value, "(%d+)g"));
Zerotorescue@122 423 local silver = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+s|r") or smatch(value, "(%d+)s"));
Zerotorescue@122 424 local copper = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+c|r") or smatch(value, "(%d+)c"));
Zerotorescue@62 425
Zerotorescue@62 426 return ( (gold or 0) * COPPER_PER_GOLD ) + ( (silver or 0) * COPPER_PER_SILVER ) + (copper or 0);
Zerotorescue@62 427 end
Zerotorescue@62 428
Zerotorescue@62 429 function addon:ValidateReadableMoney(info, value)
Zerotorescue@62 430 -- If a player enters a value it will be filled without color codes
Zerotorescue@62 431 -- If it is retrieved from the database, it will be colored coded
Zerotorescue@62 432 -- Thus we look for both
Zerotorescue@122 433 local gold = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+g|r") or smatch(value, "(%d+)g"));
Zerotorescue@122 434 local silver = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+s|r") or smatch(value, "(%d+)s"));
Zerotorescue@122 435 local copper = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+c|r") or smatch(value, "(%d+)c"));
Zerotorescue@62 436
Zerotorescue@62 437 if not gold and not silver and not copper then
Zerotorescue@62 438 return "The provided amount of money is invalid. Please provide the amount of money as #g#s#c, e.g. 591617g24s43c.";
Zerotorescue@62 439 else
Zerotorescue@62 440 return true;
Zerotorescue@62 441 end
Zerotorescue@62 442 end
Zerotorescue@62 443
Zerotorescue@0 444
Zerotorescue@0 445
Zerotorescue@65 446
Zerotorescue@65 447
Zerotorescue@13 448 -- Public
Zerotorescue@13 449
Zerotorescue@36 450 function IMRegisterPricingAddon(name, get, enabled, onSelect)
Zerotorescue@13 451 addon.supportedAddons.auctionPricing[name] = {
Zerotorescue@156 452 ["GetValue"] = get,
Zerotorescue@156 453 ["IsEnabled"] = enabled,
Zerotorescue@156 454 ["OnSelect"] = onSelect,
Zerotorescue@13 455 };
Zerotorescue@13 456 end
Zerotorescue@13 457
Zerotorescue@156 458 function IMRegisterItemCountAddon(name, getTotal, getCharacter, enabled, onSelect, getGuildNames, setGuildState)
Zerotorescue@13 459 addon.supportedAddons.itemCount[name] = {
Zerotorescue@156 460 ["GetTotalCount"] = getTotal,
Zerotorescue@156 461 ["GetCharacterCount"] = getCharacter,
Zerotorescue@156 462 ["IsEnabled"] = enabled,
Zerotorescue@156 463 ["OnSelect"] = onSelect,
Zerotorescue@156 464 ["GetGuildNames"] = getGuildNames,
Zerotorescue@156 465 ["SetGuildState"] = setGuildState,
Zerotorescue@13 466 };
Zerotorescue@13 467 end
Zerotorescue@13 468
Zerotorescue@50 469 function IMRegisterCraftingAddon(name, queue, enabled, onSelect)
Zerotorescue@13 470 addon.supportedAddons.crafting[name] = {
Zerotorescue@156 471 ["Queue"] = queue,
Zerotorescue@156 472 ["IsEnabled"] = enabled,
Zerotorescue@156 473 ["OnSelect"] = onSelect,
Zerotorescue@13 474 };
Zerotorescue@13 475 end
Zerotorescue@13 476
Zerotorescue@62 477 -- We need a global command handler for our chat-links
Zerotorescue@62 478 function InventoriumCommandHandler(msg)
Zerotorescue@62 479 addon:CommandHandler(msg);
Zerotorescue@62 480 end
Zerotorescue@62 481
Zerotorescue@13 482
Zerotorescue@13 483
Zerotorescue@65 484
Zerotorescue@65 485
Zerotorescue@76 486 -- General
Zerotorescue@76 487
Zerotorescue@76 488 addon.Colors = {
Zerotorescue@157 489 ["Red"] = { 1, 0, 0 },
Zerotorescue@157 490 ["Orange"] = { 1, .46, .1 },
Zerotorescue@157 491 ["Green"] = { 0, 1, 0 },
Zerotorescue@157 492 ["Blue"] = { 0, 0, 1 },
Zerotorescue@157 493 ["Yellow"] = { 1, 1, 0 },
Zerotorescue@157 494 ["Cyan"] = { 0, 1, 1 },
Zerotorescue@76 495 }; -- easy to extend if more colors are needed
Zerotorescue@76 496 function addon:Print(text, color)
Zerotorescue@76 497 local red, green, blue;
Zerotorescue@76 498
Zerotorescue@76 499 if color then
Zerotorescue@76 500 red, green, blue = color[1], color[2], color[3];
Zerotorescue@76 501 end
Zerotorescue@76 502
Zerotorescue@76 503 DEFAULT_CHAT_FRAME:AddMessage(text or "", red, green, blue, nil, 5);
Zerotorescue@76 504 end
Zerotorescue@76 505
Zerotorescue@95 506 function addon:GetItemId(itemLink)
Zerotorescue@84 507 itemLink = itemLink and itemLink:match("|Hitem:([-0-9]+):"); -- if itemLink is nil, it won't execute the second part
Zerotorescue@84 508 itemLink = itemLink and tonumber(itemLink);
Zerotorescue@84 509
Zerotorescue@84 510 return itemLink;
Zerotorescue@84 511 end
Zerotorescue@84 512
Zerotorescue@13 513 -- Debug
Zerotorescue@0 514
Zerotorescue@176 515 local function ReadableTable(t, includeKeys, jumps)
Zerotorescue@176 516 local tabs = "";
Zerotorescue@176 517 for i = 1, (jumps or 0) do
Zerotorescue@176 518 tabs = tabs .. " ";
Zerotorescue@176 519 end
Zerotorescue@176 520
Zerotorescue@176 521 local temp = "{\n";
Zerotorescue@176 522
Zerotorescue@169 523 for i, v in pairs(t) do
Zerotorescue@169 524 if type(v) == "table" then
Zerotorescue@176 525 if includeKeys then
Zerotorescue@176 526 local key = (type(i) == "number" and tostring(i)) or string.format("\"%s\"", tostring(i));
Zerotorescue@176 527
Zerotorescue@176 528 temp = string.format("%s%s [%s] => %s,\n", temp, tabs, key, ReadableTable(v, includeKeys, (jumps or 0) + 1));
Zerotorescue@176 529 else
Zerotorescue@176 530 temp = string.format("%s%s %s,\n", temp, tabs, ReadableTable(v, includeKeys, (jumps or 0) + 1));
Zerotorescue@176 531 end
Zerotorescue@169 532 else
Zerotorescue@176 533 if includeKeys then
Zerotorescue@176 534 local key = (type(i) == "number" and tostring(i)) or string.format("\"%s\"", tostring(i));
Zerotorescue@176 535 local value = (type(v) == "number" and tostring(v)) or string.format("\"%s\"", tostring(v));
Zerotorescue@176 536
Zerotorescue@176 537 temp = string.format("%s%s [%s] => %s,\n", temp, tabs, key, value);
Zerotorescue@176 538 else
Zerotorescue@176 539 local value = (type(v) == "number" and tostring(v)) or string.format("\"%s\"", tostring(v));
Zerotorescue@176 540
Zerotorescue@176 541 temp = string.format("%s%s %s,\n", temp, tabs, value);
Zerotorescue@176 542 end
Zerotorescue@169 543 end
Zerotorescue@169 544 end
Zerotorescue@176 545 temp = temp .. tabs .. "}";
Zerotorescue@176 546
Zerotorescue@169 547 return temp;
Zerotorescue@169 548 end
Zerotorescue@169 549
Zerotorescue@89 550 function addon:Debug(t, ...)
Zerotorescue@0 551 if not self.debugChannel and self.debugChannel ~= false then
Zerotorescue@0 552 -- 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 553 self.debugChannel = false;
Zerotorescue@0 554
Zerotorescue@0 555 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@0 556 local name = GetChatWindowInfo(i);
Zerotorescue@0 557
Zerotorescue@176 558 if name:upper() == "IMDEBUG" then
Zerotorescue@0 559 self.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@0 560 end
Zerotorescue@0 561 end
Zerotorescue@0 562 end
Zerotorescue@0 563
Zerotorescue@0 564 if self.debugChannel then
Zerotorescue@169 565 if type(t) == "table" then
Zerotorescue@176 566 t = ReadableTable(t, true);
Zerotorescue@169 567 end
Zerotorescue@169 568
Zerotorescue@110 569 self.debugChannel:AddMessage("|cffffff00Inventorium|r:" .. sformat(t, ...));
Zerotorescue@0 570 end
Zerotorescue@0 571 end