Violets-Cache/index.js

173 lines
5.4 KiB
JavaScript
Raw Normal View History

2024-06-01 13:19:36 -05:00
const express = require("express"),
fs = require("fs"),
path = require("path"),
2024-09-26 23:41:36 -05:00
WebSocket = require('ws'),
sharp = require("sharp")
2024-06-01 13:19:36 -05:00
const PORT = process.env.PORT || 8080
const cachePath = path.join(__dirname, "cache"),
2024-06-10 20:20:38 -05:00
cacheFile = path.join(__dirname, "cache.json")
2024-06-01 13:19:36 -05:00
2024-06-10 15:40:44 -05:00
var lanyardData
2024-06-01 13:19:36 -05:00
if (!fs.existsSync(cachePath)) { fs.mkdirSync(cachePath) }
2024-06-10 20:20:38 -05:00
if (!fs.existsSync(cacheFile)) {
fs.writeFileSync(cacheFile, fs.readFileSync(path.join(__dirname, "defaults/cache.json")))
2024-06-08 16:52:20 -05:00
}
var cacheDirs = ["songs", "imgs"]
for (var i = 0; i < cacheDirs.length; i++) {
if (!fs.existsSync(path.join(cachePath, cacheDirs[i]))) {
fs.mkdirSync(path.join(cachePath, cacheDirs[i]))
}
}
2024-06-10 20:20:38 -05:00
const imgCache = path.join(cachePath, "imgs")
2024-06-01 13:19:36 -05:00
var app = express()
2024-06-08 16:13:57 -05:00
const imgWaitMax = 2
2024-06-03 00:04:34 -05:00
2024-06-01 13:19:36 -05:00
app.get("/cached/*", (req, res) => {
var imgURL = req.originalUrl
imgURL = imgURL.substring(imgURL.indexOf("/", 2) + 1)
2024-06-08 16:52:20 -05:00
var imgData = cachedImages.imgs[imgURL]
2024-06-03 00:04:34 -05:00
var imgWait = 0
function waitForImage() {
if (imgWait < imgWaitMax) {
2024-06-03 00:07:36 -05:00
imgWait += 0.1
setTimeout(() => {
imgData = cachedImages.imgs[imgURL]
if (imgData) {
fs.createReadStream(path.join(imgCache, imgData.file)).pipe(res)
} else {
2024-06-10 19:24:46 -05:00
waitForImage()
}
}, 100);
2024-06-03 00:04:34 -05:00
} else {
fs.createReadStream(path.join(__dirname, "/imgs/notFound.png")).pipe(res)
}
}
if (imgData) {
fs.createReadStream(path.join(imgCache, imgData.file)).pipe(res)
} else {
waitForImage()
}
2024-06-01 13:19:36 -05:00
})
app.listen(PORT, () => {
console.log("Violet's cache is now listening on port: " + PORT)
})
var cachedImages = JSON.parse(fs.readFileSync(cacheFile))
var constants = JSON.parse(fs.readFileSync(path.join(__dirname, "constants.json")))
var activityImages = constants.activityImages
2024-08-11 03:32:35 -05:00
var thumborURL = "https://thumbor.violets-purgatory.dev/unsafe/"
2024-06-01 13:19:36 -05:00
var imgExtension = "png"
var thumborArgs = `filters:format(${imgExtension})/`
function get_img_url(activity, size = "large_image") {
if ("assets" in activity) {
var image = activity.assets[size]
if (image) {
if (image.includes("https/")) {
return decodeURIComponent('https://' + image.substr(image.indexOf('https/') + 6, image.length))
} else if (image.includes("spotify")) {
return decodeURIComponent('https://i.scdn.co/image/' + image.substr(image.indexOf('spotify:') + 8, image.length))
} else {
return decodeURIComponent('https://cdn.discordapp.com/app-assets/' + activity.application_id + "/" + image + ".png")
}
}
}
if (!image && size == "large_image") {
if (activity.name in activityImages) {
return decodeURIComponent(activityImages[activity.name])
}
}
return null
}
function socketeer() {
var lanyard = new WebSocket('https://api.violets-purgatory.dev')
lanyard.on("error", (error) => {
console.log(error)
})
lanyard.on("close", () => {
console.log("Connection Closed. Attempting Reconnect in 30 seconds.")
setTimeout(() => {
socketeer()
}, 30000);
})
function ping(dur) {
lanyard.send(JSON.stringify({
op: 3
}))
setTimeout(() => {
ping(dur)
if (Date.now() - lastPong > 120000) {
lanyard.close()
console.log("Max duration since last pong exceeded- Closing socket.")
}
}, dur);
}
lanyard.addEventListener("message", async (res) => {
var data = JSON.parse(res.data)
// console.log(data.op)
if (data.op == 1) {
console.log("Connected to API Websocket!")
ping(30000)
lastPong = Date.now()
} else if (data.op == 3) {
lastPong = Date.now()
} else if (data.op == 0) {
2024-06-10 15:40:44 -05:00
lanyardData = data.d
2024-06-01 13:19:36 -05:00
for (let index = 0; index < lanyardData.activities.length; index++) {
const activity = lanyardData.activities[index];
var imgType = undefined
2024-09-26 23:41:36 -05:00
var imgRes = 512
for (var i = 0; i < 2; i++) {
if (get_img_url(activity, imgType)) {
var url = get_img_url(activity, imgType)
var fn = Object.keys(cachedImages.imgs).length + "." + imgExtension
var fp = path.join(imgCache, fn)
if (!cachedImages.imgs[url]) {
2024-09-26 23:41:36 -05:00
const response = await (await fetch(url)).arrayBuffer()
2024-09-26 23:41:36 -05:00
const converted = await sharp(response)
.resize(imgRes, imgRes)
.png({ progressive: true })
.toBuffer()
fs.writeFileSync(fp, converted)
cachedImages.imgs[url] = {
"file": fn,
"lastUpdated": Date.now()
}
2024-09-26 23:41:36 -05:00
fs.writeFileSync(cacheFile, JSON.stringify(cachedImages))
}
imgType = "small_image"
2024-09-26 23:41:36 -05:00
imgRes = 128
}
}
2024-06-01 13:19:36 -05:00
}
}
})
}
socketeer()