import { InfluxDB, Point } from "@influxdata/influxdb-client"; import * as dotenv from "dotenv"; import { w3cwebsocket as WebsocketClient } from "websocket"; import { connectMongo } from "./db/mongo"; import { LeaderboardSchema } from "./db/schemas/leaderboard"; const fetch = require("node-fetch"); dotenv.config(); const INFLUXDB_URL = process.env.INFLUXDB_URL; const INFLUXDB_ORG = process.env.INFLUXDB_ORG; const INFLUXDB_BUCKET = process.env.INFLUXDB_BUCKET; const INFLUXDB_TOKEN = process.env.INFLUXDB_TOKEN; if (!INFLUXDB_URL || !INFLUXDB_ORG || !INFLUXDB_BUCKET || !INFLUXDB_TOKEN) { throw new Error("Missing InfluxDB environment variables"); } const writeApi = new InfluxDB({ url: INFLUXDB_URL, token: INFLUXDB_TOKEN, }).getWriteApi(INFLUXDB_ORG, INFLUXDB_BUCKET, "ms"); 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()); writeApi.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") .intField("value", totalScores) .timestamp(new Date()); writeApi.writePoint(point); } }; } update(); connectWebsocket(); setInterval(update, 60_000); // 1 minute