hypixel-auction-notifier/index.js

140 lines
5.2 KiB
JavaScript
Raw Normal View History

2022-08-06 19:02:15 +02:00
const {default: axios} = require("axios")
const config = require("./config.json")
const discord = require('discord.js')
const {Worker} = require("worker_threads")
const { asyncInterval, addNotation } = require("./src/helperFunctions")
let threadsToUse = config.data["threadsToUse/speed"] ?? 1
let lastUpdated = 0
let doneWorkers = 0
let startingTime
let maxPrice = 0
let itemDatas = {}
const workers = []
const webhookRegex = /https:\/\/discord.com\/api\/webhooks\/(.+)\/(.+)/
const bazaarPrice = {
"RECOMBOBULATOR_3000": 0,
"HOT_POTATO_BOOK": 0,
"FUMING_POTATO_BOOK": 0
}
async function initialize() {
matches = config.webhook.discordWebhookUrl.match(webhookRegex)
if (!matches) return console.log(`[Main thread] Couldn't parse Webhook URL`)
const webhook = new discord.WebhookClient(matches[1], matches[2]);
await getBzData()
await getMoulberry()
await getLBINs()
for (let j = 0; j < threadsToUse; j++) {
workers[j] = new Worker('./AuctionHandler.js', {
workerData: {
itemDatas: itemDatas,
bazaarData: bazaarPrice,
workerNumber: j,
maxPrice: maxPrice
}
})
workers[j].on("message", async (result) => {
if (result.itemData !== undefined) {
if (result.auctionData.lbin >= result.auctionData.price) {
await webhook.send({
username: config.webhook.webhookName,
avatarURL: config.webhook.webhookPFP,
embeds: [new discord.MessageEmbed()
.setTitle(`**${(result.itemData.name).replaceAll(/§./g, '')}**`)
.setColor("#2e3137")
.setThumbnail(`https://sky.shiiyu.moe/item/${result.itemData.id}`)
.setDescription(`Auction: \`/viewauction ${result.auctionData.auctionID}\`\nProfit: \`${addNotation("oneLetters", (result.auctionData.profit))} (${result.auctionData.percentProfit}%)\`\nCost: \`${addNotation("oneLetters", (result.auctionData.price))}\`\nLBIN: \`${addNotation("oneLetters", (result.auctionData.lbin))}\`\nSales/Day: \`${addNotation("oneLetters", result.auctionData.sales)}\`\nType: \`${result.auctionData.ahType}\``)
]
})
}
} else if (result === "finished") {
doneWorkers++
if (doneWorkers === threadsToUse) {
doneWorkers = 0
console.log(`Completed in ${(Date.now() - startingTime) / 1000} seconds`)
startingTime = 0
workers[0].emit("done")
}
}
});
}
asyncInterval(async () => {
await getLBINs()
workers.forEach((worker) => {
worker.postMessage({type: "moulberry", data: itemDatas})
})
}, "lbin", 60000)
asyncInterval(async () => {
await getMoulberry()
workers.forEach((worker) => {
worker.postMessage({type: "moulberry", data: itemDatas})
})
}, "avg", 60e5)
asyncInterval(async () => {
return new Promise(async (resolve) => {
const ahFirstPage = await axios.get("https://api.hypixel.net/skyblock/auctions?page=0")
const totalPages = ahFirstPage.data.totalPages
if (ahFirstPage.data.lastUpdated === lastUpdated) {
resolve()
} else {
lastUpdated = ahFirstPage.data.lastUpdated
startingTime = Date.now()
console.log("Getting auctions..")
workers.forEach((worker) => {
worker.postMessage({type: "pageCount", data: totalPages})
})
workers[0].once("done", () => {
resolve()
})
}
})
}, "check", 0)
}
async function getLBINs() {
const lbins = await axios.get("https://moulberry.codes/lowestbin.json")
const lbinData = lbins.data
for (const item of Object.keys(lbinData)) {
if (!itemDatas[item]) itemDatas[item] = {}
itemDatas[item].lbin = lbinData[item]
}
}
async function getMoulberry() {
const moulberryAvgs = await axios.get("https://moulberry.codes/auction_averages/3day.json")
const avgData = moulberryAvgs.data
for (const item of Object.keys(avgData)) {
itemDatas[item] = {}
const itemInfo = avgData[item]
if (itemInfo.sales !== undefined) {
itemDatas[item].sales = itemInfo.sales
} else {
itemDatas[item].sales = 0
}
if (itemInfo.clean_price) {
itemDatas[item].cleanPrice = itemInfo.clean_price
} else {
itemDatas[item].cleanPrice = itemInfo.price
}
}
}
async function getBzData() {
const bzData = await axios.get("https://api.hypixel.net/skyblock/bazaar")
bazaarPrice["RECOMBOBULATOR_3000"] = bzData.data.products.RECOMBOBULATOR_3000.quick_status.buyPrice
bazaarPrice["HOT_POTATO_BOOK"] = bzData.data.products.HOT_POTATO_BOOK.quick_status.buyPrice
bazaarPrice["FUMING_POTATO_BOOK"] = bzData.data.products.FUMING_POTATO_BOOK.quick_status.buyPrice
}
initialize()