view Modules/CraftingRules.lua @ 144:03e108d12ef1

Ticket 45 - Added the ability suppress COD warnings when mailing to characters on other accounts in Altoholic/DataStore. Instead of sending COD, ItemAuditor will send tracking info in the message. Thanks to Zerotorescue for giving me the solution to detect whether or not Postal or MailOpener is processing. It was the last step holding this back from being released.
author Asa Ayers <Asa.Ayers@Gmail.com>
date Sat, 09 Oct 2010 00:21:06 -0700
parents 706b173b0fa1
children 090e466fd956
line wrap: on
line source
local ItemAuditor = select(2, ...)
local CraftingRules = ItemAuditor:NewModule("CraftingRules")
print('CraftingRules')
local Crafting = ItemAuditor:GetModule("Crafting")
local Utils = ItemAuditor:GetModule("Utils")

ItemAuditor.DB_defaults.char.rules_default_veto = false
ItemAuditor.DB_defaults.char.rules = {
	
}

local function mergeDefaultValues(rule)
	if nil == rule.search then
		rule.search = ""
	end
	if nil == rule.target then
		rule.target = 0
	end
	if nil == rule.skip_singles then
		rule.skip_singles = false
	end
	if nil == rule.bonus_queue then
		rule.bonus_queue = 0
	end
	return rule
end

local print = function(message, ...)
	ItemAuditor:Print(message, ...)
end

local Options = {
	header_result = {
		type = 'header',
		name = 'Default Result',
		order = 9,
	},
	veto = {
		type = "toggle",
		name = "Veto unknown",
		desc = "Vetos any items you don't have a rule for",
		get = function() return ItemAuditor.db.char.rules_default_veto end,
		set = function(info, value) ItemAuditor.db.char.rules_default_veto = value end,
		order = 10,
	},
}

local function generateRuleOptions(name)
	local opt = {
		name = name,
		type = 'group',
		args = {
			items = {
				type = "input",
				name = "Item(s)",
				desc = "Items this rule should match. Separate items with commas.",
				multiline = true,
				get = function()
					return ItemAuditor.db.char.rules[name].search
				end,
				set = function(info, value)
					ItemAuditor.db.char.rules[name].search = value
				end,
				order = 0,
			},
			header_result = {
				type = 'header',
				name = 'Rule',
				order = 9,
			},
			veto = {
				type = "toggle",
				name = "Veto",
				desc = "Veto any item that matches this rule",
				get = function()
					return (ItemAuditor.db.char.rules[name].target == -1)
				end,
				set = function(info, value)
					if value then
						value = -1
					else
						value = 0
					end
					ItemAuditor.db.char.rules[name].target = value
				end,
				order = 10,
			},
			auction_threshold = {
				type = "range",
				name = "Number to craft",
				desc = "",
				min = 0,
				max = 1000,
				softMax = 50,
				step = 1,
				get = function() return max(0, ItemAuditor.db.char.rules[name].target) end,
				set = function(info, value)
					ItemAuditor.db.char.rules[name].target = value
				end,
				disabled = function() return ItemAuditor.db.char.rules[name].target == -1 end,
				order = 11,
			},
			skip_singles = {
				type = "toggle",
				name = "Skip Singles",
				desc = "If only one of the item will be crafted, skip it",
				disabled = function() return ItemAuditor.db.char.rules[name].target <= 1 end,
				get = function()
					return ItemAuditor.db.char.rules[name].skip_singles and (ItemAuditor.db.char.rules[name].target > 1)
				end,
				set = function(info, value)
					ItemAuditor.db.char.rules[name].skip_singles = value
				end,
				order = 12,
			},
			bonus_queue = {
				type = "range",
				name = "Bonus Queue",
				desc = "If don't have any of an item, this number will be added to the number to craft.",
				min = 0,
				max = 1000,
				softMax = 50,
				step = 1,
				get = function() return ItemAuditor.db.char.rules[name].bonus_queue end,
				set = function(info, value)
					ItemAuditor.db.char.rules[name].bonus_queue = value
				end,
				order = 13,
			},
			header_delete = {
				type = 'header',
				name = '',
				order = 19,
			},
			header_delete = {
				type = 'execute',
				name = 'Delete Rule',
				func = function()
					ItemAuditor.db.char.rules[name] = nil
					Options['rule_'..name] = nil
				end,
				order = 20,
			},
		},
	}
	

	return opt
end

--[[
	This had to be separated because set refers to Options and generateRuleOptions
]]
Options.new = {
	type = "input",
	name = "Create New Rule",
	desc = "",
	get = function()
		return ""
	end,
	set = function(info, name)
		ItemAuditor.db.char.rules[name] = {
			search = name,
			target = 0,
		}
		Options['rule_'..name] = generateRuleOptions(name)
	end,
	order = 0,
}

local function generateDefaultGroups()
	local defaultGroups = {
		['Glyphs'] = {
			search = 'Glyph of',
			target = 0,
		},
		['Epic Gems'] = {
			search = "Cardinal Ruby, Ametrine, King's Amber, Eye of Zul, Majestic Zircon, Dreadstone",
			target = 0,
		},
		['Rare Gems'] = {
			search = "Scarlet Ruby, Monarch Topaz, Autumn's Glow, Forest Emerald, Sky Sapphire, Twilight Opal",
			target = 0,
		},
	}

	for name, rule in pairs(defaultGroups) do
		ItemAuditor.db.char.rules[name] = mergeDefaultValues({
			search = rule.search,
			target = rule.target,
		})
		Options['rule_'..name] = generateRuleOptions(name)
	end
end

local rules
function CraftingRules:OnInitialize()
	rules = ItemAuditor.db.char.rules
	local count = 0
	for name, rule in pairs(rules) do
		mergeDefaultValues(rule)
		Options['rule_'..name] = generateRuleOptions(name)
		count = count + 1
	end

	if count == 0 then
		generateDefaultGroups()
	end
end

local function runRule(rule, itemName, itemID, data)
	local searches = {strsplit(',', rule.search:upper())}
	local bonus = 0
	if data.count == 0 then
		bonus = rule.bonus_queue
	end

	for _, search in pairs(searches) do
		search = search:trim()
		
		if string.find(itemName, search) ~= nil or itemID == search then
			if rule.skip_singles and data.count+1 == rule.target then
				return data.count
			end
			return rule.target + bonus
		end
	end
	return 0
end

local function Decide(data)

	local match_rule = nil
	local match_num = 0

	local itemName = data.name:upper()
	local itemID = tostring(Utils.GetItemID(data.link))
	for name, rule in pairs(rules) do
		local result = runRule(rule, itemName, itemID, data)
		if result == -1 then
			return result, name
		elseif result > match_num then
			match_rule = name
			match_num = result
		end
	end

	if match_rule == nil and ItemAuditor.db.char.rules_default_veto then
		return -1
	end
	return match_num, match_rule
end

Crafting.RegisterCraftingDecider('Crafting Rules', Decide, Options)