71
src/services/updateData.ts
Normal file
71
src/services/updateData.ts
Normal file
@ -0,0 +1,71 @@
|
||||
import { Point } from "@influxdata/influxdb-client";
|
||||
import { w3cwebsocket as WebsocketClient } from "websocket";
|
||||
import { InfluxWriteAPI } from "..";
|
||||
import { connectMongo } from "../db/mongo";
|
||||
import { LeaderboardSchema } from "../db/schemas/leaderboard";
|
||||
const fetch = require("node-fetch");
|
||||
|
||||
async function update() {
|
||||
const response = await fetch("https://scoresaber.com/api/players/count");
|
||||
const count = await response.text();
|
||||
|
||||
const point = new Point("scoresaber")
|
||||
.tag("type", "player_count")
|
||||
.intField("value", parseInt(count))
|
||||
.timestamp(new Date());
|
||||
InfluxWriteAPI.writePoint(point);
|
||||
|
||||
console.log(`Updated player count to ${count}`);
|
||||
}
|
||||
|
||||
async function connectWebsocket() {
|
||||
await connectMongo();
|
||||
const leaderboard = await LeaderboardSchema.findOne({ _id: "scoresaber" });
|
||||
if (!leaderboard) {
|
||||
await LeaderboardSchema.create({ _id: "scoresaber", totalPlays: 0 });
|
||||
}
|
||||
let totalScores = leaderboard?.totalPlays || 0;
|
||||
|
||||
const socket = new WebsocketClient("wss://scoresaber.com/ws");
|
||||
socket.onopen = () => {
|
||||
console.log("Connected to websocket");
|
||||
};
|
||||
|
||||
socket.onclose = () => {
|
||||
console.log("Disconnected from websocket");
|
||||
setTimeout(connectWebsocket, 5000);
|
||||
};
|
||||
|
||||
socket.onerror = (error) => {
|
||||
console.error("Websocket error:", error);
|
||||
};
|
||||
|
||||
socket.onmessage = (message) => {
|
||||
const data = message.data;
|
||||
let json;
|
||||
try {
|
||||
json = JSON.parse(data.toString());
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
|
||||
const commandName = json.commandName;
|
||||
const commandData = json.commandData;
|
||||
if (commandName == "score") {
|
||||
totalScores++;
|
||||
LeaderboardSchema.updateOne(
|
||||
{ _id: "scoresaber" },
|
||||
{ totalPlays: totalScores }
|
||||
).exec();
|
||||
const point = new Point("scoresaber")
|
||||
.tag("type", "score_count")
|
||||
.intField("value", totalScores)
|
||||
.timestamp(new Date());
|
||||
InfluxWriteAPI.writePoint(point);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
update();
|
||||
connectWebsocket();
|
||||
setInterval(update, 60_000); // 1 minute
|
Reference in New Issue
Block a user