SSW Shop Autopricer

Automatically prices shop to 1 np less than lowest on SSW

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         SSW Shop Autopricer
// @namespace    shiftasterisk
// @version      2.0
// @description  Automatically prices shop to 1 np less than lowest on SSW
// @author       shiftasterisk
// @match        http://www.neopets.com/market.phtml?*type=your*
// @match        http://www.neopets.com/market_your.phtml
// @grant        none
// ==/UserScript==
var userName = $('.user a').html();
var minSearchSpeed = 2000;
var maxSearchSpeed = 5000;

var lowerPrice = 0;
var finalPrice = 0;

var banned = false;

var waitForResults;

console.log(userName);

//Form
$('p b font:contains("Note:")').parent().parent().before().append(
    '<div id="sswAP">' +
    '<input id="autoPrice" class="sswInner" type="button" value="SSW Auto Price">' +
    '<label class="sswInner" for="lowDiff">Low Price Alert (%):</label><input type="input" name="lowDiff" id="lowDiff" value="25">' +
    '<label class="sswInner" for="lowerPrice">Price Below:</label><input type="input" name="lowerPrice" id="lowerPrice" value="10">' +
    '<label for="finalPrice"> to Price:</label><input type="input" name="finalPrice" id="finalPrice" value="1">' +
    '<input id="priceAfterBan" name="priceAfterBan" class="sswInner" type="checkbox"><label for="priceAfterBan">Price check after ban</label>' +
    '</div>'
);
$('.sswInner').css({
    "margin-left": "20px"
});

$('#lowDiff, #lowerPrice, #finalPrice').css({
    'width': '50px'
});

//Table headers
$('form[action="process_market.phtml"] table tbody tr').first().append(
    '<td align="center" bgcolor="#dddd77">' +
    '<b>Ignore</b><input id="ignoreAll" type="checkbox">' +
    '</td>' +
    '<td align="center" bgcolor="#dddd77">' +
    '<b>Reprice</b><input id="repriceAll" type="checkbox">' +
    '</td>' +
    '<td align="center" bgcolor="#dddd77">' +
    '<b>Lower Own</b><input id="lowerOwnAll" type="checkbox">' +
    '</td>' +
    '<td align="center" bgcolor="#dddd77">' +
    '<b>Reduce By</b><input id="reduceByAll" type="input">' +
    '</td>' +
    '<td align="center" bgcolor="#dddd77">' +
    '<b>Rate</b><select id="rateAll">' +
    '<option value="np">NP</option>' +
    '<option value="%">%</option>' +
    '</select>' +
    '</td>' +
    '<td align="center" bgcolor="#dddd77">' +
    '<b>Search Type</b><select id="searchTypeAll">' +
    '<option value="search">Search</option>' +
    '<option value="pc">Price Check</option>' +
    '<option value="none">None</option>' +
    '</select>' +
    '</td>' +
    '<td align="center" bgcolor="#dddd77">' +
    '<b>Lowest Prices/Price Check</b>' +
    '</td>'
);
$('#reduceByAll').css({
    'width': '60px'
});

//click functions
$('#ignoreAll').click(function() {
    ignoreAll = $('#ignoreAll').is(':checked');
    if (ignoreAll)
        $('.itemIgnore').prop('checked', true);
    else
        $('.itemIgnore').prop('checked', false);
});
$('#repriceAll').click(function() {
    repriceAll = $('#repriceAll').is(':checked');
    if (repriceAll)
        $('.itemReprice').prop('checked', true);
    else
        $('.itemReprice').prop('checked', false);
});
$('#lowerOwnAll').click(function() {
    repriceAll = $('#lowerOwnAll').is(':checked');
    if (repriceAll)
        $('.itemLowerOwn').prop('checked', true);
    else
        $('.itemLowerOwn').prop('checked', false);
});
$('#reduceByAll').change(function() {
    $('.itemReduceBy').val($('#reduceByAll').val());
});
$('#rateAll').change(function() {
    $('.itemRate').val($('#rateAll').val());
});
$('#searchTypeAll').change(function() {
    $('.itemSearchType').val($('#searchTypeAll').val());
});

//table rows
$('form[action="process_market.phtml"] table tbody tr').not(':first').not(':last').each(function() {
    $(this).append(
        '<td width="50" align="center" bgcolor="#ffffcc">' +
        '<input class="itemIgnore" type="checkbox">' +
        '</td>' +
        '<td width="50" align="center" bgcolor="#ffffcc">' +
        '<input class="itemReprice" type="checkbox">' +
        '</td>' +
        '<td width="50" align="center" bgcolor="#ffffcc">' +
        '<input class="itemLowerOwn" type="checkbox">' +
        '</td>' +
        '<td align="center" bgcolor="#ffffcc">' +
        '<input class="itemReduceBy" type="input" value="1">' +
        '</td>' +
        '<td align="center" bgcolor="#ffffcc">' +
        '<select class="itemRate">' +
        '<option value="np">NP</option>' +
        '<option value="%">%</option>' +
        '</select>' +
        '</td>' +
        '<td align="center" bgcolor="#ffffcc">' +
        '<select class="itemSearchType">' +
        '<option value="search">Search</option>' +
        '<option value="pc">Price Check</option>' +
        '<option value="none">None</option>' +
        '</select>' +
        '</td>' +
        '<td class="lowestPriceCell" width="50" align="center" bgcolor="#ffffcc"></td>'
    );
});
$('.itemReduceBy').css({
    'width': '60px'
});

//autoprice button function
$('#autoPrice').click(function() {
    banned = false;
    lowerPrice = parseInt($('#lowerPrice').val());
    finalPrice = parseInt($('#finalPrice').val());
    if ($('.sswdrop.panel_hidden').length)
        $('#sswmenu div.imgmenu').click();
    $('form[action="process_market.phtml"] table tbody tr').not(':first').not(':last').each(function() {
        if ($(this).find('td input').val() == 0 || $(this).find('.itemReprice:eq(0)').is(':checked'))
            $(document).queue('prices', createPrice($(this)));
    });

    $(document).queue('prices', function() {
        console.log("finished pricing");
    });

    $(document).dequeue('prices');
});

function createPrice(item) {
    return function(next) {
        doPrice(item, next);
    };
}

function doPrice(item, next) {
    itemName = item.find('td b').first().html();
    searchType = item.find('.itemSearchType:eq(0)').val();
    console.log(itemName);
    console.log(searchType);

    if (itemName.indexOf('pin_prefs.phtml') != -1) {
        console.log("Don't process, pin");
        next();
    } else if (item.find('.itemIgnore:eq(0)').is(':checked')) {
        console.log("Don't process, ignored");
        next();
    } else {
        submitted = submitSSW(itemName, searchType);
        waitForResults = setInterval(function() {
            var gotResults = !submitted;
            if (!gotResults)
                gotResults = checkForNoSearchDeduction(item, searchType);
            if (!gotResults)
                gotResults = checkForSearchResults(item, searchType);
            if (!gotResults)
                gotResults = checkForPriceCheck(item);
            if (!gotResults)
                gotResults = checkForError(item);
            if (!gotResults)
                if (checkSearchLimit())
                    submitted = submitSSW(itemName, searchType);
            if (gotResults)
                moveToNextItem(next);
        }, 100);
    }
}

function processItem() {

}

function submitSSW(itemName, searchType) {
    if (searchType == "none")
        return true;
    $('#searchstr').val(itemName);
    $('#ssw-criteria').val('exact');
    if ((banned && $('#priceAfterBan').is(':checked')) || searchType == "pc")
        $('#price-limited').prop('checked', true);
    else if (!banned)
        $('#price-limited').prop('checked', false);
    else
        return false;

    $('#button-search').click();
    return true;
}

function checkForNoSearchDeduction(item, searchType) {
    if (searchType == "none") {
        setLowestPrice(item, searchType);
        return true;
    }
    return false;
}

function checkForSearchResults(item, searchType) {
    if ($('#results_table').length) {
        console.log("Search complete");
        setLowestPrice(item, searchType);
        addLowestPriceLinks(item);
        resetSearch();
        return true;
    }
    return false;
}

function checkForPriceCheck(item) {
    if ($('#results').html().indexOf("average") > -1) {
        console.log("Price Check complete");
        addPriceCheck(item);
        resetSearch();
        return true;
    }
    return false;
}

function checkForError() {
    if ($('#ssw_error_result').length) {
        resetSearch();
        return true;
    }
    return false;
}

function checkSearchLimit(item) {
    message = $('#results b').first().html();
    if (message != null) {
        if (message.indexOf("Whoa there") > -1) {
            waitTime = parseInt($('#results p.pmod b').html());
            console.log("Hit search limit, setting banned");
            banned = true;
            return true;
        }
    }
    return false;
}

function resetSearch() {
    $('#results_table').remove();
    $('#button-new-search').click();
}

function moveToNextItem(next, searchType) {
    clearInterval(waitForResults);
    if (searchType == "none") {
        next();
    } else {
        setTimeout(function() {
            console.log('pausing for next item');
            next();
        }, getRandomWait());
    }
}

function getRandomWait() {
    return Math.round(Math.random() * (maxSearchSpeed - minSearchSpeed)) + minSearchSpeed;
}

function setLowestPrice(item, searchType) {
    if (searchType == "search")
        price = parseInt($('#results_table tbody tr').not(':first').first().find('td:nth-child(3)').html().replace(",", "").replace(" NP", ""));
    else
        price = item.find('td input').first().val();

    reduceBy = parseInt(item.find('.itemReduceBy:eq(0)').val());
    rate = item.find('.itemRate:eq(0)').val();

    if (rate == "np")
        amount = reduceBy;
    else
        amount = Math.round(price * (reduceBy / 100));

    console.log("Setting price lowest price - " + amount);

    if (price > 1) price -= amount;

    if (lowerPrice > 0 && finalPrice > 0) {
        if (price < lowerPrice)
            price = finalPrice;
    }
    if ($('#results_table tbody tr').not(':first').first().find('td a').first().html() != userName || item.find('.itemLowerOwn:eq(0)').is(':checked')) {
        console.log("Setting price to " + price);
        item.find('td input').first().val(price);
    }
}

function addPriceCheck(item) {
    result = $('#results').html();
    item.find('.lowestPriceCell:eq(0)').html(result.substring(result.indexOf(':') + 1, result.length).trim());
}

function addLowestPriceLinks(item) {
    var lowestPriceUrls = "";
    var lowestPrice = 0;
    var secondLowest = 0;
    $('#results_table tbody tr').not(':first').each(function() {
        additionalClass = "";
        if ($(this).find('td a').first().html() == userName) {
            console.log("adding class to your price");
            additionalClass = "yourPrice";
        }
        lowestPriceUrls += '<a class="lowestPriceUrl ' + additionalClass + '" href="' + $(this).find('td a').first().attr('href') + '">' + $(this).find('td:nth-child(3)').html() + '</a><br>';
    });
    item.find('.lowestPriceCell:eq(0)').html(lowestPriceUrls);
    findUnderpriced(item.find('.lowestPriceCell'));
    $('.redPrice').css({
        'color': 'red'
    });
    $('.yourPrice').css({
        'color': 'green'
    });
}

function findUnderpriced(item) {
    firstUrl = item.find('.lowestPriceUrl:eq(0)');
    secondUrl = item.find('.lowestPriceUrl:eq(1)');
    lowestPrice = firstUrl.html().replace(",", "").replace(" NP", "");
    secondLowest = secondUrl.html().replace(",", "").replace(" NP", "");
    console.log('lowestPrice = ' + lowestPrice);
    console.log('secondLowest = ' + secondLowest);

    if (lowestPrice > 0 && secondLowest > 0) {
        priceDiff = (1 - (lowestPrice / secondLowest)) * 100;
        console.log('priceDiff = ' + priceDiff);
        if (priceDiff >= parseInt($('#lowDiff').val())) {
            console.log("large difference between two lowest prices");
            firstUrl.addClass('redPrice');
            secondUrl.addClass('redPrice');
        }
    }
}