Tuesday, May 5, 2009

Warcraft Recipe Builder Powershell Script

I've posted this script before on my own server, but since it's being rebuilt, I thought I'd repost it here. The script will take the name of an item from Warcraft (for example) Mekgineer's Chopper, then return all the items and roughly how you get each. Maybe revise the code to return a webpage with links to the source, but that's for a third revision.

Note: This script requires Powershell installed on your PC. Copy and paste the code below and save into a file with a PS1 extention.

Sample Results
Please Enter the WowHead name or ItemID (found in the URL)?: Mekgineer's Chopper
Mekgineer's Chopper x 1
Titansteel Bar x 12
Titanium Bar x 36
- created
Eternal Fire x 12
- created
Eternal Earth x 12
- created
Eternal Shadow x 12
- created
Handful of Cobalt Bolts x 40
Cobalt Bar x 80
Cobalt Ore x 80
- drop
Arctic Fur x 2
- drop
Salvaged Iron Golem Parts x 1
- vendor ( 3000 g)
Goblin-machined Piston x 8
- vendor ( 8000 g)
Elementium-plated Exhaust Pipe x 1
- vendor ( 1500 g)



################## Code starts here ####

#Eric Woodford
#EricWoodford.com
#Break down made items to get all required ingredients.

function Read-URL ($url) {
#source: http://waynes-world-it.blogspot.com/2008/05/reading-web-content-with-powershell.html
$col = new-object System.Collections.Specialized.NameValueCollection
$col.Add("a","stats")
$col.Add("s","s451qaz2WSX")
$wc = new-object system.net.WebClient
$wc.proxy = $proxy
$wc.QueryString = $col
$webpage = $wc.DownloadData($url)
$string = [System.Text.Encoding]::ASCII.GetString($webpage)
return $String
}

function get-ingredientfor([string]$item, [int]$multi) {
$x +=4
#$Needed = $csv | ?{$_.item -eq $item}
[xml] $needed = Read-URL($url+ $item + $strXML)
Write-Host (" " * $x) $needed.wowhead.item.name.psbase.innertext "x" $multi
$reagents = $needed.wowhead.item.createdBy.spell.reagent
if ($reagents -ne $null) {
$reagents | % {
if ($_.id -ne "") {
get-ingredientfor $_.id ($multi * [int]$_.count)
} else {
$strSource = $needed.wowhead.item.json.psbase.innertext
#http://www.johndcook.com/regex.html
$words = ([regex]::matches($strSource, "source:\[[123456,]+\]") | %{$_.value})
if ($words -match "1") {Write-Host (" " * $x)" - created"}
if ($words -match "2") {Write-Host (" " * $x)" - drop"}
if ($words -match "5") {Write-Host (" " * $x)" - vendor"}
}
}
} else {
$strSource = $needed.wowhead.item.json.psbase.innertext
$words = ([regex]::matches($strSource, "source:\[[123456,]+\]") | %{$_.value})
if ($words -match "1") {Write-Host (" " * $x)" - created"}
if ($words -match "2") {Write-Host (" " * $x)" - drop"}
if ($words -match "5") {
$strSource = $needed.wowhead.item.jsonequip.psbase.innertext
$words = ([regex]::matches($strSource, "buyprice:[01234567890]+") | %{$_.value})
if ($words -ne $null) {
$cost = [int] $words.split(":")[1]
if ($cost -gt 10000) {
Write-Host (" " * $x)" - vendor (" (($cost/10000)*$multi) "g)"
} else {
Write-Host (" " * $x)" - vendor (" (($cost/100)*$multi) "s)"
}
} else { Write-Host (" " * $x)" - vendor (non gold price)"}
}
}
}

$x = -4
$url = "http://www1.wowhead.com/?item="
#$itemCode = "42101"
$strXML = "&xml"
cls
Write-Host "Beta - PowerShell World of Warcraft Ingredients List"
Write-Host "This code will read the WowHead website and process all the ingredients necessary to make something."
Write-Host "----------------------------------------------------------"
$ItemCode = Read-Host "Please Enter the WowHead name or ItemID (found in the URL)?"

if ($itemcode -eq $null) {Throw "Please enter an itemID to continue"}
$test = Read-URL($url+ $itemCode + $strXML)
if ($test -match "not found") {Throw "Item not found in WowHead"}

get-ingredientfor $itemCode 1



# SIG # Begin signature block
# MIID9QYJKoZIhvcNAQcCoIID5jCCA+ICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUvsc0vRAk+dqFXZlphHXBOSZ4
# 4eCgggITMIICDzCCAXygAwIBAgIQ/UB20u9S1JtPdEDFKKyoFTAJBgUrDgMCHQUA
# MBgxFjAUBgNVBAMTDUVyaWMgV29vZGZvcmQwHhcNMDkwMzEwMTYyMjMzWhcNMzkx
# MjMxMjM1OTU5WjAYMRYwFAYDVQQDEw1FcmljIFdvb2Rmb3JkMIGfMA0GCSqGSIb3
# DQEBAQUAA4GNADCBiQKBgQDI0iPrcclTbW6ogzvxZl2Ran1oJGvBBLJ31Xe8P+VV
# TZUvZLlgL3tnw2UUo8VXgNzjUoKXT+fAytUuYpc6emXidN/NJN+w2ePUKTcRUnIH
# DnPqpo5bchBSAzmuyjtyUlEnvVX24xJMLxCfTBscguxVVxUzb82mMcuof7BEYDNN
# WQIDAQABo2IwYDATBgNVHSUEDDAKBggrBgEFBQcDAzBJBgNVHQEEQjBAgBA/H8WJ
# oayCcjdxR0jOQs48oRowGDEWMBQGA1UEAxMNRXJpYyBXb29kZm9yZIIQ/UB20u9S
# 1JtPdEDFKKyoFTAJBgUrDgMCHQUAA4GBAMFORonERcVlEnlZyy371CUFbRWaIjpa
# q3AR6KFq/FyQiTyc1wnUkJENIdPWpYtwFTG4y6O/d2avnfo0XFhMkNeSqefeI56K
# 7jXel4ba1tQgdUk1QxkTqBFCjNg69WTItO4u9eDuTwQR9M0BFzSbLjKqDiBzpkdd
# taQ4zjx15GyXMYIBTDCCAUgCAQEwLDAYMRYwFAYDVQQDEw1FcmljIFdvb2Rmb3Jk
# AhD9QHbS71LUm090QMUorKgVMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQow
# CKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
# AQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBR9w7n7EP4i8eo1kltq
# qZg2VKPT7TANBgkqhkiG9w0BAQEFAASBgEAINVPvA5S+jU1UgHs/PBISd9wM44Ia
# +LrA2Pxs+rjsLiJgMgTAGqbZoHdBb2bKIEXUJElwykc7NqBsb4W5sD0vk+ubVjDC
# k26/SY/gLD+vHSDiIhGpq0Ho3fdWKNFNXuo1cn/4ekb28wj094SfAxUgW7kNz0y0
# 3FwIdEL2tPVp
# SIG # End signature block

2 comments:

  1. That's a pretty darn good idea. I had a similar one but web-based since I'm a web programmer.

    ReplyDelete
  2. Thanks! I tend to shy away from web programming and leave that to the professionals. Scripting on the otherhand pays the bills.

    ReplyDelete

Soapbox: Lazy Form of Raiding

Over the summer, I spent 2 weeks with my family (parents, brother's family and my family) on the beach in Maui. It was absolutely awe...