Files
cockinator/lib/avatarRotation.js
Cesium 893c2db0c5 accept discord token as env
we only really need that to function anyway, other things like jellyfin will
just not do anything and we have default value for avatar reset.
2026-03-10 21:14:55 -04:00

78 lines
2.3 KiB
JavaScript

let config = {};
try { config = require('./config.json'); }
catch { config.token = process.env.DISCORD; }
const fs = require('fs');
const path = require('path');
const AVATAR_DIR = path.join(__dirname, '../avatars');
let avatarFiles = [];
let currentAvatarIndex = 0;
function loadAvatars() {
try {
if (!fs.existsSync(AVATAR_DIR)) {
fs.mkdirSync(AVATAR_DIR);
console.log('Avatars: Created avatars directory');
return;
}
const files = fs.readdirSync(AVATAR_DIR);
avatarFiles = files.filter(file => /\.(jpg|jpeg|png|gif|webp)$/i.test(file));
// shuffle
for (let i = avatarFiles.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[avatarFiles[i], avatarFiles[j]] = [avatarFiles[j], avatarFiles[i]];
}
console.log(`Avatars: Loaded ${avatarFiles.length} avatars`);
currentAvatarIndex = 0; // Reset index on reload
} catch (err) {
console.error('Avatars: Error loading avatars:', err);
}
}
async function rotateAvatar(client) {
if (avatarFiles.length === 0) return;
const avatarFile = avatarFiles[currentAvatarIndex];
const avatarPath = path.join(AVATAR_DIR, avatarFile);
try {
await client.user.setAvatar(avatarPath);
console.log(`Avatars: Changed avatar to ${avatarFile}`);
} catch (err) {
console.error(`Avatars: Failed to set avatar to ${avatarFile}:`, err.message || err);
} finally { // discordjs is evil and deletes the token every time the avatar changes
client.rest.setToken(config.token);
}
currentAvatarIndex = (currentAvatarIndex + 1) % avatarFiles.length;
}
function init(client) {
loadAvatars();
let fsWait = null;
fs.watch(AVATAR_DIR, (eventType, filename) => {
if (filename) {
if (fsWait) clearTimeout(fsWait);
fsWait = setTimeout(() => {
console.log(`Avatars: Detected change in avatars directory`);
loadAvatars();
}, 1000);
}
});
const intervalMinutes = config.avatarInterval || 15;
const intervalMs = intervalMinutes * 60 * 1000;
console.log(`Avatars: Starting avatar rotation every ${intervalMinutes} minutes`);
rotateAvatar(client);
setInterval(() => rotateAvatar(client), intervalMs);
}
module.exports = { init };