annotate Core.lua @ 249:fa21e06ca268 tip

Added tag v1.0.1-ALPHA for changeset 50aece0904ec
author Zerotorescue
date Tue, 08 Mar 2011 12:07:24 +0100
parents 2e4e52a589e5
children
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@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@220 61 bonusQueue = 0.1,
Zerotorescue@0 62 priceThreshold = 0,
Zerotorescue@157 63
Zerotorescue@157 64 -- Summary
Zerotorescue@220 65 summaryThresholdShow = 100, -- 10.000%
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@225 448 function IMRegisterCraftingAddon(name, queue, enabled, onSelect, onQueueStart, onQueueEnd)
Zerotorescue@13 449 addon.supportedAddons.crafting[name] = {
Zerotorescue@156 450 ["Queue"] = queue,
Zerotorescue@156 451 ["IsEnabled"] = enabled,
Zerotorescue@156 452 ["OnSelect"] = onSelect,
Zerotorescue@225 453 ["OnQueueStart"] = onQueueStart,
Zerotorescue@225 454 ["OnQueueEnd"] = onQueueEnd,
Zerotorescue@13 455 };
Zerotorescue@13 456 end
Zerotorescue@13 457
Zerotorescue@62 458 -- We need a global command handler for our chat-links
Zerotorescue@62 459 function InventoriumCommandHandler(msg)
Zerotorescue@62 460 addon:CommandHandler(msg);
Zerotorescue@62 461 end
Zerotorescue@62 462
Zerotorescue@13 463
Zerotorescue@13 464
Zerotorescue@65 465
Zerotorescue@65 466
Zerotorescue@76 467 -- General
Zerotorescue@76 468
Zerotorescue@76 469 addon.Colors = {
Zerotorescue@157 470 ["Red"] = { 1, 0, 0 },
Zerotorescue@157 471 ["Orange"] = { 1, .46, .1 },
Zerotorescue@157 472 ["Green"] = { 0, 1, 0 },
Zerotorescue@157 473 ["Blue"] = { 0, 0, 1 },
Zerotorescue@157 474 ["Yellow"] = { 1, 1, 0 },
Zerotorescue@157 475 ["Cyan"] = { 0, 1, 1 },
Zerotorescue@76 476 }; -- easy to extend if more colors are needed
Zerotorescue@76 477 function addon:Print(text, color)
Zerotorescue@76 478 local red, green, blue;
Zerotorescue@76 479
Zerotorescue@76 480 if color then
Zerotorescue@76 481 red, green, blue = color[1], color[2], color[3];
Zerotorescue@76 482 end
Zerotorescue@76 483
Zerotorescue@76 484 DEFAULT_CHAT_FRAME:AddMessage(text or "", red, green, blue, nil, 5);
Zerotorescue@76 485 end
Zerotorescue@76 486
Zerotorescue@95 487 function addon:GetItemId(itemLink)
Zerotorescue@84 488 itemLink = itemLink and itemLink:match("|Hitem:([-0-9]+):"); -- if itemLink is nil, it won't execute the second part
Zerotorescue@84 489 itemLink = itemLink and tonumber(itemLink);
Zerotorescue@84 490
Zerotorescue@84 491 return itemLink;
Zerotorescue@84 492 end
Zerotorescue@84 493
Zerotorescue@13 494 -- Debug
Zerotorescue@0 495
Zerotorescue@176 496 local function ReadableTable(t, includeKeys, jumps)
Zerotorescue@176 497 local tabs = "";
Zerotorescue@176 498 for i = 1, (jumps or 0) do
Zerotorescue@176 499 tabs = tabs .. " ";
Zerotorescue@176 500 end
Zerotorescue@176 501
Zerotorescue@176 502 local temp = "{\n";
Zerotorescue@176 503
Zerotorescue@169 504 for i, v in pairs(t) do
Zerotorescue@169 505 if type(v) == "table" then
Zerotorescue@176 506 if includeKeys then
Zerotorescue@188 507 local key = (type(i) == "number" and tostring(i)) or sformat("\"%s\"", tostring(i));
Zerotorescue@176 508
Zerotorescue@188 509 temp = sformat("%s%s [%s] => %s,\n", temp, tabs, key, ReadableTable(v, includeKeys, (jumps or 0) + 1));
Zerotorescue@176 510 else
Zerotorescue@188 511 temp = sformat("%s%s %s,\n", temp, tabs, ReadableTable(v, includeKeys, (jumps or 0) + 1));
Zerotorescue@176 512 end
Zerotorescue@169 513 else
Zerotorescue@176 514 if includeKeys then
Zerotorescue@188 515 local key = (type(i) == "number" and tostring(i)) or sformat("\"%s\"", tostring(i));
Zerotorescue@188 516 local value = (type(v) == "number" and tostring(v)) or sformat("\"%s\"", tostring(v));
Zerotorescue@176 517
Zerotorescue@188 518 temp = sformat("%s%s [%s] => %s,\n", temp, tabs, key, value);
Zerotorescue@176 519 else
Zerotorescue@188 520 local value = (type(v) == "number" and tostring(v)) or sformat("\"%s\"", tostring(v));
Zerotorescue@176 521
Zerotorescue@188 522 temp = sformat("%s%s %s,\n", temp, tabs, value);
Zerotorescue@176 523 end
Zerotorescue@169 524 end
Zerotorescue@169 525 end
Zerotorescue@176 526 temp = temp .. tabs .. "}";
Zerotorescue@176 527
Zerotorescue@169 528 return temp;
Zerotorescue@169 529 end
Zerotorescue@169 530
Zerotorescue@89 531 function addon:Debug(t, ...)
Zerotorescue@0 532 if not self.debugChannel and self.debugChannel ~= false then
Zerotorescue@0 533 -- 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 534 self.debugChannel = false;
Zerotorescue@0 535
Zerotorescue@0 536 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@0 537 local name = GetChatWindowInfo(i);
Zerotorescue@0 538
Zerotorescue@176 539 if name:upper() == "IMDEBUG" then
Zerotorescue@0 540 self.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@0 541 end
Zerotorescue@0 542 end
Zerotorescue@0 543 end
Zerotorescue@0 544
Zerotorescue@0 545 if self.debugChannel then
Zerotorescue@169 546 if type(t) == "table" then
Zerotorescue@176 547 t = ReadableTable(t, true);
Zerotorescue@169 548 end
Zerotorescue@169 549
Zerotorescue@110 550 self.debugChannel:AddMessage("|cffffff00Inventorium|r:" .. sformat(t, ...));
Zerotorescue@0 551 end
Zerotorescue@0 552 end