Asa@100: local ItemAuditor = select(2, ...) Asa@100: local CraftingRules = ItemAuditor:NewModule("CraftingRules") Asa@100: print('CraftingRules') Asa@100: local Crafting = ItemAuditor:GetModule("Crafting") Asa@100: local Utils = ItemAuditor:GetModule("Utils") Asa@100: Asa@100: ItemAuditor.DB_defaults.char.rules_default_veto = false Asa@100: ItemAuditor.DB_defaults.char.rules = { Asa@100: Asa@100: } Asa@100: Asa@100: local print = function(message, ...) Asa@100: ItemAuditor:Print(message, ...) Asa@100: end Asa@100: Asa@100: local Options = { Asa@100: header_result = { Asa@100: type = 'header', Asa@100: name = 'Default Result', Asa@100: order = 9, Asa@100: }, Asa@100: veto = { Asa@100: type = "toggle", Asa@100: name = "Veto unknown", Asa@100: desc = "Vetos any items you don't have a rule for", Asa@100: get = function() return ItemAuditor.db.char.rules_default_veto end, Asa@100: set = function(info, value) ItemAuditor.db.char.rules_default_veto = value end, Asa@100: order = 10, Asa@100: }, Asa@100: } Asa@100: Asa@100: local function generateRuleOptions(name) Asa@100: local opt = { Asa@100: name = name, Asa@100: type = 'group', Asa@100: args = { Asa@100: items = { Asa@100: type = "input", Asa@100: name = "Item(s)", Asa@100: desc = "Items this rule should match. Separate items with commas.", Asa@100: multiline = true, Asa@100: get = function() Asa@100: return ItemAuditor.db.char.rules[name].search Asa@100: end, Asa@100: set = function(info, value) Asa@100: ItemAuditor.db.char.rules[name].search = value Asa@100: end, Asa@100: order = 0, Asa@100: }, Asa@100: header_result = { Asa@100: type = 'header', Asa@100: name = 'Rule', Asa@100: order = 9, Asa@100: }, Asa@100: veto = { Asa@100: type = "toggle", Asa@100: name = "Veto", Asa@100: desc = "Veto any item that matches this rule", Asa@100: get = function() Asa@100: return (ItemAuditor.db.char.rules[name].target == -1) Asa@100: end, Asa@100: set = function(info, value) Asa@100: if value then Asa@100: value = -1 Asa@100: else Asa@100: value = 0 Asa@100: end Asa@100: ItemAuditor.db.char.rules[name].target = value Asa@100: end, Asa@100: order = 10, Asa@100: }, Asa@100: auction_threshold = { Asa@100: type = "range", Asa@100: name = "Number to craft", Asa@100: desc = "", Asa@100: min = 0, Asa@100: max = 1000, Asa@100: softMax = 50, Asa@100: step = 1, Asa@100: get = function() return max(0, ItemAuditor.db.char.rules[name].target) end, Asa@100: set = function(info, value) Asa@100: ItemAuditor.db.char.rules[name].target = value Asa@100: end, Asa@100: disabled = function() return ItemAuditor.db.char.rules[name].target == -1 end, Asa@100: order = 11, Asa@100: }, Asa@100: header_delete = { Asa@100: type = 'header', Asa@100: name = '', Asa@100: order = 19, Asa@100: }, Asa@100: header_delete = { Asa@100: type = 'execute', Asa@100: name = 'Delete Rule', Asa@100: func = function() Asa@100: ItemAuditor.db.char.rules[name] = nil Asa@100: Options['rule_'..name] = nil Asa@100: end, Asa@100: order = 20, Asa@100: }, Asa@100: }, Asa@100: } Asa@100: Asa@100: Asa@100: return opt Asa@100: end Asa@100: Asa@100: --[[ Asa@100: This had to be separated because set refers to Options and generateRuleOptions Asa@100: ]] Asa@100: Options.new = { Asa@100: type = "input", Asa@100: name = "Create New Rule", Asa@100: desc = "", Asa@100: get = function() Asa@100: return "" Asa@100: end, Asa@100: set = function(info, name) Asa@100: ItemAuditor.db.char.rules[name] = { Asa@100: search = name, Asa@100: target = 0, Asa@100: } Asa@100: Options['rule_'..name] = generateRuleOptions(name) Asa@100: end, Asa@100: order = 0, Asa@100: } Asa@100: Asa@100: local function generateDefaultGroups() Asa@100: local defaultGroups = { Asa@100: ['Glyphs'] = { Asa@100: search = 'Glyph of', Asa@100: target = 0, Asa@100: }, Asa@100: ['Epic Gems'] = { Asa@100: search = "Cardinal Ruby, Ametrine, King's Amber, Eye of Zul, Majestic Zircon, Dreadstone", Asa@100: target = 0, Asa@100: }, Asa@100: ['Rare Gems'] = { Asa@100: search = "Scarlet Ruby, Monarch Topaz, Autumn's Glow, Forest Emerald, Sky Sapphire, Twilight Opal", Asa@100: target = 0, Asa@100: }, Asa@100: } Asa@100: Asa@100: for name, rule in pairs(defaultGroups) do Asa@100: ItemAuditor.db.char.rules[name] = { Asa@100: search = rule.search, Asa@100: target = rule.target, Asa@100: } Asa@100: Options['rule_'..name] = generateRuleOptions(name) Asa@100: end Asa@100: end Asa@100: Asa@100: local rules Asa@100: function CraftingRules:OnInitialize() Asa@100: rules = ItemAuditor.db.char.rules Asa@100: local count = 0 Asa@100: for name, _ in pairs(rules) do Asa@100: Options['rule_'..name] = generateRuleOptions(name) Asa@100: count = count + 1 Asa@100: end Asa@100: Asa@100: if count == 0 then Asa@100: generateDefaultGroups() Asa@100: end Asa@100: end Asa@100: Asa@100: local function runRule(rule, itemName, itemID) Asa@100: local searches = {strsplit(',', rule.search:upper())} Asa@100: Asa@100: for _, search in pairs(searches) do Asa@100: search = search:trim() Asa@100: Asa@100: if string.find(itemName, search) ~= nil or itemID == search then Asa@100: return rule.target Asa@100: end Asa@100: end Asa@100: return 0 Asa@100: end Asa@100: Asa@100: local function Decide(data) Asa@100: Asa@100: local match_rule = nil Asa@100: local match_num = 0 Asa@100: Asa@100: local itemName = data.name:upper() Asa@100: local itemID = tostring(Utils.GetItemID(data.link)) Asa@100: for name, rule in pairs(rules) do Asa@100: local result = runRule(rule, itemName, itemID) Asa@100: if result == -1 then Asa@100: return result, name Asa@100: elseif result > match_num then Asa@100: match_rule = name Asa@100: match_num = result Asa@100: end Asa@100: end Asa@100: Asa@100: if match_rule == nil and ItemAuditor.db.char.rules_default_veto then Asa@100: return -1 Asa@100: end Asa@100: return match_num, match_rule Asa@100: end Asa@100: Asa@100: Crafting.RegisterCraftingDecider('Crafting Rules', Decide, Options)