added optional local web dashboard for memory, with seeing/editing memory, daily facts (syncs with discord) and each user

This commit is contained in:
Luna
2026-03-01 13:48:52 +01:00
parent 4ebd94bd30
commit 8aba5399f6
11 changed files with 1377 additions and 36 deletions

95
src/mood.js Normal file
View File

@@ -0,0 +1,95 @@
import { chatCompletion } from './openai.js';
import { getDailyThoughtFromDb, saveDailyThought } from './memory.js';
const dailyMoods = [
['Calm','Soft tone; minimal emojis; low sarcasm; concise and soothing.'],
['Goblin','Chaotic, highenergy replies; random emojis; extra sarcasm and hype.'],
['Philosopher','Deep, reflective answers; longer and thoughtful, a bit poetic.'],
['Hype','Enthusiastic and upbeat; lots of exclamation marks, emojis and hype.'],
['Sassy','Playful sarcasm without being mean; snappy replies and quips.'],
].map(([n,d])=>({name:n,description:d}));
let overrideMood = null;
let currentDailyMood = null;
/**
* Get today's date as YYYY-MM-DD for comparison
*/
function getTodayDate() {
const d = new Date();
return d.toISOString().split('T')[0];
}
function pickMood(){
return dailyMoods[Math.floor(Math.random() * dailyMoods.length)];
}
function getDailyMood() {
if (overrideMood) return overrideMood;
if (!currentDailyMood) currentDailyMood = pickMood();
return currentDailyMood;
}
function setMoodByName(name) {
if (!name) return null;
const found = dailyMoods.find((m) => m.name.toLowerCase() === name.toLowerCase());
if (found) overrideMood = found;
return found;
}
async function getDailyThought() {
const today = getTodayDate();
return await getDailyThoughtFromDb(today);
}
async function setDailyThought(thought) {
const today = getTodayDate();
await saveDailyThought(today, thought);
}
async function generateDailyThought() {
const today = getTodayDate();
// Check if we already have a thought for today in the DB
const existingThought = await getDailyThoughtFromDb(today);
if (existingThought) {
console.log('[mood] using existing thought for today:', existingThought);
return existingThought;
}
let newThought = null;
try {
const prompt =
'Write a short (one sentence, <20 words, exactly 120 characters max) quirky Discord "nova status" that a friendly bot might use today.';
const messages = [
{ role: 'system', content: 'You are Nova, a playful Discord AI companion.' },
{ role: 'user', content: prompt },
];
const resp = await chatCompletion(messages, { temperature: 0.8, maxTokens: 40 });
newThought = (resp && resp.trim()) || '';
// Truncate to 120 characters if it exceeds
if (newThought.length > 120) {
newThought = newThought.substring(0, 117) + '...';
}
} catch (err) {
console.warn('[mood] failed to generate daily thought:', err);
}
if (!newThought) {
const fallbacks = [
'Vibing in the server like a code ghost.',
'I swear I understand humans… probably.',
'Got an error? I am the error.',
'Just refreshed my cache and I feel alive.',
];
newThought = fallbacks[Math.floor(Math.random() * fallbacks.length)];
}
// Save to database
await saveDailyThought(today, newThought);
console.log('[mood] generated and saved new thought for today:', newThought);
return newThought;
}
export { getDailyMood, setMoodByName, getDailyThought, setDailyThought, generateDailyThought, dailyMoods };