$ x-gem-terminal grep 'MUD uudelleen' --run
[+] HyvC$ksytty. Suoritetaan: gem_2026-07-16T07-11-47-069Z_d30f66c1.gem-termina
l-script
[*] ========= RUN =========
[:] /mnt/mesh_root/state/gem-terminal-proposals/gem_2026-07-16T07-11-47-069Z_d3
0f66c1.gem-terminal-script
[*] ========= FILE START =========
[:] cat << 'EOF' > /mnt/mesh_root/src/client-mud/ext/udp_eval.js
[:] const dgram = require('dgram');
[:]
[:] registerCommand('serve', async (ctx) => {
[:] if (ctx.state.udpServer) {
[:] ctx.print("[-] UDP-palvelin on jo kC$ynnissC$ portissa " +
ctx.state.udpPort);
[:] return;
[:] }
[:]
[:] const server = dgram.createSocket('udp4');
[:] let port = 5000;
[:] const maxPort = 5999;
[:]
[:] server.on('error', (err) => {
[:] if (err.code === 'EADDRINUSE') {
[:] port++;
[:] if (port <= maxPort) {
[:] server.bind(port);
[:] } else {
[:] ctx.print("[-] Ei vapaita UDP-portteja vC$lillC$ 5000-5999.");
[:] }
[:] } else {
[:] ctx.print("[-] UDP Virhe: " + err.message);
[:] }
[:] });
[:]
[:] server.on('message', (msg, rinfo) => {
[:] let code = msg.toString('utf8');
[:] let response = {};
[:] try {
[:] // Evaluoidaan koodi suoraan laajennuksen kontekstissa!
[:] // TC$mC$ antaa soittajalle tC$yden pC$C$syn "ctx.state",
"ctx.print" jne.
[:] let result = eval(code);
[:] response = { status: "ok", result: result };
[:] } catch (err) {
[:] response = { status: "error", result: err.message };
[:] }
[:]
[:] let resBuf = Buffer.from(JSON.stringify(response));
[:] server.send(resBuf, rinfo.port, rinfo.address, (err) => {
[:] if (err) ctx.print("[-] UDP Vastausvirhe: " + err.message);
[:] });
[:] });
[:]
[:] server.on('listening', async () => {
[:] ctx.state.udpServer = server;
[:] ctx.state.udpPort = port;
[:] ctx.print(`[+] UDP-palvelin kuuntelee portissa ${port}`);
[:]
[:] try {
[:] let res = await fetch("[http://127.0.0.1:5999/register](http://127.
0.0.1:5999/register)", {
[:] method: 'POST',
[:] headers: { 'Content-Type': 'application/json' },
[:] body: JSON.stringify({ port: port })
[:] });
[:] let data = await res.json();
[:] if (data.id) {
[:] ctx.state.playerId = data.id;
[:] ctx.print(`[+] RekisterC6ity MUD-rekisteriin ID:llC$:
${data.id}`);
[:] ctx.print(`[!] Voit nimetC$ istuntosi komennolla: name
<omavalintainen_nimi>`);
[:] }
[:] } catch (e) {
[:] ctx.print("[-] RekisterC6inti epC$onnistui (onko FastAPI portissa
5999 pC$C$llC$?): " + e.message);
[:] }
[:] });
[:]
[:] server.bind(port);
[:]
[:]
[:]
[:] });
[:]
[:] registerCommand('name', async (ctx) => {
[:] if (!ctx.state.playerId) {
[:] ctx.print("[-] Et ole vielC$ rekisterC6itynyt (aja 'serve' ensin).");
[:] return;
[:] }
[:] if (!ctx.arg1) {
[:] ctx.print("[-] KC$yttC6: name <uusi_nimi>");
[:] return;
[:] }
[:] try {
[:] let res = await fetch([http://127.0.0.1:5999/name/$](http://127.0.0.1:5999/
name/$){ctx.state.playerId}, {
[:] method: 'POST',
[:] headers: { 'Content-Type': 'application/json' },
[:] body: JSON.stringify({ name: ctx.arg1 })
[:] });
[:] let data = await res.json();
[:] if (data.status === "ok") {
[:] ctx.print([+] Nimesi on nyt rekisterissC$: ${ctx.arg1});
[:] }
[:] } catch (e) {
[:] ctx.print("[-] NimeC$minen epC$onnistui: " + e.message);
[:] }
[:] });
[:] EOF
[:]
[:] # KC$C$nnetC$C$n MUD uudelleen
[:]
[:] /mnt/mesh_root/src/client-mud/build-client-mud.sh
[*] ========= FILE END =========
[*] /bin/bash -c ". /mnt/mesh_root/state/gem-terminal-proposals/gem_2026-07-16T
07-11-47-069Z_d30f66c1.gem-terminal-script"
[*] Rakennetaan /mnt/mesh_root/bin/dom_mud_full.js...
-> Injektoidaan: base.js
-> Injektoidaan: basic.js
-> Injektoidaan: interaction.js
-> Injektoidaan: udp_eval.js
[+] Valmis! Kokeile ajaa: node /mnt/mesh_root/bin/dom_mud_full.js
$ x-gem-terminal grep 'MUD uudelleen' --archive
[*]: mv /mnt/mesh_root/state/gem-terminal-proposals/gem_2026-07-16T07-11-47-069
Z_d30f66c1.gem-terminal-script /mnt/mesh_root/state/gem-terminal-proposals/.arc
hive/
[+] Ehdotus arkistoitu: gem_2026-07-16T07-11-47-069Z_d30f66c1.gem-terminal-scri
pt
$