// --- Sections: Stats, About, Schedule, Games, VODs, Chat, Socials ---
function StatsRow() {
return (
{GRANDPA.stats.map((s, i) => (
))}
);
}
function About() {
// Pension progress bar (blocks)
const totalBlocks = 20;
// Real age 38 -> retirement 65, 27 years left
const pct = Math.max(0, Math.min(1, (GRANDPA.realAge - 20) / (65 - 20)));
const filled = Math.max(0, Math.min(totalBlocks, Math.round(pct * totalBlocks)));
const bar = '█'.repeat(filled) + '░'.repeat(totalBlocks - filled);
return (
<>
◉ ID CARD
όνομα{GRANDPA.name}
πραγματ. ηλικία{GRANDPA.realAge}
ηλικία ψυχής{GRANDPA.personaAge}+
statusστο κάτεργο
διάθεσηήρεμη γκρίνια
θεραπείαstreaming
καύσιμοελληνικός καφές
πρόοδος προς σύνταξη:
[{bar}]
μένουν {GRANDPA.years_until_retirement} χρόνια
Είμαι ο παππούς. Στα χαρτιά 38, αλλά στην ψυχή έχω
πατήσει τα 70.
Μέχρι στιγμής το κάτεργο δεν επιτρέπει τα προγραμματισμένα streams,
αλλά μια στο τόσο θα γίνεται «η φασούλα» — έτσι, για την ψυχοθεραπεία.
MISSION: ψυχοθεραπεία μέσω streaming · αντίστροφη μέτρηση για σύνταξη
◉ RULES OF THE ΚΑΦΕΝΕΙΟ
- 01. Σεβασμός στον παππού και στο chat.
- 02. Όχι spoilers — ο παππούς ξεχνάει εύκολα.
- 03. Ελληνικά ή Αγγλικά — όλα καλά.
- 04. Χωρίς πολιτικά. Το κάτεργο αρκεί.
>
);
}
function Schedule() {
return (
<>
Το κάτεργο δεν επιτρέπει προγραμματισμένα streams. Μια στο τόσο όμως, γίνεται η φασούλα — follow στο Twitch + join στο Discord για να δεις ειδοποίηση.
{GRANDPA.schedule.map((row, i) => (
{row.day}
{row.time}
{row.note}
))}
>
);
}
function Games() {
return (
<>
{GAMES.map((g, i) => (
[ {g.title.toUpperCase()} ]
{g.hrs}h streamed
› {g.tag}
))}
>
);
}
function Vods() {
return (
<>
{VODS.map((v, i) => (
{v.title}
{v.views} views · {v.when}
))}
>
);
}
function ChatReplay() {
const [msgs, setMsgs] = useState(() => CHAT_MSGS.slice(0, 6));
useEffect(() => {
let i = 6;
const id = setInterval(() => {
setMsgs(prev => {
const next = CHAT_MSGS[i % CHAT_MSGS.length];
const arr = [...prev, { ...next, _id: Math.random() }];
if (arr.length > 10) arr.shift();
return arr;
});
i++;
}, 1800);
return () => clearInterval(id);
}, []);
return (
#chat · greekgrandpa
● REPLAY
{msgs.map((m, i) => (
{m.u}:
{m.t}
))}
);
}
function Projects() {
const projects = [
{
title: 'PAPPOUDOBOT',
sub: 'Twitch chat bot · κουμάντο στο chat',
desc: 'Ο μικρός βοηθός του παππού: commands, alerts και δουλίτσες για το stream.',
href: 'http://pappoudobot.greekgrandpa.gr/',
tag: 'BOT',
art: (
),
},
{
title: 'JACKBOX-STYLE GAME',
sub: 'Παιχνίδι για το stream · παίζεις με τον παππού',
desc: 'Σύνδεσε το κινητό σου, μπες στο lobby και παίξε ζωντανά μαζί με το chat.',
href: 'https://jackbox.greekgrandpa.gr/',
tag: 'GAME',
art: (
),
},
];
return (
<>
>
);
}
function Socials() {
return (
<>
{SOCIALS.map((s, i) => (
{s.ico}
))}
>
);
}
Object.assign(window, { StatsRow, About, Schedule, Games, Projects, Vods, ChatReplay, Socials });