annotate Core.lua @ 176:26c750a10b14

Renamed Inventorium debug channel to IMDebug (so it?s easier to recognize only IM changes, not from other addons), write /im d to register this new channel. Implemented stock alerts. Added ?don?t alert at characters? option which allows you to track groups at characters without being bothered about low stock. You can change the speed of the stock alert at the extra config tab.
author Zerotorescue
date Sun, 30 Jan 2011 15:39:18 +0100
parents d367da49a490
children 38cc9221202d
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@61 10 local addonRevision = 1;
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@61 207 end
Zerotorescue@61 208
Zerotorescue@61 209 -- Remember the version of our database
Zerotorescue@61 210 self.db.global.version = addonRevision;
Zerotorescue@61 211 end
Zerotorescue@46 212 end
Zerotorescue@46 213
Zerotorescue@62 214 function addon:GetOptionByKey(groupName, optionName, noDefault)
Zerotorescue@62 215 if groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName][optionName] ~= nil then
Zerotorescue@62 216 -- If this option exists within the settings of this group
Zerotorescue@62 217
Zerotorescue@62 218 return addon.db.profile.groups[groupName][optionName];
Zerotorescue@62 219 elseif groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName].virtualGroup ~= "" and not noDefault then
Zerotorescue@62 220 -- If a virtual group was selected
Zerotorescue@62 221
Zerotorescue@62 222 return self:GetOptionByKey(addon.db.profile.groups[groupName].virtualGroup, optionName, noDefault);
Zerotorescue@62 223 elseif addon.db.profile.defaults[optionName] and not noDefault then
Zerotorescue@62 224 return addon.db.profile.defaults[optionName];
Zerotorescue@62 225 else
Zerotorescue@62 226 return nil;
Zerotorescue@0 227 end
Zerotorescue@0 228 end
Zerotorescue@0 229
Zerotorescue@35 230 function addon:GetItemCountAddon(group)
Zerotorescue@35 231 local selectedExternalAddon = self:GetOptionByKey(group, "itemCountAddon");
Zerotorescue@35 232
Zerotorescue@35 233 if self.supportedAddons.itemCount[selectedExternalAddon] and self.supportedAddons.itemCount[selectedExternalAddon].IsEnabled() then
Zerotorescue@35 234 -- Try to use the default item count addon
Zerotorescue@35 235
Zerotorescue@157 236 if self.supportedAddons.itemCount[selectedExternalAddon].SetGuildState then
Zerotorescue@157 237 self.supportedAddons.itemCount[selectedExternalAddon].SetGuildState(self.db.profile.defaults.itemCountGuildsExcluded);
Zerotorescue@157 238 end
Zerotorescue@157 239
Zerotorescue@35 240 return self.supportedAddons.itemCount[selectedExternalAddon], selectedExternalAddon;
Zerotorescue@35 241 else
Zerotorescue@35 242 -- Default not available, get the first one then
Zerotorescue@35 243
Zerotorescue@35 244 for name, value in pairs(self.supportedAddons.itemCount) do
Zerotorescue@35 245 if value.IsEnabled() then
Zerotorescue@157 246 if value.SetGuildState then
Zerotorescue@157 247 value.SetGuildState(self.db.profile.defaults.itemCountGuildsExcluded);
Zerotorescue@157 248 end
Zerotorescue@157 249
Zerotorescue@35 250 return value, name;
Zerotorescue@35 251 end
Zerotorescue@35 252 end
Zerotorescue@35 253 end
Zerotorescue@35 254
Zerotorescue@35 255 return;
Zerotorescue@35 256 end
Zerotorescue@35 257
Zerotorescue@23 258 function addon:GetItemCount(itemId, group)
Zerotorescue@13 259 itemId = tonumber(itemId);
Zerotorescue@13 260
Zerotorescue@13 261 if not itemId then return; end
Zerotorescue@13 262
Zerotorescue@35 263 local itemCountAddon = self:GetItemCountAddon(group);
Zerotorescue@23 264
Zerotorescue@35 265 return (itemCountAddon and itemCountAddon.GetTotalCount(itemId)) or -1;
Zerotorescue@0 266 end
Zerotorescue@0 267
Zerotorescue@50 268 function addon:GetLocalItemCount(itemId, group)
Zerotorescue@50 269 itemId = tonumber(itemId);
Zerotorescue@50 270
Zerotorescue@50 271 if not itemId then return; end
Zerotorescue@50 272
Zerotorescue@50 273 local itemCountAddon = self:GetItemCountAddon(group);
Zerotorescue@50 274
Zerotorescue@50 275 local currentItemCount;
Zerotorescue@50 276
Zerotorescue@50 277 if itemCountAddon and itemCountAddon.GetCharacterCount then
Zerotorescue@50 278 local bag, bank, auctionHouse, mail = itemCountAddon.GetCharacterCount(itemId);
Zerotorescue@50 279
Zerotorescue@50 280 local selectedLocalItemCountSources = self:GetOptionByKey(group, "localItemData");
Zerotorescue@50 281
Zerotorescue@50 282 currentItemCount = 0;
Zerotorescue@50 283 if selectedLocalItemCountSources["Bag"] then
Zerotorescue@50 284 currentItemCount = currentItemCount + bag;
Zerotorescue@50 285 end
Zerotorescue@50 286 if selectedLocalItemCountSources["Bank"] then
Zerotorescue@50 287 currentItemCount = currentItemCount + bank;
Zerotorescue@50 288 end
Zerotorescue@50 289 if selectedLocalItemCountSources["Auction House"] then
Zerotorescue@50 290 currentItemCount = currentItemCount + auctionHouse;
Zerotorescue@50 291 end
Zerotorescue@50 292 if selectedLocalItemCountSources["Mailbox"] then
Zerotorescue@50 293 currentItemCount = currentItemCount + mail;
Zerotorescue@50 294 end
Zerotorescue@50 295 end
Zerotorescue@50 296
Zerotorescue@50 297 return currentItemCount or -1;
Zerotorescue@50 298 end
Zerotorescue@50 299
Zerotorescue@23 300 function addon:GetAuctionValue(itemLink, group)
Zerotorescue@23 301 if not itemLink then return -5; end
Zerotorescue@13 302
Zerotorescue@23 303 local selectedExternalAddon = self:GetOptionByKey(group, "auctionPricingAddon");
Zerotorescue@23 304
Zerotorescue@23 305 if self.supportedAddons.auctionPricing[selectedExternalAddon] and self.supportedAddons.auctionPricing[selectedExternalAddon].IsEnabled() then
Zerotorescue@13 306 -- Try to use the default auction pricing addon
Zerotorescue@1 307
Zerotorescue@23 308 return self.supportedAddons.auctionPricing[selectedExternalAddon].GetValue(itemLink);
Zerotorescue@13 309 else
Zerotorescue@13 310 -- Default not available, get the first one then
Zerotorescue@1 311
Zerotorescue@13 312 for name, value in pairs(self.supportedAddons.auctionPricing) do
Zerotorescue@13 313 if value.IsEnabled() then
Zerotorescue@13 314 return value.GetValue(itemLink);
Zerotorescue@13 315 end
Zerotorescue@1 316 end
Zerotorescue@1 317 end
Zerotorescue@7 318
Zerotorescue@7 319 return -2;
Zerotorescue@1 320 end
Zerotorescue@1 321
Zerotorescue@65 322
Zerotorescue@65 323
Zerotorescue@65 324
Zerotorescue@65 325
Zerotorescue@62 326 -- Slash commands
Zerotorescue@62 327
Zerotorescue@62 328 local slashArgs = {};
Zerotorescue@62 329 local slashError = "Wrong argument, the following arguments are available:";
Zerotorescue@62 330
Zerotorescue@62 331 function addon:CommandHandler(message)
Zerotorescue@122 332 local cmd, arg = ssplit(" ", (message or ""), 2);
Zerotorescue@122 333 cmd = slower(cmd);
Zerotorescue@62 334
Zerotorescue@62 335 if slashArgs[cmd] then
Zerotorescue@62 336 -- Pass a reference to the addon (to be used as "self") and the provided arg
Zerotorescue@62 337 slashArgs[cmd](addon, arg);
Zerotorescue@62 338 else
Zerotorescue@98 339 addon:Print(slashError);
Zerotorescue@62 340 end
Zerotorescue@62 341 end
Zerotorescue@62 342
Zerotorescue@62 343 function addon:RegisterSlash(func, args, description)
Zerotorescue@62 344 for _, arg in pairs(args) do
Zerotorescue@62 345 slashArgs[arg] = func;
Zerotorescue@62 346 end
Zerotorescue@62 347
Zerotorescue@62 348 if description then
Zerotorescue@62 349 slashError = slashError .. "\n" .. description;
Zerotorescue@62 350 end
Zerotorescue@62 351 end
Zerotorescue@62 352
Zerotorescue@65 353
Zerotorescue@65 354
Zerotorescue@65 355
Zerotorescue@65 356
Zerotorescue@106 357 function addon:ColorCode(num, required)
Zerotorescue@106 358 local percentage = ( num / required );
Zerotorescue@106 359
Zerotorescue@106 360 if percentage >= addon.db.profile.defaults.colors.green then
Zerotorescue@106 361 return sformat("|cff00ff00%d|r", num);
Zerotorescue@106 362 elseif percentage >= addon.db.profile.defaults.colors.yellow then
Zerotorescue@106 363 return sformat("|cffffff00%d|r", num);
Zerotorescue@106 364 elseif percentage >= addon.db.profile.defaults.colors.orange then
Zerotorescue@106 365 return sformat("|cffff9933%d|r", num);
Zerotorescue@106 366 elseif percentage >= addon.db.profile.defaults.colors.red then
Zerotorescue@106 367 return sformat("|cffff0000%d|r", num);
Zerotorescue@106 368 else
Zerotorescue@106 369 return num;
Zerotorescue@106 370 end
Zerotorescue@106 371 end
Zerotorescue@106 372
Zerotorescue@106 373 function addon:DisplayItemCount(value, minimumStock)
Zerotorescue@106 374 if value == -1 then
Zerotorescue@106 375 return "|cffffff00Unknown|r";
Zerotorescue@106 376 elseif value == -3 then
Zerotorescue@106 377 return "|cffffff00Unknown|r";
Zerotorescue@176 378 elseif value == -4 then
Zerotorescue@176 379 return "|cffffff00-|r";
Zerotorescue@106 380 else
Zerotorescue@106 381 return sformat("%s / %d", self:ColorCode(value, minimumStock), minimumStock);
Zerotorescue@106 382 end
Zerotorescue@106 383 end
Zerotorescue@106 384
Zerotorescue@62 385 -- Readable money
Zerotorescue@62 386
Zerotorescue@62 387 local goldText = "%s%d|cffffd700g|r ";
Zerotorescue@62 388 local silverText = "%s%d|cffc7c7cfs|r ";
Zerotorescue@62 389 local copperText = "%s%d|cffeda55fc|r";
Zerotorescue@62 390
Zerotorescue@62 391 function addon:ReadableMoney(copper, clean)
Zerotorescue@62 392 local text = "";
Zerotorescue@62 393
Zerotorescue@128 394 local gold = floor( copper / COPPER_PER_GOLD );
Zerotorescue@62 395 if gold > 0 then
Zerotorescue@106 396 text = sformat(goldText, text, gold);
Zerotorescue@62 397 end
Zerotorescue@62 398
Zerotorescue@62 399 if not clean or (not gold or gold < 10) then
Zerotorescue@128 400 local silver = floor( ( copper % COPPER_PER_GOLD ) / COPPER_PER_SILVER );
Zerotorescue@62 401 if silver > 0 then
Zerotorescue@106 402 text = sformat(silverText, text, silver);
Zerotorescue@62 403 end
Zerotorescue@62 404
Zerotorescue@62 405 if not clean or (not gold or gold < 1) then
Zerotorescue@128 406 local copper = floor( copper % COPPER_PER_SILVER );
Zerotorescue@62 407 if copper > 0 or text == "" then
Zerotorescue@106 408 text = sformat(copperText, text, copper);
Zerotorescue@62 409 end
Zerotorescue@62 410 end
Zerotorescue@62 411 end
Zerotorescue@62 412
Zerotorescue@62 413
Zerotorescue@122 414 return strim(text);
Zerotorescue@62 415 end
Zerotorescue@62 416
Zerotorescue@62 417 function addon:ReadableMoneyToCopper(value)
Zerotorescue@62 418 -- If a player enters a value it will be filled without color codes
Zerotorescue@62 419 -- If it is retrieved from the database, it will be colored coded
Zerotorescue@62 420 -- Thus we look for both
Zerotorescue@122 421 local gold = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+g|r") or smatch(value, "(%d+)g"));
Zerotorescue@122 422 local silver = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+s|r") or smatch(value, "(%d+)s"));
Zerotorescue@122 423 local copper = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+c|r") or smatch(value, "(%d+)c"));
Zerotorescue@62 424
Zerotorescue@62 425 return ( (gold or 0) * COPPER_PER_GOLD ) + ( (silver or 0) * COPPER_PER_SILVER ) + (copper or 0);
Zerotorescue@62 426 end
Zerotorescue@62 427
Zerotorescue@62 428 function addon:ValidateReadableMoney(info, value)
Zerotorescue@62 429 -- If a player enters a value it will be filled without color codes
Zerotorescue@62 430 -- If it is retrieved from the database, it will be colored coded
Zerotorescue@62 431 -- Thus we look for both
Zerotorescue@122 432 local gold = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+g|r") or smatch(value, "(%d+)g"));
Zerotorescue@122 433 local silver = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+s|r") or smatch(value, "(%d+)s"));
Zerotorescue@122 434 local copper = tonumber(smatch(value, "(%d+)|c[a-fA-F0-9]+c|r") or smatch(value, "(%d+)c"));
Zerotorescue@62 435
Zerotorescue@62 436 if not gold and not silver and not copper then
Zerotorescue@62 437 return "The provided amount of money is invalid. Please provide the amount of money as #g#s#c, e.g. 591617g24s43c.";
Zerotorescue@62 438 else
Zerotorescue@62 439 return true;
Zerotorescue@62 440 end
Zerotorescue@62 441 end
Zerotorescue@62 442
Zerotorescue@0 443
Zerotorescue@0 444
Zerotorescue@65 445
Zerotorescue@65 446
Zerotorescue@13 447 -- Public
Zerotorescue@13 448
Zerotorescue@36 449 function IMRegisterPricingAddon(name, get, enabled, onSelect)
Zerotorescue@13 450 addon.supportedAddons.auctionPricing[name] = {
Zerotorescue@156 451 ["GetValue"] = get,
Zerotorescue@156 452 ["IsEnabled"] = enabled,
Zerotorescue@156 453 ["OnSelect"] = onSelect,
Zerotorescue@13 454 };
Zerotorescue@13 455 end
Zerotorescue@13 456
Zerotorescue@156 457 function IMRegisterItemCountAddon(name, getTotal, getCharacter, enabled, onSelect, getGuildNames, setGuildState)
Zerotorescue@13 458 addon.supportedAddons.itemCount[name] = {
Zerotorescue@156 459 ["GetTotalCount"] = getTotal,
Zerotorescue@156 460 ["GetCharacterCount"] = getCharacter,
Zerotorescue@156 461 ["IsEnabled"] = enabled,
Zerotorescue@156 462 ["OnSelect"] = onSelect,
Zerotorescue@156 463 ["GetGuildNames"] = getGuildNames,
Zerotorescue@156 464 ["SetGuildState"] = setGuildState,
Zerotorescue@13 465 };
Zerotorescue@13 466 end
Zerotorescue@13 467
Zerotorescue@50 468 function IMRegisterCraftingAddon(name, queue, enabled, onSelect)
Zerotorescue@13 469 addon.supportedAddons.crafting[name] = {
Zerotorescue@156 470 ["Queue"] = queue,
Zerotorescue@156 471 ["IsEnabled"] = enabled,
Zerotorescue@156 472 ["OnSelect"] = onSelect,
Zerotorescue@13 473 };
Zerotorescue@13 474 end
Zerotorescue@13 475
Zerotorescue@62 476 -- We need a global command handler for our chat-links
Zerotorescue@62 477 function InventoriumCommandHandler(msg)
Zerotorescue@62 478 addon:CommandHandler(msg);
Zerotorescue@62 479 end
Zerotorescue@62 480
Zerotorescue@13 481
Zerotorescue@13 482
Zerotorescue@65 483
Zerotorescue@65 484
Zerotorescue@76 485 -- General
Zerotorescue@76 486
Zerotorescue@76 487 addon.Colors = {
Zerotorescue@157 488 ["Red"] = { 1, 0, 0 },
Zerotorescue@157 489 ["Orange"] = { 1, .46, .1 },
Zerotorescue@157 490 ["Green"] = { 0, 1, 0 },
Zerotorescue@157 491 ["Blue"] = { 0, 0, 1 },
Zerotorescue@157 492 ["Yellow"] = { 1, 1, 0 },
Zerotorescue@157 493 ["Cyan"] = { 0, 1, 1 },
Zerotorescue@76 494 }; -- easy to extend if more colors are needed
Zerotorescue@76 495 function addon:Print(text, color)
Zerotorescue@76 496 local red, green, blue;
Zerotorescue@76 497
Zerotorescue@76 498 if color then
Zerotorescue@76 499 red, green, blue = color[1], color[2], color[3];
Zerotorescue@76 500 end
Zerotorescue@76 501
Zerotorescue@76 502 DEFAULT_CHAT_FRAME:AddMessage(text or "", red, green, blue, nil, 5);
Zerotorescue@76 503 end
Zerotorescue@76 504
Zerotorescue@95 505 function addon:GetItemId(itemLink)
Zerotorescue@84 506 itemLink = itemLink and itemLink:match("|Hitem:([-0-9]+):"); -- if itemLink is nil, it won't execute the second part
Zerotorescue@84 507 itemLink = itemLink and tonumber(itemLink);
Zerotorescue@84 508
Zerotorescue@84 509 return itemLink;
Zerotorescue@84 510 end
Zerotorescue@84 511
Zerotorescue@13 512 -- Debug
Zerotorescue@0 513
Zerotorescue@176 514 local function ReadableTable(t, includeKeys, jumps)
Zerotorescue@176 515 local tabs = "";
Zerotorescue@176 516 for i = 1, (jumps or 0) do
Zerotorescue@176 517 tabs = tabs .. " ";
Zerotorescue@176 518 end
Zerotorescue@176 519
Zerotorescue@176 520 local temp = "{\n";
Zerotorescue@176 521
Zerotorescue@169 522 for i, v in pairs(t) do
Zerotorescue@169 523 if type(v) == "table" then
Zerotorescue@176 524 if includeKeys then
Zerotorescue@176 525 local key = (type(i) == "number" and tostring(i)) or string.format("\"%s\"", tostring(i));
Zerotorescue@176 526
Zerotorescue@176 527 temp = string.format("%s%s [%s] => %s,\n", temp, tabs, key, ReadableTable(v, includeKeys, (jumps or 0) + 1));
Zerotorescue@176 528 else
Zerotorescue@176 529 temp = string.format("%s%s %s,\n", temp, tabs, ReadableTable(v, includeKeys, (jumps or 0) + 1));
Zerotorescue@176 530 end
Zerotorescue@169 531 else
Zerotorescue@176 532 if includeKeys then
Zerotorescue@176 533 local key = (type(i) == "number" and tostring(i)) or string.format("\"%s\"", tostring(i));
Zerotorescue@176 534 local value = (type(v) == "number" and tostring(v)) or string.format("\"%s\"", tostring(v));
Zerotorescue@176 535
Zerotorescue@176 536 temp = string.format("%s%s [%s] => %s,\n", temp, tabs, key, value);
Zerotorescue@176 537 else
Zerotorescue@176 538 local value = (type(v) == "number" and tostring(v)) or string.format("\"%s\"", tostring(v));
Zerotorescue@176 539
Zerotorescue@176 540 temp = string.format("%s%s %s,\n", temp, tabs, value);
Zerotorescue@176 541 end
Zerotorescue@169 542 end
Zerotorescue@169 543 end
Zerotorescue@176 544 temp = temp .. tabs .. "}";
Zerotorescue@176 545
Zerotorescue@169 546 return temp;
Zerotorescue@169 547 end
Zerotorescue@169 548
Zerotorescue@89 549 function addon:Debug(t, ...)
Zerotorescue@0 550 if not self.debugChannel and self.debugChannel ~= false then
Zerotorescue@0 551 -- 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 552 self.debugChannel = false;
Zerotorescue@0 553
Zerotorescue@0 554 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@0 555 local name = GetChatWindowInfo(i);
Zerotorescue@0 556
Zerotorescue@176 557 if name:upper() == "IMDEBUG" then
Zerotorescue@0 558 self.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@0 559 end
Zerotorescue@0 560 end
Zerotorescue@0 561 end
Zerotorescue@0 562
Zerotorescue@0 563 if self.debugChannel then
Zerotorescue@169 564 if type(t) == "table" then
Zerotorescue@176 565 t = ReadableTable(t, true);
Zerotorescue@169 566 end
Zerotorescue@169 567
Zerotorescue@110 568 self.debugChannel:AddMessage("|cffffff00Inventorium|r:" .. sformat(t, ...));
Zerotorescue@0 569 end
Zerotorescue@0 570 end