m (test) Tag: sourceedit |
(This will cause crashes, but is necessary until we can switch to a pure SMW solution.) |
||
(29 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
-- <pre> |
-- <pre> |
||
local p = {} |
local p = {} |
||
+ | local JSONS = require('Module:Json') |
||
function p.main(frame) |
function p.main(frame) |
||
+ | -- This template is fairly expensive to use, so it should be limited |
||
+ | mw.incrementExpensiveFunctionCount() |
||
+ | |||
local args = frame:getParent().args |
local args = frame:getParent().args |
||
Line 10: | Line 14: | ||
local drop = string.lower(args.userparam or args.drop or '') |
local drop = string.lower(args.userparam or args.drop or '') |
||
drop = mw.text.decode(drop) |
drop = mw.text.decode(drop) |
||
+ | |||
+ | -- escape lua characters |
||
+ | local _drop = drop:gsub('([%^%$%(%)%%%.%[%]%*%+%-%?])','%%%1') |
||
local smwdata = frame:preprocess('{{'.. |
local smwdata = frame:preprocess('{{'.. |
||
Line 23: | Line 30: | ||
smwdata = mw.text.decode(tostring(smwdata)) |
smwdata = mw.text.decode(tostring(smwdata)) |
||
− | |||
local _found = false |
local _found = false |
||
local json, cmb = unpack( mw.text.split(smwdata,'%(&&SPLITPOINT&&') ) |
local json, cmb = unpack( mw.text.split(smwdata,'%(&&SPLITPOINT&&') ) |
||
⚫ | |||
− | json = string.format('[ %s ]',json) |
+ | json_good, json = pcall(JSONS.decode,string.format('[ %s ]',json)) |
+ | |||
+ | if not json_good then |
||
+ | return '' |
||
+ | end |
||
cmb = string.format( '(%s',cmb or '?' ) |
cmb = string.format( '(%s',cmb or '?' ) |
||
+ | local ret = {} |
||
− | _found = mw.ustring.find(json:lower(), '%{ "name": "'..drop..'"') |
||
+ | |||
+ | for _, v in pairs(json) do |
||
+ | if drop == string.lower(v.name) then |
||
+ | table.insert(ret,v) |
||
+ | _found = true |
||
+ | end |
||
+ | end |
||
if not _found then |
if not _found then |
||
return '' |
return '' |
||
end |
end |
||
− | |||
− | local _min,_max,rarity = mw.ustring.match(json:lower(), '%{ "name": "'..drop..'", "quantity": %[([%d%?]+),([%d%?]+)%], "rarity": "([%w ]+)"') |
||
− | |||
− | _min = _min or '' |
||
− | _max = _max or '' |
||
− | rarity = rarity or '' |
||
local combat = mw.ustring.match(cmb:lower(),'%(combat level: (.-)%)') or 'N/A' |
local combat = mw.ustring.match(cmb:lower(),'%(combat level: (.-)%)') or 'N/A' |
||
⚫ | |||
+ | local retString = {} |
||
+ | for _, v in pairs(ret) do |
||
⚫ | |||
+ | local _min,_max = v.quantity[1],v.quantity[2] |
||
⚫ | |||
⚫ | |||
⚫ | |||
+ | quantity = _min |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | end |
||
⚫ | |||
+ | |||
+ | table.insert(retString, |
||
⚫ | |||
+ | monster, |
||
+ | combat, |
||
+ | quantity, |
||
+ | v.rarity) |
||
+ | ) |
||
end |
end |
||
+ | return frame:preprocess(table.concat(retString,'\n')) |
||
⚫ | |||
end |
end |
||
Latest revision as of 16:12, 20 March 2019
Documentation for this module may be created at Module:Get drop info/doc
-- <pre>
local p = {}
local JSONS = require('Module:Json')
function p.main(frame)
-- This template is fairly expensive to use, so it should be limited
mw.incrementExpensiveFunctionCount()
local args = frame:getParent().args
local monster = string.gsub(args['?monster'] or args.monster or '','[][]','')
monster = mw.text.decode(monster)
local drop = string.lower(args.userparam or args.drop or '')
drop = mw.text.decode(drop)
-- escape lua characters
local _drop = drop:gsub('([%^%$%(%)%%%.%[%]%*%+%-%?])','%%%1')
local smwdata = frame:preprocess('{{'..
'{{{|safesubst:}}}#show:'..
monster..
[[
|?Drop JSON
|?All Combat level=&&SPLITPOINT&&Combat level:
|headers=plain
|format=list
}}
]])
smwdata = mw.text.decode(tostring(smwdata))
local _found = false
local json, cmb = unpack( mw.text.split(smwdata,'%(&&SPLITPOINT&&') )
local json_good
json_good, json = pcall(JSONS.decode,string.format('[ %s ]',json))
if not json_good then
return ''
end
cmb = string.format( '(%s',cmb or '?' )
local ret = {}
for _, v in pairs(json) do
if drop == string.lower(v.name) then
table.insert(ret,v)
_found = true
end
end
if not _found then
return ''
end
local combat = mw.ustring.match(cmb:lower(),'%(combat level: (.-)%)') or 'N/A'
combat = mw.ustring.gsub(combat,'(%d),(%d%d%d)','%1%2')
local retString = {}
for _, v in pairs(ret) do
local _min,_max = v.quantity[1],v.quantity[2]
local quantity
if tonumber(_min) == tonumber(_max) then
quantity = _min
else
quantity = string.format('%s-%s',_min,_max)
end
table.insert(retString,
string.format('{{ItemDropsLine|Monster=%s|Combat=%s|Quantity=%s|Rarity=%s}}',
monster,
combat,
quantity,
v.rarity)
)
end
return frame:preprocess(table.concat(retString,'\n'))
end
return p