Old School RuneScape Wiki
Advertisement

Documentation for this module may be created at Module:ExchangeDefault/doc

-- <pre>
-- Default view for {{ExchangeItem}} for use on Exchange ns pages
--
-- Use of this via #invoke is deprecated and will eventually be removed
-- This is intended for use by [[Module:Exchange]]
--

local p = {}

-- imports
local excgdata = require( 'Module:ExchangeData' )._main
local round = require( 'Module:Number' )._round
local timeago = require( 'Module:TimeAgo' )._ago
local yesno = require( 'Module:Yesno' )

function p.main( item )
    local frame = mw.getCurrentFrame()
    local lang = mw.language.getContentLanguage()
    local title = mw.title.getCurrentTitle()
    local data  = mw.loadData( 'Module:Exchange/' .. item )

    -- set variables here if possible to keep table building easier to follow
    local rowspan = 8
    local volDate = data.volumeDate or lang:formatDate( 'c' )
    local dateDiffZ = lang:formatDate( 'z' ) - lang:formatDate( 'z', volDate )
    local dateDiffY = lang:formatDate( 'Y' ) - lang:formatDate( 'Y', volDate )
    local price = data.price and lang:formatNum( data.price ) or '<i>Unknown</i>'
    local date = '<i>Unknown</i>'
    local lowAlch = '<i>Not alchable</i>'
    local highAlch = '<i>Not alchable</i>'
    local memsIcon = ''
    local usage = ''

    if data.volume and ( dateDiffZ + 365 * dateDiffY ) <= 7 then
        rowspan = 10
    end

    if data.date then
        date = lang:formatDate( 'j F Y, H:i "(UTC)"', data.date )
    end

    if data.value and ( data.alchable == nil or yesno( data.alchable ) ) then
        lowAlch = lang:formatNum( math.floor( data.value * 0.4 ) )
        highAlch = lang:formatNum( math.floor( data.value * 0.6 ) )
    end

   if data.members ~= nil then
        if data.members then
            memsIcon = '[[File:P2P icon.png|40px|link=Members|middle]]'
        else
            memsIcon = '[[File:F2P icon.png|40px|link=Free-to-play|middle]]'
        end
    end

    -- workaround so we can use `table.concat`
    usage = {}

    for k, v in pairs( data.usage ) do
        usage[k] = v
    end

    if item ~= 'Test' then
        usage = '\n* [[' .. table.concat( usage, ']]\n* [[' ) .. ']]'
    else
        usage = ''
    end

    -- build table
    local tbl = mw.html.create( 'table' )
        :addClass( 'wikitable' )
        :css( {
            ['border'] = '0',
            ['border-collapse'] = 'separate',
            ['margin-top'] = '-1em',
            ['margin-bottom'] = '0'
        } )
        :tag( 'tr' )
            :tag( 'th' )
                :attr( 'colspan', '2' )
                :css( {
                    border = '0',
                    padding = '0'
                } )
                :tag( 'table' )
                    :css( {
                        width = '100%',
                        ['border-collapse'] = 'collapse'
                    } )
                    :tag( 'tr' )
                        :tag( 'td' )
                            :css( {
                                padding = '8px 16px',
                                ['border-right'] = '0'
                            } )
                            :wikitext( '[[File:' .. ( data.icon or 'Coins 1000' ) .. '|link=' .. item .. ']]' )
                            :done()
                        :tag( 'td' )
                            :css( {
                                width = '100%',
                                ['font-size'] = '135%',
                                ['text-align'] = 'left',
                                ['white-space'] = 'normal',
                                padding = '8px 0',
                                ['border-left'] = '0',
                                ['border-right'] = '0'
                            } )
                            -- this used to default to [[Grand Exchange Market Watch]] if item wasn't supplied
                            -- but that only happened on 6 user pages, an orphanage and a preload
                            :wikitext( '[[' .. item .. ']]' )
                            :tag( 'br' )
                                :done()
                            :tag( 'span' )
                                :css( {
                                    ['font-weight'] = 'normal',
                                    ['font-size'] = '75%'
                                } )
                                :wikitext( data.examine or '' )
                                :done()
                            :done()
                        :tag( 'td' )
                            :css( {
                                padding = '8px 16px',
                                ['border-left'] = '0'
                            } )
                            :wikitext( memsIcon )
                            :done()
                        :done()
                    :done()
                :done()
            :done()
        :tag( 'tr' )
            :tag( 'th' )
                :css( {
                    ['text-align'] = 'left',
                    ['padding-left'] = '10px'
                } )
                :wikitext( 'Price data' )
                :done()
            :tag( 'td' )
                :attr( 'rowspan', rowspan ) 
                :css( 'vertical-align', 'top' )
                :tag( 'div' )
                    :addClass( 'GEPage' )
                    :css( {
                        padding = '10px 5px 0 5px',
                        float = 'right'
                    } )
                    :tag( 'div' )
                        :addClass( 'GEdatachart' )
                        :css( {
                            margin = '5px 0 25px 0',
                            ['min-width'] = '700px',
                            ['height'] = '500px'
                        } )
                        -- GE Chart goes here
                        :done()
                    :done()
                :done()
            :done()
        :tag( 'tr' )
            :tag( 'td' )
                :css( {
                    ['vertical-align'] = 'top',
                    ['padding-bottom'] = '5px'
                } )
                :tag( 'ul' )
                    :tag( 'li' )
                        :wikitext( '<b>Price:</b> ' )
                        :tag( 'span' )
                            :attr( 'id', 'GEPrice' )
                            :wikitext( price )
                            :done()
                        :done()
                    :tag( 'li' )
                        :wikitext( '<b>Last updated:</b> ' .. timeago{data.date, purge='yes'} )
                        :tag( 'br' )
                            :done()
                        :tag( 'span' )
                            :attr( 'id', 'GEDate' )
                            :wikitext( date )
                            :done()
                        :done()
                    :done()
                :done()
            :done()
 
    if data.volume and ( dateDiffZ + 365 * dateDiffY ) <= 7 then
        tbl
            :tag( 'tr' )
                :tag( 'th' )
                    :css( {
                        ['text-align'] = 'left',
                        ['padding-left'] = '10px'
                    } )
                    :wikitext( 'Volume data' )
                    :done()
                :done()
            :tag( 'tr' )
                :tag( 'td' )
                    :attr( 'id', 'volumeData' )
                    :css ( {
                        ['vertical-align'] = 'top',
                        ['padding-bottom'] = '5px'
                    } )
                    :tag( 'ul' )
                        :tag( 'li' )
                            :wikitext( '<b>7-day total:</b> ' )
                                :tag( 'span' )
                                    :attr( 'id', 'GEVolume' )
                                    :wikitext( lang:formatNum( 1000000 * data.volume ) )
                                    :done()
                            :done()
                        :tag( 'li' )
                            :wikitext( '<b>1-day average</b> ' .. lang:formatNum( round( 1000000 / 7 * data.volume, -3 ) ) )
                            :done()
                        :tag( 'li' )
                            :wikitext( '<b>Last updated:</b> ' .. timeago{data.volumeDate, purge='yes'} )
                            :tag( 'br' )
                                :done()
                            :tag( 'span' )
                                :attr( 'id', 'GEVolumeDate' )
                                :wikitext( lang:formatDate( 'j F Y, H:i "(UTC)"', data.volumeDate ) )
                            :done()
                        :done()
                    :done()
                :done()
    end
 
    tbl
        :tag( 'tr' )
            :tag( 'th' )
                :css( {
                    ['text-align'] = 'left',
                    ['padding-left'] = '10px'
                } )
                :wikitext( 'Other details' )
                :done()
            :done()
        :tag( 'tr' )
            :tag( 'td' )
                :css( {
                    ['vertical-align'] = 'top',
                    ['padding-bottom'] = '5px'
                } )
                :tag( 'ul' )
                    :tag( 'li' )
                        :wikitext( '<b>[[Grand Exchange Database|Exchange ID]]:</b> ' )
                        :tag( 'span' )
                            :attr( 'id', 'GEDBID' )
                            :wikitext( data.itemId or '<i>Unknown</i>' )
                            :done()
                        :done()
                    :tag( 'li' )
                        :wikitext( '<b>Low Alchemy:</b> ' .. lowAlch )
                        :done()
                    :tag( 'li' )
                        :wikitext( '<b>High Alchemy:</b> ' .. highAlch )
                        :done()
                    :tag( 'li' )
                        :wikitext( '<b>[[Value]]:</b> ' .. ( data.value and lang:formatNum( data.value ) or '<i>Unknown</i>' ) )
                        :done()
                    :tag( 'li' )
                        :wikitext( '<b>[[Grand Exchange#Trade Restrictions|Exchange limit]]:</b> ' .. ( data.limit and lang:formatNum( data.limit ) or '<i>Unknown</i>' ) )
                        :done()
                    :tag( 'li' )
                        :wikitext( '<b>[[GED#Categories|GED Category]]:</b> ' .. data.category or '<i>Unknown</i>' )
                        :done()
                    :done()
                :done()
            :done()
        :tag( 'tr' )
            :tag( 'th' )
                :css( {
                    ['text-align'] = 'left',
                    ['padding-left'] = '10px'
                } )
                :wikitext( 'External links' )
                :done()
            :done()
        :tag( 'tr' )
            :tag( 'td' )
                :css( {
                    ['vertical-align'] = 'top',
                    ['padding-bottom'] = '5px'
                } )
                :tag( 'ul' )
                    :tag( 'li' )
                        :wikitext( '[http://services.runescape.com/m=itemdb_rs/viewitem.ws?obj=' .. data.itemId .. ' Lookup current price]' )
                        :done()
                    :tag( 'li' )
                        :wikitext( '[http://services.runescape.com/m=itemdb_rs/results.ws?query=' .. mw.uri.encode( data.item, 'QUERY' ) .. ' Search for relevant prices]' )
                        :done()
                    :done()
                :done()
            :done()
        :tag( 'tr' )
            :tag( 'th' )
                :css( {
                    ['text-align'] = 'left',
                    ['padding-left'] = '10px'
                } )
                :wikitext( 'Usage' )
                :done()
            :done()
        :tag( 'tr' )
            :tag( 'td' )
                :css( {
                    ['vertical-align'] = 'top',
                    ['padding-left'] = '5px',
                    ['padding-bottom'] = '5px'
                } )
                :wikitext( 'This item is used in:' .. usage )
                :done()
            :done()

    tbl = tostring( tbl )

    -- categories
    local cats = ''
    local natPrice

    if title.nsText == 'Exchange' then
        cats = cats .. '[[Category:Grand Exchange]]'
                    .. '[[Category:Wikia Game Guides exchange]]'
                    .. '[[Category:Grand Exchange by date updated|*' .. lang:formatDate( 'c', data.date ) .. data.itemId .. ']]'

        if data.item ~= title.text then
            cats = cats .. '[[Category:Exchange names that needs checking]]'
        end

        if data.item then
            -- have to preprocess this for it to work
            cats = cats .. frame:preprocess( '{{DEFAULTSORT:' .. data.item .. '}}' )
        end

        if not data.itemId then
            cats = cats .. '[[Category:Exchange items with no ID]]'
        end

        if not data.icon then
            cats = cats .. '[[Category:Exchange items missing icon]]'
        end

        if data.price and data.value and ( data.alchable == nil or yesno( data.alchable ) ) then
            if mw.ustring.lower( item ) == 'nature rune' then
                natPrice = data.price
            else
                natPrice = mw.loadData( 'Module:Exchange/Nature rune' ).price
            end

            if math.floor( ( data.value * 0.6 ) - data.price - natPrice ) > 0 then
                cats = cats .. '[[Category:Profitable Alchemy Items]]'
            end

            if math.floor( ( data.value * 0.4 ) - data.price - natPrice ) > 0 then
                cats = cats .. '[[Category:Profitable Low Alchemy Items]]'
            end

            if math.floor( ( data.value * 0.3 ) - data.price ) > 0 then
                cats = cats .. '[[Category:Profitable General Store Items]]'
            end

        elseif not data.value then
            cats = cats .. '[[Category:Exchange items missing value]]'
        end

        -- this doesn't allow for the update time to be in the previous day but less than 24 hours
        -- if that's the case, then the page will end up in the 7 days category
        -- the same will happen for the other 2 categories too
        -- but it's not so noticeable given the already elapsed time
        local lastUpdate = ( lang:formatDate( 'z' ) - lang:formatDate( 'z', data.date ) + 365 * ( lang:formatDate( 'Y' ) - lang:formatDate( 'Y', data.date ) ) + 3 ) / 7
        lastUpdate = round( lastUpdate, 0 )
 
        if lastUpdate == 1 then
            cats = cats .. '[[Category:Needs price update/7 days]]'
        elseif lastUpdate >= 2 and lastUpdate <= 4 then
            cats = cats .. '[[Category:Needs price update/28 days]]'
        elseif lastUpdate > 4 then
            cats = cats .. '[[Category:Needs price update/29+ days]]'
        end

        if not data.limit then
            cats = cats .. '[[Category:Exchange items missing limit]]'
        end

        if not data.category then
            cats = cats .. '[[Category:Exchange items missing category]]'
        end
        -- Error checking
        if not data.price or data.price == 0 then
            cats = cats .. '[[Category:Exchange items with no price]]'
        end
    end

    -- help header
    local help = mw.html.create( 'div' )
        :attr( 'id', 'gemw_guide' )
        :css( {
            padding = '5px 10px',
            color = '#000',
            border = '1px solid #aaa',
            background = '#f2f2f2'
        } )
        :wikitext( 'If you need assistance on editing this page, or trying to understand how these Exchange pages work, please add a comment to [[Talk:Grand Exchange Market Watch]].' )

    help = tostring( help )

    local data = excgdata( { item }, true )

    local links = mw.html.create( 'div' )
        :addClass( 'module-links' )
        :css( {
            ['font-size'] = 'smaller',
            ['padding-left'] = '5px'
        } )
        :wikitext( '[[Module:Exchange/' .. item .. '|&#91;info&#93;]] &bull; [[Module:Exchange/' .. item .. '/Data|&#91;data&#93;]]' )

    links = tostring( links )
 
    return help .. '<br />' .. tbl .. links .. data .. cats
end

return p
Advertisement