352 lines
No EOL
12 KiB
JavaScript
Executable file
352 lines
No EOL
12 KiB
JavaScript
Executable file
/*
|
|
Proper pagination will be added in v1.2.3
|
|
*/
|
|
|
|
Username = window.location.pathname.split('/')[2];
|
|
let UserID;
|
|
let ItemGrid;
|
|
|
|
let _Utilities;
|
|
|
|
if (window.location.pathname.split('/')[3] === 'inventory') {
|
|
!(async () => {
|
|
UserID = (await (await fetch('https://api.polytoria.com/v1/users/find?username=' + Username )).json()).id;
|
|
ItemGrid = document.getElementsByClassName('itemgrid')[0];
|
|
|
|
/*
|
|
Rewritten item wishlist function will take in the data with a parameter instead
|
|
*/
|
|
chrome.storage.sync.get(['PolyPlus_Settings'], async function(result){
|
|
_Utilities = await import(chrome.runtime.getURL('resources/utils.js'));
|
|
_Utilities = _Utilities.default
|
|
|
|
Settings = result.PolyPlus_Settings
|
|
|
|
const Nav = document.getElementsByClassName('nav-pills')[0];
|
|
|
|
if (Settings.ItemWishlistOn && Username === JSON.parse(window.localStorage.getItem('p+account_info')).Username) {
|
|
let WishlistNav = document.createElement('li');
|
|
WishlistNav.classList.add('nav-item');
|
|
WishlistNav.innerHTML = `
|
|
<a href="${ (window.location.pathname.split('/')[4] !== '') ? '../wishlist/' : 'wishlist/' }" class="nav-link">
|
|
<i class="fa-regular fa-list me-1"></i>
|
|
<span class="pilltitle">Item Wishlist</span>
|
|
</a>
|
|
`;
|
|
Nav.appendChild(WishlistNav);
|
|
|
|
if (window.location.pathname.split('/')[4] === 'wishlist') {
|
|
Array.from(Nav.children).forEach((element) => {
|
|
element = element.children[0];
|
|
if (!(element === WishlistNav)) {
|
|
if (element.classList.contains('active')) {
|
|
element.classList.remove('active');
|
|
}
|
|
}
|
|
});
|
|
WishlistNav.children[0].classList.add('active');
|
|
|
|
ItemWishlist()
|
|
}
|
|
}
|
|
|
|
if (Settings.CollectibleInventoryCatOn) {
|
|
let CollectibleNav = document.createElement('li');
|
|
CollectibleNav.classList.add('nav-item');
|
|
CollectibleNav.innerHTML = `
|
|
<a href="${ (window.location.pathname.split('/')[4] !== '') ? '../collectibles/' : 'collectibles/' }" class="nav-link">
|
|
<i class="fa-regular fa-sparkles me-1"></i>
|
|
<span class="pilltitle">Collectibles</span>
|
|
</a>
|
|
`;
|
|
Nav.appendChild(CollectibleNav);
|
|
|
|
if (window.location.pathname.split('/')[4] === 'collectibles') {
|
|
Array.from(Nav.children).forEach((element) => {
|
|
element = element.children[0];
|
|
if (!(element === CollectibleNav)) {
|
|
if (element.classList.contains('active')) {
|
|
element.classList.remove('active');
|
|
}
|
|
}
|
|
});
|
|
CollectibleNav.children[0].classList.add('active');
|
|
|
|
let HoardedCard = document.createElement('li');
|
|
HoardedCard.classList.add('nav-item');
|
|
HoardedCard.classList.add('text-center');
|
|
HoardedCard.innerHTML = `
|
|
<h6 class="section-title mt-3 px-2">
|
|
Hoarded Items
|
|
</h6>
|
|
<div class="card bg-dark mt-2">
|
|
<div class="card-body" id="p+hoarded_card"></div>
|
|
</div>
|
|
`;
|
|
Nav.appendChild(HoardedCard);
|
|
|
|
CollectibleCategory()
|
|
}
|
|
}
|
|
});
|
|
})();
|
|
}
|
|
|
|
/*
|
|
Item Wishlist will be rewritten in v1.2.3
|
|
*/
|
|
function ItemWishlist() {
|
|
const ItemGrid = document.getElementsByClassName('itemgrid')[0];
|
|
const ItemCardContents = `
|
|
<a href="/store/:ItemID" class="text-reset">
|
|
<div class="card mb-2">
|
|
:LimitedTag
|
|
<div class="card-body">
|
|
<img src=":ItemThumbnail" class="img-fluid rounded">
|
|
</div>
|
|
</div>
|
|
<h6 class="text-truncate mb-0">
|
|
:ItemName
|
|
</h6>
|
|
</a>
|
|
<small class="text-muted d-block mb-1">
|
|
by <a href="/users/:CreatorID" class="text-muted">:CreatorName</a>
|
|
</small>
|
|
<button class="polyplus-itemwish-removebtn btn btn-danger btn-sm" style="width: 100%;">X</button>
|
|
`;
|
|
|
|
ItemGrid.innerHTML = ''
|
|
document.getElementsByClassName('pagination')[0].remove()
|
|
const Search = document.createElement('div');
|
|
Search.classList = 'row';
|
|
Search.innerHTML = `
|
|
<div class="col-auto">
|
|
<select class="form-select" id="polyplus-itemwish-type" style="width: 150px;">
|
|
<option value="any">Any</option>
|
|
<option value="hat">Hat</option>
|
|
<option value="face">Faces</option>
|
|
<option value="tool">Tools</option>
|
|
<option value="shirt">Shirt</option>
|
|
<option value="pants">Pants</option>
|
|
</select>
|
|
</div>
|
|
<div class="col">
|
|
<input id="polyplus-itemwish-searchbar" type="text" class="form-control bg-dark" placeholder="Search...">
|
|
</div>
|
|
<div class="col-auto">
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" value="" id="polyplus-itemwish-isLimited">
|
|
<label class="form-check-label" for="polyplus-itemwish-isLimited">
|
|
Is Collectible?
|
|
<span class="text-muted" style="font-size: 0.65rem; display: block;">Items that are collectible</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-auto">
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" value="" id="polyplus-itemwish-isAvailable">
|
|
<label class="form-check-label" for="polyplus-itemwish-isAvailable">
|
|
Is Available?
|
|
<span class="text-muted" style="font-size: 0.65rem; display: block; width: 170px;">Items that are equal to or less than the budget (excluding limiteds)</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
`;
|
|
ItemGrid.parentElement.prepend(document.createElement('br'), ItemGrid.parentElement.children[0]);
|
|
ItemGrid.parentElement.prepend(Search, ItemGrid.parentElement.children[0]);
|
|
|
|
let Type = document.getElementById('polyplus-itemwish-type');
|
|
let SearchBar = document.getElementById('polyplus-itemwish-searchbar');
|
|
let IsLimited = document.getElementById('polyplus-itemwish-isLimited');
|
|
let IsAvailable = document.getElementById('polyplus-itemwish-isAvailable');
|
|
|
|
Type.addEventListener('change', function () {
|
|
Update(Type.options[Type.selectedIndex].value, SearchBar.value, IsLimited.checked, IsAvailable.checked);
|
|
});
|
|
|
|
SearchBar.addEventListener('change', function () {
|
|
Update(Type.options[Type.selectedIndex].value, SearchBar.value, IsLimited.checked, IsAvailable.checked);
|
|
});
|
|
|
|
IsLimited.addEventListener('change', function () {
|
|
Update(Type.options[Type.selectedIndex].value, SearchBar.value, IsLimited.checked, IsAvailable.checked);
|
|
});
|
|
|
|
IsAvailable.addEventListener('change', function () {
|
|
Update(Type.options[Type.selectedIndex].value, SearchBar.value, IsLimited.checked, IsAvailable.checked);
|
|
});
|
|
|
|
chrome.storage.sync.get(['PolyPlus_ItemWishlist'], function (result) {
|
|
let Wishlist = result.PolyPlus_ItemWishlist || [];
|
|
console.log('wishlist: ', Wishlist);
|
|
Wishlist.forEach((element) => {
|
|
let NewItemCard = document.createElement('div');
|
|
NewItemCard.classList = 'px-0';
|
|
fetch('https://api.polytoria.com/v1/store/' + element)
|
|
.then((response) => response.json())
|
|
.then((data) => {
|
|
NewItemCard.innerHTML = ItemCardContents.replace(':ItemID', data.id)
|
|
.replace(':ItemThumbnail', data.thumbnail)
|
|
.replace(':ItemName', data.name)
|
|
.replace(':CreatorID', data.creator.id)
|
|
.replace(':CreatorName', data.creator.name);
|
|
if (data.isLimited === true) {
|
|
NewItemCard.innerHTML = NewItemCard.innerHTML.replace(':LimitedTag', '<div class="ribbon ribbon-limited ribbon-top-right"><span>Limited</span></div>');
|
|
} else {
|
|
NewItemCard.innerHTML = NewItemCard.innerHTML.replace(':LimitedTag', '');
|
|
}
|
|
NewItemCard.setAttribute('data-id', data.id);
|
|
NewItemCard.setAttribute('data-name', data.name);
|
|
NewItemCard.setAttribute('data-type', data.type);
|
|
NewItemCard.setAttribute('data-creator', data.creator.name);
|
|
NewItemCard.setAttribute('data-limited', data.isLimited);
|
|
if (data.isLimited === false) {
|
|
NewItemCard.setAttribute('data-price', data.price);
|
|
}
|
|
|
|
ItemGrid.appendChild(NewItemCard);
|
|
|
|
NewItemCard.getElementsByClassName('polyplus-itemwish-removebtn')[0].addEventListener('click', function () {
|
|
let Index = Wishlist.indexOf(parseInt(NewItemCard.getAttribute('data-id')));
|
|
if (Index === -1) {
|
|
NewItemCard.remove();
|
|
return;
|
|
} else {
|
|
Wishlist.splice(Index, 1);
|
|
console.log(Wishlist);
|
|
NewItemCard.remove();
|
|
}
|
|
chrome.storage.sync.set({PolyPlus_ItemWishlist: Wishlist, arrayOrder: true}, function () {
|
|
console.log('ItemWishlist successfully saved: ' + ItemWishlist);
|
|
});
|
|
});
|
|
})
|
|
.catch((error) => {
|
|
console.error('Error:', error);
|
|
});
|
|
});
|
|
});
|
|
|
|
const Update = function(type, query, isLimited, isAvailable) {
|
|
let ItemGrid = document.getElementsByClassName('itemgrid')[0];
|
|
let BrickBalance = parseInt(JSON.parse(window.localStorage.getItem('p+account_info')).Bricks);
|
|
query = query.toLowerCase();
|
|
let Results = Array.from(ItemGrid.children);
|
|
for (let i = 0; i < Results.length; i++) {
|
|
let Show = true;
|
|
|
|
console.log('type: ', type);
|
|
if (!(type === 'any')) {
|
|
console.log("isn't any");
|
|
if (!(Results[i].getAttribute('data-type') === type)) {
|
|
Show = false;
|
|
}
|
|
}
|
|
|
|
if (!Results[i].getAttribute('data-name').toLowerCase().startsWith(query)) {
|
|
Show = false;
|
|
}
|
|
|
|
if (isLimited === true) {
|
|
if (!(Results[i].getAttribute('data-limited') === 'true')) {
|
|
Show = false;
|
|
}
|
|
}
|
|
|
|
if (isAvailable === true) {
|
|
if (!(parseInt(Results[i].getAttribute('data-price')) <= BrickBalance)) {
|
|
Show = false;
|
|
}
|
|
}
|
|
|
|
if (Show === true) {
|
|
Results[i].style.display = 'block';
|
|
} else {
|
|
Results[i].style.display = 'none';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
async function CollectibleCategory() {
|
|
ItemGrid.innerHTML = ''
|
|
document.getElementsByClassName('pagination')[0].remove()
|
|
const CollectibleItemTypes = [
|
|
"hat",
|
|
"face",
|
|
"tool"
|
|
]
|
|
const Collectibles = []
|
|
|
|
for (let type of CollectibleItemTypes) {
|
|
const InitialInventory = (await (await fetch('https://api.polytoria.com/v1/users/' + UserID + '/inventory?type=' + type + '&limit=100')).json())
|
|
Collectibles.push(...InitialInventory.inventory.filter((x) => x.asset.isLimited === true))
|
|
|
|
if (InitialInventory.pages > 1) {
|
|
if (InitialInventory.pages > 12) {
|
|
InitialInventory.pages = 12
|
|
}
|
|
|
|
for (let page = 2; page < InitialInventory.pages; page++) {
|
|
const PageResult = (await (await fetch('https://api.polytoria.com/v1/users/' + UserID + '/inventory?type=' + type + '&limit=100&page=' + page)).json())
|
|
Collectibles.push(...PageResult.inventory.filter((x) => x.asset.isLimited === true))
|
|
}
|
|
}
|
|
}
|
|
|
|
const ItemMultiples = []
|
|
Collectibles.forEach(item => {
|
|
const Multiple = ItemMultiples.findIndex((x) => x.asset.id === item.asset.id)
|
|
if (Multiple !== -1) {
|
|
ItemMultiples[Multiple].copies++
|
|
ItemMultiples[Multiple].serials.push(item.serial)
|
|
} else { ItemMultiples.push({asset: item.asset, copies: 1, serials: [item.serial]}) }
|
|
|
|
const ItemColumn = document.createElement('div')
|
|
ItemColumn.classList = 'px-0'
|
|
ItemColumn.innerHTML = `
|
|
<a href="/store/${item.asset.id}" class="text-reset">
|
|
<div class="card mb-2">
|
|
<div class="ribbon ribbon-limited ribbon-top-right"><span>Limited</span></div>
|
|
<div class="card-body">
|
|
<img src="${item.asset.thumbnail}" class="img-fluid rounded">
|
|
<span class="badge bg-dark" style="
|
|
font-weight: lighter;
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 0;
|
|
margin: 5px;
|
|
">#${item.serial}</span>
|
|
</div>
|
|
</div>
|
|
<h6 class="text-truncate mb-0">
|
|
${item.asset.name}
|
|
</h6>
|
|
</a>
|
|
<small class="text-muted d-block mb-1">
|
|
by <a href="/u/Polytoria" class="text-muted">Polytoria</a>
|
|
</small>
|
|
`
|
|
ItemGrid.appendChild(ItemColumn)
|
|
})
|
|
|
|
const Hoarded = ItemMultiples.filter((x) => x.copies > 1)
|
|
|
|
const HoardedCard = document.getElementById('p+hoarded_card')
|
|
Hoarded.forEach(item => {
|
|
const ListElement = document.createElement('div')
|
|
ListElement.classList = 'mb-1 mb-2'
|
|
ListElement.innerHTML = `
|
|
<a href="/store/${item.asset.id}" style="font-size: 0.8rem; color: #454545 !important;">
|
|
<b>${item.asset.name}</b>
|
|
</a>
|
|
<br>
|
|
<span>
|
|
${item.copies} copies <i class="fa-solid fa-circle-info" data-bs-toggle="tooltip" data-bs-title="#${item.serials.sort((a, b) => a - b).join(', #')}"></i>
|
|
</span>
|
|
`
|
|
HoardedCard.appendChild(ListElement)
|
|
})
|
|
|
|
_Utilities.InjectResource("registerTooltips")
|
|
} |