annotate Core.lua @ 62:fee06221176f

Seperated the config from Core.lua. Many other code cleaning up for readability. Added local references for much used globals. Moved widgets to a different file for readability. Re-added global function for slash command handling since we do need it for our chat-hyperlinks. Fixed queueing to properly use the track at property of virtual groups. Fixed queueing to display the item id instead of the item link if the item link could not be loaded. Speed slider at the summary now has an interval of 1% down from 5% and rounds rather than ceils it?s value so 101% will become 100% rather than 105%. Now using the right stock properties at the summary. Added a help group to the config.
author Zerotorescue
date Wed, 22 Dec 2010 19:56:55 +0100
parents d903b0a151d3
children ac1189599769
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@61 5 --@debug@
Zerotorescue@61 6 local addonRevision = 1;
Zerotorescue@61 7 --@end-debug@
Zerotorescue@61 8 --[===[@non-debug@
Zerotorescue@61 9 local addonRevision = @project-revision@;
Zerotorescue@61 10 --@end-non-debug@]===]
Zerotorescue@61 11
Zerotorescue@62 12 local _G = _G;
Zerotorescue@62 13 local print, pairs, tonumber = _G.print, _G.pairs, _G.tonumber;
Zerotorescue@13 14
Zerotorescue@62 15 -- 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 16 addon.supportedAddons = {};
Zerotorescue@13 17 addon.supportedAddons.auctionPricing = {};
Zerotorescue@13 18 addon.supportedAddons.itemCount = {};
Zerotorescue@13 19 addon.supportedAddons.crafting = {};
Zerotorescue@0 20
Zerotorescue@0 21 function addon:OnInitialize()
Zerotorescue@0 22 self:Debug("OnInitialize");
Zerotorescue@0 23
Zerotorescue@0 24 -- SAVED VARIABLES
Zerotorescue@0 25
Zerotorescue@0 26 local defaults = {
Zerotorescue@0 27 global = {
Zerotorescue@61 28 version = nil,
Zerotorescue@61 29 },
Zerotorescue@61 30 profile = {
Zerotorescue@0 31 defaults = {
Zerotorescue@13 32 auctionPricingAddon = "Auctioneer",
Zerotorescue@13 33 itemCountAddon = "Altoholic",
Zerotorescue@13 34 craftingAddon = "AdvancedTradeSkillWindow",
Zerotorescue@61 35 minLocalStock = 20,
Zerotorescue@57 36 alertBelowLocalMinimum = true,
Zerotorescue@61 37 minGlobalStock = 60,
Zerotorescue@61 38 alertBelowGlobalMinimum = true,
Zerotorescue@0 39 summaryThresholdShow = 10,
Zerotorescue@0 40 restockTarget = 60,
Zerotorescue@0 41 minCraftingQueue = 0.05,
Zerotorescue@0 42 bonusQueue = 0.1,
Zerotorescue@0 43 priceThreshold = 0,
Zerotorescue@13 44 summaryHidePriceThreshold = false,
Zerotorescue@40 45 trackAtCharacters = {
Zerotorescue@40 46 },
Zerotorescue@31 47 localItemData = {
Zerotorescue@31 48 ["Bag"] = true,
Zerotorescue@31 49 ["Auction House"] = true,
Zerotorescue@31 50 },
Zerotorescue@13 51 summary = {
Zerotorescue@13 52 speed = 5,
Zerotorescue@13 53 width = 650,
Zerotorescue@13 54 height = 600,
Zerotorescue@13 55 },
Zerotorescue@0 56 colors = {
Zerotorescue@17 57 red = 0,
Zerotorescue@17 58 orange = 0.3,
Zerotorescue@17 59 yellow = 0.6,
Zerotorescue@17 60 green = 0.95,
Zerotorescue@0 61 },
Zerotorescue@0 62 },
Zerotorescue@61 63 groups = {
Zerotorescue@61 64 },
Zerotorescue@0 65 },
Zerotorescue@0 66 factionrealm = {
Zerotorescue@40 67 characters = {
Zerotorescue@40 68 },
Zerotorescue@0 69 },
Zerotorescue@0 70 };
Zerotorescue@0 71
Zerotorescue@0 72 -- Register our saved variables database
Zerotorescue@11 73 self.db = LibStub("AceDB-3.0"):New("InventoriumDB", defaults, true);
Zerotorescue@61 74
Zerotorescue@62 75 -- SLASH COMMANDS
Zerotorescue@62 76
Zerotorescue@62 77 -- Disable the AddonLoader slash commands
Zerotorescue@62 78 SLASH_INVENTORIUM1 = nil;
Zerotorescue@62 79 SLASH_IM1 = nil;
Zerotorescue@62 80
Zerotorescue@62 81 -- Register our own slash commands
Zerotorescue@62 82 SLASH_INVENTORIUM1 = "/inventorium";
Zerotorescue@62 83 SLASH_INVENTORIUM2 = "/im";
Zerotorescue@62 84 SlashCmdList["INVENTORIUM"] = function(msg)
Zerotorescue@62 85 addon:CommandHandler(msg);
Zerotorescue@62 86 end;
Zerotorescue@62 87
Zerotorescue@62 88 -- Debug command handling
Zerotorescue@62 89 self:RegisterSlash(function(this)
Zerotorescue@62 90 this.debugChannel = false;
Zerotorescue@62 91 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@62 92 local name = GetChatWindowInfo(i);
Zerotorescue@62 93
Zerotorescue@62 94 if name:upper() == "DEBUG" then
Zerotorescue@62 95 this.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@62 96
Zerotorescue@62 97 print("A debug channel already exists, used the old one. (" .. i .. ")");
Zerotorescue@62 98 return;
Zerotorescue@62 99 end
Zerotorescue@62 100 end
Zerotorescue@62 101
Zerotorescue@62 102 if not this.debugChannel then
Zerotorescue@62 103 -- Create a new debug channel
Zerotorescue@62 104 local chatFrame = FCF_OpenNewWindow('Debug');
Zerotorescue@62 105 ChatFrame_RemoveAllMessageGroups(chatFrame);
Zerotorescue@62 106 this.debugChannel = chatFrame;
Zerotorescue@62 107
Zerotorescue@62 108 print("New debug channel created.");
Zerotorescue@62 109 end
Zerotorescue@62 110 end, { "d", "debug" });
Zerotorescue@62 111
Zerotorescue@62 112 -- Remember this character is on this account
Zerotorescue@62 113 local playerName = UnitName("player");
Zerotorescue@62 114 if not self.db.factionrealm.characters[playerName] then
Zerotorescue@62 115 self.db.factionrealm.characters[playerName] = true;
Zerotorescue@62 116
Zerotorescue@62 117 -- Default to tracking on all chars, untracking is a convenience, not tracking by default would probably get multiple issue reports.
Zerotorescue@62 118 self.db.profile.defaults.trackAtCharacters[playerName] = true;
Zerotorescue@62 119 end
Zerotorescue@62 120
Zerotorescue@62 121 self:PremadeGroupsCheck();
Zerotorescue@62 122 end
Zerotorescue@62 123
Zerotorescue@62 124 function addon:UpdateDatabase()
Zerotorescue@61 125 if not self.db.global.version or self.db.global.version < addonRevision then
Zerotorescue@61 126 -- Is our database outdated? Then patch it.
Zerotorescue@61 127
Zerotorescue@61 128 if not self.db.global.version then
Zerotorescue@61 129 -- Old version was before version was saved, many changes were done in that revision
Zerotorescue@61 130
Zerotorescue@61 131 print("Updating Inventorium database from version " .. (self.db.global.version or "Unknown") .. " to version " .. addonRevision .. "...");
Zerotorescue@61 132
Zerotorescue@61 133 if self.db.global and self.db.global.defaults then
Zerotorescue@61 134 print("Moving all global data into your current profile...");
Zerotorescue@61 135
Zerotorescue@61 136 -- All data mustn't be global but profile-based
Zerotorescue@61 137 self.db.profile.defaults = CopyTable(self.db.global.defaults);
Zerotorescue@61 138 self.db.profile.groups = CopyTable(self.db.global.groups);
Zerotorescue@61 139
Zerotorescue@61 140 self.db.global.defaults = nil;
Zerotorescue@61 141 self.db.global.groups = nil;
Zerotorescue@61 142
Zerotorescue@62 143 self.CommandHandler = function()
Zerotorescue@62 144 message("You must /reload once to finalize the Inventorium database updates. This will only be required once during the BETA.");
Zerotorescue@61 145 end;
Zerotorescue@62 146 self:CommandHandler();
Zerotorescue@61 147 end
Zerotorescue@61 148
Zerotorescue@61 149 if self.db.profile.defaults.minimumStock then
Zerotorescue@61 150 print("Copying the minimum stock value into the minimum global stock...");
Zerotorescue@61 151
Zerotorescue@61 152 -- We added another stock option and renamed the old to be more obvious about what it means
Zerotorescue@61 153 self.db.profile.defaults.minGlobalStock = self.db.profile.defaults.minimumStock;
Zerotorescue@61 154 self.db.profile.defaults.minimumStock = nil;
Zerotorescue@61 155 end
Zerotorescue@61 156
Zerotorescue@61 157 if self.db.profile.defaults.minimumLocalStock then
Zerotorescue@61 158 print("Renaming the minimum local stock property...");
Zerotorescue@61 159
Zerotorescue@61 160 -- We added another stock option and then renamed it
Zerotorescue@61 161 self.db.profile.defaults.minLocalStock = self.db.profile.defaults.minimumLocalStock;
Zerotorescue@61 162 self.db.profile.defaults.minimumLocalStock = nil;
Zerotorescue@61 163 end
Zerotorescue@61 164
Zerotorescue@61 165 if self.db.profile.defaults.alertBelowMinimum then
Zerotorescue@61 166 print("Copying the alert below minimum value into the alert below global minimum value...");
Zerotorescue@61 167
Zerotorescue@61 168 -- We added another stock option and then renamed it
Zerotorescue@61 169 self.db.profile.defaults.alertBelowGlobalMinimum = self.db.profile.defaults.alertBelowMinimum;
Zerotorescue@61 170 self.db.profile.defaults.alertBelowMinimum = nil;
Zerotorescue@61 171 end
Zerotorescue@61 172
Zerotorescue@61 173 -- Go through all groups to see if there's one with the above two renamed variables
Zerotorescue@61 174 for groupName, values in pairs(self.db.profile.groups) do
Zerotorescue@61 175 if values.minimumStock then
Zerotorescue@61 176 values.minGlobalStock = values.minimumStock;
Zerotorescue@61 177 values.minimumStock = nil;
Zerotorescue@61 178 end
Zerotorescue@61 179 end
Zerotorescue@61 180 end
Zerotorescue@61 181
Zerotorescue@61 182 -- Remember the version of our database
Zerotorescue@61 183 self.db.global.version = addonRevision;
Zerotorescue@61 184 end
Zerotorescue@46 185 end
Zerotorescue@46 186
Zerotorescue@23 187 function addon:PremadeGroupsCheck(updateGroupName, updateKey, accept)
Zerotorescue@23 188 -- Compare the current premade groups with those used, notify about changes
Zerotorescue@23 189 if addon.defaultGroups then
Zerotorescue@46 190 for premadeGroupName, groupInfo in pairs(addon.defaultGroups) do
Zerotorescue@23 191 -- Go through all default groups
Zerotorescue@23 192
Zerotorescue@61 193 for groupName, values in pairs(addon.db.profile.groups) do
Zerotorescue@23 194 -- Go through all groups to find those with this premade group
Zerotorescue@23 195
Zerotorescue@46 196 if values.premadeGroups and values.premadeGroups[premadeGroupName] and values.premadeGroups[premadeGroupName] < groupInfo.version then
Zerotorescue@23 197 -- Outdated group
Zerotorescue@23 198
Zerotorescue@23 199 if updateGroupName and updateKey then
Zerotorescue@23 200 -- This function was called after pressing yes or no in a confirm box
Zerotorescue@23 201
Zerotorescue@23 202 if accept then
Zerotorescue@23 203 -- Yes was clicked
Zerotorescue@23 204
Zerotorescue@23 205 for itemId, version in pairs(groupInfo.items) do
Zerotorescue@23 206 -- Go through all items in this premade group
Zerotorescue@23 207
Zerotorescue@46 208 if version > values.premadeGroups[premadeGroupName] then
Zerotorescue@23 209 -- This item was added in a more recent version than this group: Add item
Zerotorescue@23 210
Zerotorescue@62 211 if self:InGroup(itemId) then
Zerotorescue@62 212 print(("Skipping %s (#%d) as it is already in the group |cfffed000%s|r."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, self:InGroup(itemId)));
Zerotorescue@62 213 elseif self:AddItemToGroup(groupName, itemId) then
Zerotorescue@62 214 print(("|cff00ff00Added|r %s (#%d) found in the premade group |cfffed000%s|r to the group |cfffed000%s|r."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, premadeGroupName, self:InGroup(itemId)));
Zerotorescue@46 215 end
Zerotorescue@46 216 elseif ( version * -1 ) > values.premadeGroups[premadeGroupName] then
Zerotorescue@62 217 if self:InGroup(itemId) == groupName then
Zerotorescue@62 218 print(("|cffff0000Removed|r %s (#%d) from the group |cfffed000%s|r as it was removed from the premade group |cfffed000%s|r."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, self:InGroup(itemId), premadeGroupName));
Zerotorescue@62 219 self:RemoveItemFromGroup(groupName, itemId);
Zerotorescue@46 220 else
Zerotorescue@62 221 print(("Skipping the removal of %s (#%d) as it isn't in this group."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, self:InGroup(itemId)));
Zerotorescue@23 222 end
Zerotorescue@23 223 end
Zerotorescue@23 224 end
Zerotorescue@23 225
Zerotorescue@23 226 -- Remember the new version
Zerotorescue@46 227 values.premadeGroups[premadeGroupName] = groupInfo.version;
Zerotorescue@23 228 else
Zerotorescue@23 229 -- No was clicked
Zerotorescue@23 230
Zerotorescue@23 231 -- Let user know what was not added
Zerotorescue@23 232 for itemId, version in pairs(groupInfo.items) do
Zerotorescue@23 233 -- Go through all items in this premade group
Zerotorescue@23 234
Zerotorescue@46 235 if version > values.premadeGroups[premadeGroupName] then
Zerotorescue@23 236 -- This item was added in a more recent version than this group: don't add (since we clicked no), but announce it
Zerotorescue@23 237
Zerotorescue@62 238 print(("Skipping %s (#%d) found in the premade group |cfffed000%s|r."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, self:InGroup(itemId)));
Zerotorescue@23 239 end
Zerotorescue@23 240 end
Zerotorescue@23 241
Zerotorescue@23 242 -- Remember the new version
Zerotorescue@46 243 values.premadeGroups[premadeGroupName] = groupInfo.version;
Zerotorescue@23 244 end
Zerotorescue@23 245 else
Zerotorescue@23 246 StaticPopupDialogs["InventoriumConfirmUpdatePremadeGroup"] = {
Zerotorescue@23 247 text = "The premade group |cfffed000%s|r used in the group |cfffed000%s|r has been changed. Do you wish to copy these changes?",
Zerotorescue@23 248 button1 = YES,
Zerotorescue@23 249 button2 = NO,
Zerotorescue@23 250 OnAccept = function(self)
Zerotorescue@46 251 addon:PremadeGroupsCheck(groupName, premadeGroupName, true);
Zerotorescue@23 252 end,
Zerotorescue@23 253 OnCancel = function(self, _, reason)
Zerotorescue@23 254 if reason == "clicked" then
Zerotorescue@46 255 addon:PremadeGroupsCheck(groupName, premadeGroupName, false);
Zerotorescue@23 256 end
Zerotorescue@23 257 end,
Zerotorescue@23 258 timeout = 0,
Zerotorescue@23 259 whileDead = 1,
Zerotorescue@23 260 hideOnEscape = 1,
Zerotorescue@23 261 };
Zerotorescue@46 262 StaticPopup_Show("InventoriumConfirmUpdatePremadeGroup", premadeGroupName, groupName);
Zerotorescue@23 263
Zerotorescue@23 264 return;
Zerotorescue@23 265 end
Zerotorescue@23 266 end
Zerotorescue@23 267 end
Zerotorescue@23 268 end
Zerotorescue@23 269 end
Zerotorescue@23 270 end
Zerotorescue@23 271
Zerotorescue@0 272 function addon:GetItemId(itemLink)
Zerotorescue@13 273 itemLink = itemLink and itemLink:match("|Hitem:([-0-9]+):"); -- if itemLink is nil, it won't execute the second part
Zerotorescue@0 274 itemLink = itemLink and tonumber(itemLink);
Zerotorescue@0 275
Zerotorescue@0 276 return itemLink;
Zerotorescue@0 277 end
Zerotorescue@0 278
Zerotorescue@62 279 function addon:GetOptionByKey(groupName, optionName, noDefault)
Zerotorescue@62 280 if groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName][optionName] ~= nil then
Zerotorescue@62 281 -- If this option exists within the settings of this group
Zerotorescue@62 282
Zerotorescue@62 283 return addon.db.profile.groups[groupName][optionName];
Zerotorescue@62 284 elseif groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName].virtualGroup ~= "" and not noDefault then
Zerotorescue@62 285 -- If a virtual group was selected
Zerotorescue@62 286
Zerotorescue@62 287 return self:GetOptionByKey(addon.db.profile.groups[groupName].virtualGroup, optionName, noDefault);
Zerotorescue@62 288 elseif addon.db.profile.defaults[optionName] and not noDefault then
Zerotorescue@62 289 return addon.db.profile.defaults[optionName];
Zerotorescue@62 290 else
Zerotorescue@62 291 return nil;
Zerotorescue@0 292 end
Zerotorescue@0 293 end
Zerotorescue@0 294
Zerotorescue@35 295 function addon:GetItemCountAddon(group)
Zerotorescue@35 296 local selectedExternalAddon = self:GetOptionByKey(group, "itemCountAddon");
Zerotorescue@35 297
Zerotorescue@35 298 if self.supportedAddons.itemCount[selectedExternalAddon] and self.supportedAddons.itemCount[selectedExternalAddon].IsEnabled() then
Zerotorescue@35 299 -- Try to use the default item count addon
Zerotorescue@35 300
Zerotorescue@35 301 return self.supportedAddons.itemCount[selectedExternalAddon], selectedExternalAddon;
Zerotorescue@35 302 else
Zerotorescue@35 303 -- Default not available, get the first one then
Zerotorescue@35 304
Zerotorescue@35 305 for name, value in pairs(self.supportedAddons.itemCount) do
Zerotorescue@35 306 if value.IsEnabled() then
Zerotorescue@35 307 return value, name;
Zerotorescue@35 308 end
Zerotorescue@35 309 end
Zerotorescue@35 310 end
Zerotorescue@35 311
Zerotorescue@35 312 return;
Zerotorescue@35 313 end
Zerotorescue@35 314
Zerotorescue@23 315 function addon:GetItemCount(itemId, group)
Zerotorescue@13 316 itemId = tonumber(itemId);
Zerotorescue@13 317
Zerotorescue@13 318 if not itemId then return; end
Zerotorescue@13 319
Zerotorescue@35 320 local itemCountAddon = self:GetItemCountAddon(group);
Zerotorescue@23 321
Zerotorescue@35 322 return (itemCountAddon and itemCountAddon.GetTotalCount(itemId)) or -1;
Zerotorescue@0 323 end
Zerotorescue@0 324
Zerotorescue@50 325 function addon:GetLocalItemCount(itemId, group)
Zerotorescue@50 326 itemId = tonumber(itemId);
Zerotorescue@50 327
Zerotorescue@50 328 if not itemId then return; end
Zerotorescue@50 329
Zerotorescue@50 330 local itemCountAddon = self:GetItemCountAddon(group);
Zerotorescue@50 331
Zerotorescue@50 332 local currentItemCount;
Zerotorescue@50 333
Zerotorescue@50 334 if itemCountAddon and itemCountAddon.GetCharacterCount then
Zerotorescue@50 335 local bag, bank, auctionHouse, mail = itemCountAddon.GetCharacterCount(itemId);
Zerotorescue@50 336
Zerotorescue@50 337 local selectedLocalItemCountSources = self:GetOptionByKey(group, "localItemData");
Zerotorescue@50 338
Zerotorescue@50 339 currentItemCount = 0;
Zerotorescue@50 340 if selectedLocalItemCountSources["Bag"] then
Zerotorescue@50 341 currentItemCount = currentItemCount + bag;
Zerotorescue@50 342 end
Zerotorescue@50 343 if selectedLocalItemCountSources["Bank"] then
Zerotorescue@50 344 currentItemCount = currentItemCount + bank;
Zerotorescue@50 345 end
Zerotorescue@50 346 if selectedLocalItemCountSources["Auction House"] then
Zerotorescue@50 347 currentItemCount = currentItemCount + auctionHouse;
Zerotorescue@50 348 end
Zerotorescue@50 349 if selectedLocalItemCountSources["Mailbox"] then
Zerotorescue@50 350 currentItemCount = currentItemCount + mail;
Zerotorescue@50 351 end
Zerotorescue@50 352 end
Zerotorescue@50 353
Zerotorescue@50 354 return currentItemCount or -1;
Zerotorescue@50 355 end
Zerotorescue@50 356
Zerotorescue@23 357 function addon:GetAuctionValue(itemLink, group)
Zerotorescue@23 358 if not itemLink then return -5; end
Zerotorescue@13 359
Zerotorescue@23 360 local selectedExternalAddon = self:GetOptionByKey(group, "auctionPricingAddon");
Zerotorescue@23 361
Zerotorescue@23 362 if self.supportedAddons.auctionPricing[selectedExternalAddon] and self.supportedAddons.auctionPricing[selectedExternalAddon].IsEnabled() then
Zerotorescue@13 363 -- Try to use the default auction pricing addon
Zerotorescue@1 364
Zerotorescue@23 365 return self.supportedAddons.auctionPricing[selectedExternalAddon].GetValue(itemLink);
Zerotorescue@13 366 else
Zerotorescue@13 367 -- Default not available, get the first one then
Zerotorescue@1 368
Zerotorescue@13 369 for name, value in pairs(self.supportedAddons.auctionPricing) do
Zerotorescue@13 370 if value.IsEnabled() then
Zerotorescue@13 371 return value.GetValue(itemLink);
Zerotorescue@13 372 end
Zerotorescue@1 373 end
Zerotorescue@1 374 end
Zerotorescue@7 375
Zerotorescue@7 376 return -2;
Zerotorescue@1 377 end
Zerotorescue@1 378
Zerotorescue@62 379 -- Slash commands
Zerotorescue@62 380
Zerotorescue@62 381 local slashArgs = {};
Zerotorescue@62 382 local slashError = "Wrong argument, the following arguments are available:";
Zerotorescue@62 383
Zerotorescue@62 384 function addon:CommandHandler(message)
Zerotorescue@62 385 local cmd, arg = string.split(" ", (message or ""), 2);
Zerotorescue@62 386 cmd = string.lower(cmd);
Zerotorescue@62 387
Zerotorescue@62 388 if slashArgs[cmd] then
Zerotorescue@62 389 -- Pass a reference to the addon (to be used as "self") and the provided arg
Zerotorescue@62 390 slashArgs[cmd](addon, arg);
Zerotorescue@62 391 else
Zerotorescue@62 392 print(slashError);
Zerotorescue@62 393 end
Zerotorescue@62 394 end
Zerotorescue@62 395
Zerotorescue@62 396 function addon:RegisterSlash(func, args, description)
Zerotorescue@62 397 for _, arg in pairs(args) do
Zerotorescue@62 398 slashArgs[arg] = func;
Zerotorescue@62 399 end
Zerotorescue@62 400
Zerotorescue@62 401 if description then
Zerotorescue@62 402 slashError = slashError .. "\n" .. description;
Zerotorescue@62 403 end
Zerotorescue@62 404 end
Zerotorescue@62 405
Zerotorescue@62 406 -- Group functions
Zerotorescue@62 407
Zerotorescue@62 408 function addon:InGroup(itemId)
Zerotorescue@62 409 -- Go through all groups to see if this item is already somewhere
Zerotorescue@62 410 for groupName, values in pairs(addon.db.profile.groups) do
Zerotorescue@62 411 if values.items and values.items[itemId] then
Zerotorescue@62 412 return groupName;
Zerotorescue@62 413 end
Zerotorescue@62 414 end
Zerotorescue@62 415
Zerotorescue@62 416 return;
Zerotorescue@62 417 end
Zerotorescue@62 418
Zerotorescue@62 419 function addon:AddItemToGroup(groupName, itemId)
Zerotorescue@62 420 if self:InGroup(itemId) then
Zerotorescue@62 421 return false;
Zerotorescue@62 422 end
Zerotorescue@62 423
Zerotorescue@62 424 if not addon.db.profile.groups[groupName].items then
Zerotorescue@62 425 addon.db.profile.groups[groupName].items = {};
Zerotorescue@62 426 end
Zerotorescue@62 427
Zerotorescue@62 428 -- Set this item
Zerotorescue@62 429 addon.db.profile.groups[groupName].items[itemId] = true;
Zerotorescue@62 430
Zerotorescue@62 431 if AceConfigRegistry then
Zerotorescue@62 432 -- Now rebuild the list
Zerotorescue@62 433 AceConfigRegistry:NotifyChange("InventoriumOptions");
Zerotorescue@62 434 end
Zerotorescue@62 435
Zerotorescue@62 436 return true;
Zerotorescue@62 437 end
Zerotorescue@62 438
Zerotorescue@62 439 function addon:RemoveItemFromGroup(groupName, itemId)
Zerotorescue@62 440 if self:InGroup(itemId) ~= groupName then
Zerotorescue@62 441 return false;
Zerotorescue@62 442 end
Zerotorescue@62 443
Zerotorescue@62 444 -- Unset this item
Zerotorescue@62 445 addon.db.profile.groups[groupName].items[itemId] = nil;
Zerotorescue@62 446
Zerotorescue@62 447 return true;
Zerotorescue@62 448 end
Zerotorescue@62 449
Zerotorescue@62 450 -- Readable money
Zerotorescue@62 451
Zerotorescue@62 452 local goldText = "%s%d|cffffd700g|r ";
Zerotorescue@62 453 local silverText = "%s%d|cffc7c7cfs|r ";
Zerotorescue@62 454 local copperText = "%s%d|cffeda55fc|r";
Zerotorescue@62 455
Zerotorescue@62 456 function addon:ReadableMoney(copper, clean)
Zerotorescue@62 457 local text = "";
Zerotorescue@62 458
Zerotorescue@62 459 local gold = floor( copper / COPPER_PER_GOLD );
Zerotorescue@62 460 if gold > 0 then
Zerotorescue@62 461 text = goldText:format(text, gold);
Zerotorescue@62 462 end
Zerotorescue@62 463
Zerotorescue@62 464 if not clean or (not gold or gold < 10) then
Zerotorescue@62 465 local silver = floor( ( copper % COPPER_PER_GOLD ) / COPPER_PER_SILVER );
Zerotorescue@62 466 if silver > 0 then
Zerotorescue@62 467 text = silverText:format(text, silver);
Zerotorescue@62 468 end
Zerotorescue@62 469
Zerotorescue@62 470 if not clean or (not gold or gold < 1) then
Zerotorescue@62 471 local copper = floor( copper % COPPER_PER_SILVER );
Zerotorescue@62 472 if copper > 0 or text == "" then
Zerotorescue@62 473 text = copperText:format(text, copper);
Zerotorescue@62 474 end
Zerotorescue@62 475 end
Zerotorescue@62 476 end
Zerotorescue@62 477
Zerotorescue@62 478
Zerotorescue@62 479 return string.trim(text);
Zerotorescue@62 480 end
Zerotorescue@62 481
Zerotorescue@62 482 function addon:ReadableMoneyToCopper(value)
Zerotorescue@62 483 -- If a player enters a value it will be filled without color codes
Zerotorescue@62 484 -- If it is retrieved from the database, it will be colored coded
Zerotorescue@62 485 -- Thus we look for both
Zerotorescue@62 486 local gold = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+g|r") or string.match(value, "(%d+)g"));
Zerotorescue@62 487 local silver = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+s|r") or string.match(value, "(%d+)s"));
Zerotorescue@62 488 local copper = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+c|r") or string.match(value, "(%d+)c"));
Zerotorescue@62 489
Zerotorescue@62 490 return ( (gold or 0) * COPPER_PER_GOLD ) + ( (silver or 0) * COPPER_PER_SILVER ) + (copper or 0);
Zerotorescue@62 491 end
Zerotorescue@62 492
Zerotorescue@62 493 function addon:ValidateReadableMoney(info, value)
Zerotorescue@62 494 -- If a player enters a value it will be filled without color codes
Zerotorescue@62 495 -- If it is retrieved from the database, it will be colored coded
Zerotorescue@62 496 -- Thus we look for both
Zerotorescue@62 497 local gold = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+g|r") or string.match(value, "(%d+)g"));
Zerotorescue@62 498 local silver = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+s|r") or string.match(value, "(%d+)s"));
Zerotorescue@62 499 local copper = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+c|r") or string.match(value, "(%d+)c"));
Zerotorescue@62 500
Zerotorescue@62 501 if not gold and not silver and not copper then
Zerotorescue@62 502 return "The provided amount of money is invalid. Please provide the amount of money as #g#s#c, e.g. 591617g24s43c.";
Zerotorescue@62 503 else
Zerotorescue@62 504 return true;
Zerotorescue@62 505 end
Zerotorescue@62 506 end
Zerotorescue@62 507
Zerotorescue@0 508
Zerotorescue@0 509
Zerotorescue@13 510 -- Public
Zerotorescue@13 511
Zerotorescue@36 512 function IMRegisterPricingAddon(name, get, enabled, onSelect)
Zerotorescue@13 513 addon.supportedAddons.auctionPricing[name] = {
Zerotorescue@13 514 GetValue = get,
Zerotorescue@13 515 IsEnabled = enabled,
Zerotorescue@36 516 OnSelect = onSelect,
Zerotorescue@13 517 };
Zerotorescue@13 518 end
Zerotorescue@13 519
Zerotorescue@50 520 function IMRegisterItemCountAddon(name, getTotal, getCharacter, enabled, onSelect)
Zerotorescue@13 521 addon.supportedAddons.itemCount[name] = {
Zerotorescue@17 522 GetTotalCount = getTotal,
Zerotorescue@17 523 GetCharacterCount = getCharacter,
Zerotorescue@13 524 IsEnabled = enabled,
Zerotorescue@50 525 OnSelect = onSelect,
Zerotorescue@13 526 };
Zerotorescue@13 527 end
Zerotorescue@13 528
Zerotorescue@50 529 function IMRegisterCraftingAddon(name, queue, enabled, onSelect)
Zerotorescue@13 530 addon.supportedAddons.crafting[name] = {
Zerotorescue@13 531 Queue = queue,
Zerotorescue@13 532 IsEnabled = enabled,
Zerotorescue@50 533 OnSelect = onSelect,
Zerotorescue@13 534 };
Zerotorescue@13 535 end
Zerotorescue@13 536
Zerotorescue@62 537 -- We need a global command handler for our chat-links
Zerotorescue@62 538 function InventoriumCommandHandler(msg)
Zerotorescue@62 539 addon:CommandHandler(msg);
Zerotorescue@62 540 end
Zerotorescue@62 541
Zerotorescue@13 542
Zerotorescue@13 543
Zerotorescue@13 544 -- Debug
Zerotorescue@0 545
Zerotorescue@0 546 function addon:Debug(t)
Zerotorescue@0 547 if not self.debugChannel and self.debugChannel ~= false then
Zerotorescue@0 548 -- 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 549 self.debugChannel = false;
Zerotorescue@0 550
Zerotorescue@0 551 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@0 552 local name = GetChatWindowInfo(i);
Zerotorescue@0 553
Zerotorescue@0 554 if name:upper() == "DEBUG" then
Zerotorescue@0 555 self.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@0 556 end
Zerotorescue@0 557 end
Zerotorescue@0 558 end
Zerotorescue@0 559
Zerotorescue@0 560 if self.debugChannel then
Zerotorescue@0 561 self.debugChannel:AddMessage(t);
Zerotorescue@0 562 end
Zerotorescue@0 563 end