Inhaltsverzeichnis
keine Gliederung
#serverBuddy {
position: fixed;
bottom: 16px;
left: 50%;
transform: translateX(-50%);
z-index: 2147483000;
cursor: pointer;
transition: transform 0.3s ease;
filter: drop-shadow(0 4px 12px rgba(0,0,0,0.25));
}
#serverBuddy:hover {
transform: translateX(-50%) scale(1.08);
}
#serverBuddy img {
width: 96px;
height: 96px;
image-rendering: pixelated;
image-rendering: crisp-edges;
display: block;
}
#buddySpeech {
position: fixed;
bottom: 120px;
left: 50%;
transform: translateX(-50%) scale(0);
background: #1a1a2e;
color: #0df;
padding: 8px 14px;
border-radius: 10px;
font-family: monospace;
font-size: 11px;
white-space: nowrap;
z-index: 2147483001;
opacity: 0;
transition: opacity 0.3s ease, transform 0.3s ease;
pointer-events: none;
box-shadow: 0 2px 10px rgba(0,0,0,0.3);
}
#buddySpeech.visible {
opacity: 1;
transform: translateX(-50%) scale(1);
}
#buddySpeech::after {
content: '';
position: absolute;
bottom: -8px;
left: 50%;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
border-top: 8px solid #1a1a2e;
}
![Server Buddy]()
(function() {
// === TIMER CONFIG (Sekunden) ===
var SLEEP_SEC = 30;
var HAPPY_SEC = 4;
var ERROR_SEC = 6;
var LOAD_SEC = 5;
// === GIF URLS ===
var GIFS = new Array(5);
GIFS[0] = 'https://docs.trialanderror.tech/@api/deki/files/403/=buddy_idle.gif';
GIFS[1] = 'https://docs.trialanderror.tech/@api/deki/files/402/=buddy_sleeping.gif';
GIFS[2] = 'https://docs.trialanderror.tech/@api/deki/files/401/=buddy_happy.gif';
GIFS[3] = 'https://docs.trialanderror.tech/@api/deki/files/400/=buddy_error.gif';
GIFS[4] = 'https://docs.trialanderror.tech/@api/deki/files/399/=buddy_loading.gif';
// State indices
var S_IDLE = 0;
var S_SLEEP = 1;
var S_HAPPY = 2;
var S_ERROR = 3;
var S_LOAD = 4;
// === SPEECH MESSAGES ===
var SPEECH = new Array(5);
SPEECH[S_IDLE] = new Array('Alles klar!', 'Bereit!', 'Was gibts?', 'Hm...');
SPEECH[S_SLEEP] = new Array('zzz...', 'ZZzz...', '*schnarch*', 'zZzZz...');
SPEECH[S_HAPPY] = new Array('Yay!', 'Super!', 'Nice!', 'Toll!', 'Weiter so!');
SPEECH[S_ERROR] = new Array('ALARM!', 'Oh nein!', 'Fehler!', 'Hilfe!');
SPEECH[S_LOAD] = new Array('Moment...', 'Lade...', 'Gleich...', 'Bitte warten...');
// === STATE ===
var curState = S_IDLE;
var lastAct = Date.now();
var sTimer = null;
// === DOM ===
var bImg = document.getElementById('buddyImg');
var bSpeech = document.getElementById('buddySpeech');
if (!bImg || !bSpeech) return;
// === HELPER ===
function pick(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
// === SPEECH BUBBLE ===
function showMsg(txt) {
bSpeech.textContent = txt;
bSpeech.className = 'visible';
setTimeout(function() {
bSpeech.className = '';
}, 3000);
}
// === SET STATE ===
function setS(s, msg) {
if (curState === s && s !== S_HAPPY) return;
curState = s;
bImg.src = GIFS[s];
showMsg(msg || pick(SPEECH[s]));
if (sTimer) clearTimeout(sTimer);
if (s === S_HAPPY) {
sTimer = setTimeout(function() {
setS(S_IDLE);
}, HAPPY_SEC * 1000);
}
if (s === S_ERROR) {
sTimer = setTimeout(function() {
setS(S_IDLE);
}, ERROR_SEC * 1000);
}
if (s === S_LOAD) {
sTimer = setTimeout(function() {
setS(S_HAPPY, 'Fertig!');
}, LOAD_SEC * 1000);
}
}
// === IDLE RESET ===
function resetIdle() {
lastAct = Date.now();
if (curState === S_SLEEP) {
setS(S_IDLE);
}
}
// === IDLE CHECK ===
function checkIdle() {
var sec = Math.floor((Date.now() - lastAct) / 1000);
if (sec >= SLEEP_SEC && curState === S_IDLE) {
setS(S_SLEEP);
}
}
// === EVENT LISTENERS ===
// Aktivitaet = Idle reset
document.addEventListener('mousemove', resetIdle);
document.addEventListener('scroll', resetIdle);
document.addEventListener('keydown', resetIdle);
document.addEventListener('touchstart', resetIdle);
// Link-Klick = Happy
document.addEventListener('click', function(e) {
resetIdle();
var t = e.target;
if (t.tagName === 'A' || (t.parentNode && t.parentNode.tagName === 'A')) {
setS(S_HAPPY);
}
});
// Klick auf Buddy = Zufaelliger Spruch
document.getElementById('serverBuddy').addEventListener('click', function(e) {
e.stopPropagation();
var hi = new Array('Hi!', 'Hallo!', '*blinzel*', 'Yo!', '01001000 01101001');
showMsg(pick(hi));
});
// JS Error = Error State
window.addEventListener('error', function() {
setS(S_ERROR);
});
// Tab wechseln = Sleep / Wake
document.addEventListener('visibilitychange', function() {
if (document.hidden) {
setS(S_SLEEP, '*gaehn*');
} else {
resetIdle();
setS(S_IDLE, 'Wieder da!');
}
});
// === INIT: Start mit Loading, dann Idle ===
setS(S_LOAD, 'Starte...');
setTimeout(function() {
setS(S_IDLE);
}, 2000);
// Idle-Check jede Sekunde
setInterval(checkIdle, 1000);
// === GLOBAL API (fuer manuellen Zugriff) ===
window.serverBuddy = new Object();
window.serverBuddy.setState = function(name, msg) {
var map = new Object();
map['idle'] = S_IDLE;
map['sleeping'] = S_SLEEP;
map['happy'] = S_HAPPY;
map['error'] = S_ERROR;
map['loading'] = S_LOAD;
if (map[name] !== undefined) setS(map[name], msg);
};
window.serverBuddy.say = showMsg;
})();