121 lines
3.4 KiB
JavaScript
121 lines
3.4 KiB
JavaScript
import express from "express";
|
|
import dotenv from "dotenv";
|
|
import path from "path";
|
|
|
|
const usernames = [
|
|
{name: "rubylium__", status: "off", id: ""},
|
|
{name: "lukkstv", status: "off", id: ""},
|
|
{name: "havvenfr", status: "off", id: ""},
|
|
{name: "olmanntv", status: "off", id: ""},
|
|
{name: "nina_asmr", status: "off", id: ""},
|
|
{name: "krw_aka", status: "off", id: ""},
|
|
{name: "leetgamer54", status: "off", id: ""},
|
|
{name: "coshiho", status: "off", id: ""},
|
|
{name: "soramicia", status: "off", id: ""},
|
|
{name: "entocraft", status: "off", id: ""},
|
|
{name: "steakfritees_", status: "off", id: ""},
|
|
{name: "dancyy_", status: "off", id: ""},
|
|
{name: "tchoupyy_", status: "off", id: ""},
|
|
{name: "thesollann", status: "off", id: ""},
|
|
];
|
|
|
|
dotenv.config();
|
|
|
|
const app = express();
|
|
|
|
const port = process.env.PORT || 3000;
|
|
|
|
let token = "";
|
|
let config = {};
|
|
|
|
const checkEnvVars = () => {
|
|
const requiredEnvVars = ["CLIENT_ID", "CLIENT_SECRET"];
|
|
let error = false;
|
|
requiredEnvVars.forEach((envVar) => {
|
|
if (process.env[envVar] === undefined) {
|
|
error = true;
|
|
console.log(`${envVar} is undefined`);
|
|
} else {
|
|
config[envVar] = process.env[envVar];
|
|
}
|
|
});
|
|
if (error) {
|
|
process.exit(1);
|
|
}
|
|
};
|
|
|
|
checkEnvVars();
|
|
|
|
function init() {
|
|
const url = `https://id.twitch.tv/oauth2/token?client_id=${config.CLIENT_ID}&client_secret=${config.CLIENT_SECRET}&grant_type=client_credentials`;
|
|
|
|
fetch(url, { method: "POST" })
|
|
.then((response) => response.json())
|
|
.then((data) => {
|
|
token = data.access_token;
|
|
getAllUsersStatus();
|
|
setInterval(getAllUsersStatus, 60000);
|
|
});
|
|
}
|
|
|
|
init();
|
|
|
|
async function getAllUsersStatus() {
|
|
for (let i = 0; i < usernames.length; i++) {
|
|
const userData = await getUserStatus(usernames[i].name, usernames[i].id);
|
|
usernames[i] = { ...usernames[i], ...userData };
|
|
if (i === usernames.length - 1) {
|
|
console.log("Successfully updated all users");
|
|
}
|
|
}
|
|
}
|
|
|
|
app.use("/api/status", api);
|
|
|
|
function api(req, res, next) {
|
|
res.json(usernames);
|
|
}
|
|
|
|
async function getUserStatus(username, id) {
|
|
const userData = {};
|
|
if (id === "") {
|
|
const userUrl = `https://api.twitch.tv/helix/users?login=${username}`;
|
|
const response = await fetch(userUrl, {
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
"Client-ID": config.CLIENT_ID,
|
|
},
|
|
});
|
|
const data = await response.json();
|
|
userData.id = data.data[0].id;
|
|
userData.profilePicture = data.data[0].profile_image_url;
|
|
id = data.data[0].id;
|
|
}
|
|
const streamUrl = `https://api.twitch.tv/helix/streams?user_id=${id}`;
|
|
const streamResponse = await fetch(streamUrl, {
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
"Client-ID": config.CLIENT_ID,
|
|
},
|
|
});
|
|
const streamData = await streamResponse.json();
|
|
if (streamData.data.length > 0) {
|
|
userData.status = "live";
|
|
} else {
|
|
userData.status = "offline";
|
|
}
|
|
return userData;
|
|
}
|
|
|
|
const staticDist = express.static(path.join(path.resolve(), "./public"));
|
|
|
|
app.use(staticDist);
|
|
|
|
const server = app.listen(port, () => {
|
|
console.log(`Server listening on port ${port}`);
|
|
});
|
|
|
|
server.on("error", (err) => {
|
|
console.error(err);
|
|
});
|