Compare commits

...

1 Commits

Author SHA1 Message Date
8d340db915 rotate avatars from a folder with fs watch 2026-02-14 02:45:39 -05:00
6 changed files with 86 additions and 3 deletions

View File

@@ -1,3 +1,4 @@
node_modules
.git
config.json
avatars

1
.gitignore vendored
View File

@@ -142,3 +142,4 @@ dist
config.json
state.json
avatars

View File

@@ -1,6 +1,7 @@
{
"token": "bot token go here",
"status": "looking for x.com links",
"avatarInterval": 15,
"parentsAndOrGuardians": [
"230659159450845195",
"297983197990354944"

View File

@@ -4,3 +4,4 @@ services:
build: .
volumes:
- ./config.json:/usr/src/bot/config.json
- ./avatars:/usr/src/bot/avatars

View File

@@ -68,6 +68,8 @@ client.on(Events.InteractionCreate, async interaction => {
client.once(Events.ClientReady, readyClient => {
console.log(`Discord: Connected as ${readyClient.user.tag}`);
client.user.setActivity(config.status, { type: ActivityType.Custom });
const avatarRotation = require('./lib/avatarRotation');
avatarRotation.init(client);
});
client.login(config.token);

77
lib/avatarRotation.js Normal file
View File

@@ -0,0 +1,77 @@
const fs = require('fs');
const path = require('path');
const config = require('../config.json');
const AVATAR_DIR = path.join(__dirname, '../avatars');
let avatarFiles = [];
let currentAvatarIndex = 0;
let timer = null;
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);
}
}
function rotateAvatar(client) {
if (avatarFiles.length === 0) return;
const avatarFile = avatarFiles[currentAvatarIndex];
const avatarPath = path.join(AVATAR_DIR, avatarFile);
try {
client.user.setAvatar(avatarPath);
console.log(`Avatars: Changed avatar to ${avatarFile}`);
} catch (err) {
console.error(`Avatars: Failed to set avatar to ${avatarFile}:`, err);
}
currentAvatarIndex = (currentAvatarIndex + 1) % avatarFiles.length;
}
function init(client) {
loadAvatars();
// Watch for changes in the avatars directory
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`);
// Initial rotation
rotateAvatar(client);
// make it wait every interval before rotating
timer = setInterval(() => rotateAvatar(client), intervalMs);
}
module.exports = { init };