Releases: bdbais/mc-monitor
Release list
MC Monitor 1.34
L'inventario di un giocatore
Dal pannello di un giocatore, Guarda l'inventario: cosa ha addosso e nello zaino, disposto
come nel gioco — armatura, mano secondaria, cintura con la casella che ha in mano evidenziata,
zaino, baule dell'End. Più vita, fame, livello, dimensione e posizione.
Da dove arriva
Da world/playerdata/<identificativo>.dat, che è NBT compresso: non c'è modo di leggerlo
con quello che offre Android, e portarsi dietro una libreria per un solo file sarebbe
sproporzionato. Il lettore è scritto qui, ed è provato contro file costruiti byte per byte con
le stesse regole di Minecraft.
Due cose su cui è facile sbagliare, e che nel codice sono esplicite: tutto è big-endian
anche su un telefono che non lo è, e le stringhe sono in UTF-8 modificato, che non è UTF-8
— con il decoder normale i nomi con gli accenti si storpiano.
Il lettore rifiuta i file rotti invece di fidarsi: lunghezze negative o assurde, tipi che non
esistono, file troncati, troppi livelli annidati. Un elenco che dichiara due miliardi di voci
farebbe morire l'app, se ci si fidasse.
Quando è vecchio, lo dice
Minecraft riscrive quel file quando il giocatore esce e a ogni salvataggio del mondo: per chi è
collegato adesso è vecchio. L'app chiede prima al server di salvare, aspetta, e poi legge;
se il server non risponde lo dice, invece di mostrare l'inventario di ieri come se fosse di
adesso. In fondo alla schermata c'è sempre scritto a quando si riferisce quello che stai
guardando.
Il nome diventa identificativo leggendo usercache.json sul tuo server. A Mojang non viene
chiesto niente: il nome di una persona non esce da lì.
Perché non ci sono le icone
Le texture di Minecraft sono di Mojang e non si mettono dentro un'app. C'è il nome
dell'oggetto, la quantità, un simbolo se è incantato, e la resistenza che resta quando
l'oggetto si consuma — in arancione quando sta per rompersi. La faccia sono due lettere su un
colore ricavato dal nome, sempre lo stesso per lo stesso giocatore.
Si guarda e basta: da qui non si tocca niente.
418 test unitari, 61 verifiche della consegna e 30 del ripristino.
MC-Monitor-1.34.apk · Android 8+ · SHA-256:
afee2c71d1458e8615a8b2b2940d16ae9ae3137687c74c8bfed5612e5de61900
MC Monitor 1.33
Portare le liste su un altro server
Ammettere e bannare su più server valeva per i provvedimenti nuovi. Ma se il secondo mondo
è arrivato dopo, la sua whitelist è vuota e la sua lista ban pure, e tutto quello che avevi
deciso negli anni sta solo di qua. Rifarli a mano uno per uno guardando due schermate è il modo
migliore per saltarne uno — e quello saltato è esattamente quello che poi rientra.
Il pulsante Porta le liste su un altro server, in cima alla scheda Giocatori, sceglie il
server, confronta le due liste e ti dice chi manca di là, con i nomi, prima di toccare
qualcosa.
Le liste si leggono dai file e non dalla console, quindi puoi guardare cosa c'è di là anche a
server spento — che è poi il momento in cui uno se lo chiede. Per scriverle, il server
dev'essere acceso.
Due regole, tutte e due per non disfare decisioni che ha preso qualcuno
- si aggiunge soltanto. Da quel server non viene tolto nessuno. Chi è ammesso di qua e non
di là può esserlo per una ragione: un mondo per gli amici stretti, uno per tutti - chi è ammesso su un server e bannato sull'altro non viene toccato. L'app te lo fa vedere
e si ferma lì
Una guardia in più
Un AlertDialog non può avere insieme un messaggio e una lista: uno dei due sparisce senza
dire niente. È già successo una volta, e il pulsante "Applica" non applicava niente. Adesso
c'è un test che controlla la forma dei dialoghi che hanno una lista — verificato rimettendo il
difetto.
405 test unitari, 61 verifiche della consegna e 30 del ripristino.
MC-Monitor-1.33.apk · Android 8+ · SHA-256:
b69b6e6b4b137634d8fd880b3190f19359a015090eb64c78147b5ec5085997e4
MC Monitor 1.32
"L'unica porta" non era vera
Il commento diceva che i comandi su un giocatore passano tutti dalla stessa funzione. Non era
vero, e proprio il gesto più corto e più probabile per bannare qualcuno — il pulsante
Banna sulla riga della lista d'attesa — non chiedeva niente e restava su un server solo. Con
in più la nota "bannato Pippo" salvata lo stesso, che gli altri amministratori leggono come un
provvedimento preso.
Stessa cosa per Sbanna e Rimuovi nelle liste: sbannare toglieva il ban su un mondo solo
e lasciava il giocatore bannato sugli altri, senza dirlo. Sono due dei quattro gesti che la
funzione esiste per propagare, e da lì non si propagavano mai.
Adesso ci passano tutti. E siccome questa regola si è rotta due volte nella stessa giornata,
non è più scritta solo in un commento: c'è un test che legge il sorgente e fallisce se
qualcuno ricompare fuori dalla porta. Verificato rimettendo il difetto: fallisce con quello
e passa senza.
Altro, dalla stessa revisione
- dopo Annulla tutto l'app chiedeva lo stesso la nota, e si finiva per scrivere "bannato
Pippo: entrava con nomi finti" dieci secondi dopo aver tolto quel ban - ruotando lo schermo o cambiando scheda il giro veniva tagliato a metà in silenzio:
alcuni server bannati, altri no, e nessuno che lo dicesse - l'annullamento riuscito a metà diceva quanti e non quali: se il giocatore resta bannato
da qualche parte, bisogna sapere dove - la lista si ricaricava prima che il server avesse scritto il file, e mostrava il contrario di
quello che il riassunto aveva appena detto - un refuso nei campi in cima non si propaga più su cinque server
setUseLgsmSendscriveva sul server attivo invece che su quello che aveva fallito
390 test unitari, 61 verifiche della consegna e 30 del ripristino.
MC-Monitor-1.32.apk · Android 8+ · SHA-256:
3bb7bcfcef509bc38fef4361f1ecdbb0d3e9c8d26d6fa112f222ac8df1b18765
MC Monitor 1.31
Due difetti nella funzione appena pubblicata, trovati prima che li trovasse qualcun altro.
Il bersaglio sbagliato
Un ban si porta dietro il motivo: ban Pippo ha bruciato la casa di Anna. Prendendo l'ultima
parola come nome del giocatore, il riassunto diceva "Anna bannata su tutti e tre", e
Annulla tutto avrebbe sbannato Anna, che non c'entrava niente.
Adesso il nome si prende dal posto giusto, che dipende dal comando.
"Riuscito" diceva più di quanto si sapesse
Senza RCON l'app parla alla console e non sente la risposta: sa che il comando è arrivato, non
che il server l'abbia accettato. Il riassunto però diceva "Pippo bannato su tutti e tre".
Adesso:
- con RCON la risposta viene guardata, e un rifiuto — un nome che non esiste, un comando
sconosciuto — finisce fra i non fatti invece che fra i fatti - "già in whitelist" non è un rifiuto: lo stato finale è quello voluto, ed è il caso normale
ripetendo un provvedimento dove era già stato dato - senza RCON il riassunto dice a chiare lettere quanto ne sa
388 test unitari, 61 verifiche della consegna e 30 del ripristino.
MC-Monitor-1.31.apk · Android 8+ · SHA-256:
9ffcda851ed1cc9ad01f336caf5574b269cf896ab48d4f1c5015036c712507ab
MC Monitor 1.30
Ammettere e bannare su più server
Chi ha due mondi sulla stessa macchina non ha due comunità: ha una comunità e due mondi.
Bannare un vandalo di là e non di qua vuol dire che fra dieci minuti è di qua, e nessuno se
lo ricorda finché non ricomincia.
Ammetti, banna, sbanna e togli dalla whitelist chiedono adesso su quali altri
server ripetersi. Quelli sullo stesso computer arrivano già spuntati; gli altri no, perché chi
ha un mondo altrove di solito ha un motivo per tenerlo separato.
- riuscire a metà è il caso normale, non l'eccezione: alla fine si vede dove è andata e
dove no, con il motivo, e quelli non fatti restano come prima - Annulla tutto disfa il provvedimento esattamente dove era riuscito, non dove non era
passato - non si propagano il ban di un indirizzo (
ban-ip: su una rete di casa è di tutta la
famiglia) né espelli, op e deop - il server di destinazione dev'essere acceso, e se non lo è l'app lo dice invece di far
finta: per mettere qualcuno in whitelist il server deve chiedere a Mojang chi è, e una riga
scritta a mano nel file verrebbe ignorata
Tre cose viste solo provando sull'emulatore
Non si sarebbero viste leggendo il codice:
- i due campi in cima alla scheda Giocatori scavalcavano la domanda: proprio dalla strada
più corta per bannare qualcuno, il ban restava su un mondo solo. Adesso i comandi su un
giocatore passano da una porta sola - le caselle non comparivano affatto: un AlertDialog non può avere insieme un messaggio e
una lista, e la lista spariva in silenzio. Il pulsante "Applica" non avrebbe applicato
niente. Adesso sono una vista vera - la richiesta della nota si metteva sopra al riassunto, e "Annulla tutto" restava
irraggiungibile. Adesso viene dopo, e non viene chiesta se non è riuscito da nessuna parte
381 test unitari, 61 verifiche della consegna e 30 del ripristino, che girano davvero contro
un server finto.
MC-Monitor-1.30.apk · Android 8+ · SHA-256:
d974015e929f905cdf812e16487dd08ffcf37767dc6c3ac11d58c96e5e6ddd37
MC Monitor 1.29
Se hai la 1.27 o la 1.28, aggiorna. C'è dentro una riparazione di sicurezza.
La conferma di consegna la poteva scrivere un giocatore in chat
È il difetto che credevo di aver chiuso due versioni fa, lasciato aperto venti righe più sotto.
Per decidere se un messaggio era arrivato, lo script cercava la frase del server da qualche
parte dopo il prefisso. Ma nel log anche la chat ha il prefisso del server, perché è il
server a scriverla — e il mio commento diceva il contrario. Quindi bastava scrivere in chat
You whisper to Pippo: ahah
perché un messaggio non consegnato risultasse consegnato e sparisse. Con l'altra frase si
poteva fare l'opposto: far tornare in coda un messaggio già arrivato, e far sussurrare il
bersaglio ogni minuto finché la coda non si riempiva, bloccando la posta nuova.
Adesso la frase deve cominciare esattamente dove finisce il prefisso, e la riga passa dallo
stesso setaccio della presenza: se subito dopo il prefisso c'è <, [ o *, l'ha scritta un
giocatore e non vale.
Le tre prove nuove sono state verificate rimettendo il difetto: falliscono con quello e
passano con la riparazione.
Il ripristino di un backup: il codice era giusto, i testi no
Dicevo "torna indietro il mondo, non il server". Falso: tornano indietro anche i mod e
server.properties, perché stanno dentro la cartella del gioco. Adesso l'app lo dice, prima
di chiedere conferma. Restano di adesso soltanto le impostazioni di LinuxGSM — così una
riparazione della riga di avvio non se ne va insieme al resto.
E due ripristini nello stesso secondo sceglievano lo stesso nome per la cartella messa da
parte: il secondo finiva dentro il primo, il rollback non la ritrovava, e l'app diceva
"rimesso" con il mondo sparito.
Altre due promesse che non erano vere
- "Nel dubbio arriva due volte, mai zero" — il caso "non confermato" è esattamente zero.
Adesso è scritto, insieme al perché - "Lo script tiene il lucchetto per una frazione di secondo" — con dei messaggi da
consegnare può tenerlo un minuto
369 test unitari, 61 verifiche della consegna e 30 del ripristino, che girano davvero contro
un server finto (tools/prova-posta.sh, tools/prova-ripristino.sh).
MC-Monitor-1.29.apk · Android 8+ · SHA-256:
cc66656f98de219bf6a150b0023945806330f3e92cbc82ffea59413cd5b1ccd9
MC Monitor 1.28
Semplice o esperto
Un interruttore in cima alle impostazioni del server decide quanta app vedere. Si cambia
quando vuoi e non tocca niente sul server.
Semplice — resta quello che serve per far girare un server: accendere e spegnere, vedere
chi c'è, ammettere e bannare, backup, mod, mappa, il controllo di sicurezza e la posta.
Spariscono la scheda Console, i comandi di LinuxGSM, i parametri tecnici e RCON. Non
spariscono dal server: l'app non li mette davanti a chi ha appena cominciato.
Esperto — vedi tutto, comprese le schermate da cui si può impedire al server di ripartire
scrivendo la riga sbagliata.
Chi usava l'app da prima la ritrova com'era: con dei server già configurati si parte da
esperto. Togliere di colpo delle funzioni a chi le usa sarebbe peggio che mostrarne troppe a
chi comincia.
Un nome tecnico che poteva cancellare il backup di un altro
Il controllo che impedisce a due server sullo stesso computer di avere lo stesso nome tecnico
usciva prima del tempo, guardando solo il nome. Spostando un profilo su un computer dove un
nome equivalente c'era già, i due finivano con lo stesso marcatore nel crontab, e programmare
il backup su uno cancellava in silenzio quello dell'altro. Adesso conta anche il computer.
Era una regressione introdotta nella 1.27, trovata da una revisione che l'ha riprodotta.
Altro
- il registro delle consegne della posta si legge dall'app: dentro c'è il testo per intero, e
serve per le righe segnate "non confermato" - se salvando le impostazioni il nome tecnico viene cambiato, il campo si aggiorna e l'app lo
dice, invece di lasciare a schermo un nome che sul server non esiste
Provato con 369 test unitari, più 81 verifiche degli script di consegna e ripristino che
girano davvero contro un server finto. Le due modalità provate sull'emulatore.
MC-Monitor-1.28.apk · Android 8+ · SHA-256:
c504d35987dbf7c3c1227aa7d5c48f38c87a0d96e8183e5e936c7f9be931767b
Manuale: MANUALE.md
MC Monitor 1.27
Due modi in cui il crontab poteva sparire
Erano nel codice già pubblicato, e riguardano chiunque usi il backup automatico:
crontab -lche usciva male senza dire niente veniva letto come "non ha nessun
crontab": l'app ripartiva da vuoto e installava un file con dentro solo il blocco suo.
Tutto il resto — righe scritte a mano, magari anni fa — spariva. Adesso il silenzio vale
soltanto con uscita 1, che è quella documentata per quel caso.- un marcatore di apertura senza il suo di chiusura faceva sparire tutte le righe fino
alla fine del file. Bastava aprire il crontab e cancellare una riga. Adesso l'app se ne
accorge e si rifiuta di scrivere.
La posta per chi non c'è
Un messaggio lasciato a un giocatore scollegato, che gli arriva in chat quando rientra. Sta
sul server e non sul telefono: nel momento in cui il giocatore entra, il telefono è spento.
La prima versione chiedeva "chi c'è" alla console e leggeva la risposta nel log. Ma nel log
finisce anche la chat: un giocatore che scriveva players online: Tizio decideva chi
risultava collegato, e faceva dare per consegnati — cioè cancellare — i messaggi degli
altri. Se n'è accorta una revisione fatta prima di installare la cosa su un server vero.
Riscritta da capo:
- si seguono ingressi e uscite, e valgono solo le righe scritte dal server
- il punto da cui si ricomincia a leggere deve cadere dopo un a capo: da metà riga, un
messaggio di chat può sembrare una riga del server - "consegnato" vuol dire che il server l'ha confermato, non che il comando sia stato
accettato. Quando nessuno conferma, il messaggio risulta partito ma nel registro resta
scritto "non confermato", con il testo per intero
Rimettere un backup
Mancava del tutto: si potevano fare le copie, non rimetterle. Tocca una copia nell'elenco.
È l'unica cosa che l'app fa che butta via il lavoro di qualcuno, quindi:
- guarda prima dentro l'archivio e ti dice cosa contiene
- chiede conferma due volte
- pretende il server fermo
- il mondo di adesso non lo cancella: lo sposta di fianco, con la data nel nome
- se l'estrazione fallisce a metà, rimette tutto com'era
- torna indietro il mondo, non il server: impostazioni e mod restano quelli di adesso
Altro
- Perché non è partito diceva "il server sta girando" davanti a un server morto, perché si
fidava del file di lock che LinuxGSM lascia lì - il controllo di sicurezza si accorge di due server che condividono la sessione tmux, dove
un comando può finire al server sbagliato - i nomi tecnici dei server non possono più collidere sullo stesso computer, e i blocchi di
cron rimasti di server cancellati si fanno vedere
Provato con 360 test unitari, più 81 verifiche degli script di consegna e di ripristino che
girano davvero contro un server finto (tools/prova-posta.sh, tools/prova-ripristino.sh).
MC-Monitor-1.27.apk · Android 8+ · SHA-256:
6d4d3b22b8e6ce213efda9143fa8c170536fc5c5dc9c89a6fcea71679cb4b8ca
Manuale: MANUALE.md
MC Monitor 1.26
Fabric rompeva il server, e non c'era modo di tornare indietro
L'installazione di Fabric scriveva il jar dentro startparameters invece che dentro
executable. Java smette di leggere opzioni al primo -jar <file>: partiva il vanilla,
tutto il resto gli arrivava come argomenti, e il server moriva subito. La copia di
sicurezza che l'app prometteva non veniva creata.
E chi si trovava il server fermo non aveva né i log né un modo per rimettere le cose
com'erano: la scheda Console mostrava l'ultimo avvio riuscito, cioè quello prima del
guasto, senza dirlo.
Se ti è successo, la 1.26 lo ripara da sola: apri Perché non è partito nella scheda
Stato, poi Ripristino. Il mondo non è mai stato toccato.
Cosa è cambiato
- Fabric scrive
executable, commenta la riga sbagliata lasciata dalla versione rotta, si
rifiuta di scrivere se il jar non c'è o se la copia di sicurezza non riesce, e non
dichiara riuscito niente finché non rilegge la riga di avvio e la trova sana. Si torna al
vanilla con un tocco. - Perché non è partito — la riga di avvio vera, il registro di LinuxGSM e il log di
console (quelli che l'app non guardava mai), il motivo tradotto in italiano quando lo
riconosce, e il pulsante che porta dove si ripara. - Ripristino — le copie datate che l'app lascia a ogni modifica, con il confronto riga
per riga prima di rimetterle. - Sicurezza — alta, media o bassa sulla configurazione del server, con l'elenco di cosa
la abbassa e come si sistema. Legge e basta: non manda niente fuori dal telefono.
MC-Monitor-1.26.apk · Android 8+ · SHA-256:
73b7386adf5734288bec8fe5f9b0849977f7e4e8cd4ea9686d34658d3fa4a47a
Manuale: MANUALE.md
MC Monitor 1.25
Correzione dell'errore visto su un Samsung aggiornando dalla variante di prova.
Cos'era
Couldn't find meta-data for provider with authority com.bellizia.mcmonitor.diag.updates
Non era un guasto. La variante diagnostica — quella che si chiama "MC Monitor prova" — nasce senza il FileProvider e senza il permesso di installare: le sono stati tolti apposta, serviva a capire quale componente un certo telefono rifiutasse. L'aggiornamento passa proprio di lì, quindi da quella copia non poteva funzionare. Sull'emulatore andava perché lì c'è la build normale, che quei due pezzi ce li ha.
Il problema vero è che l'app non lo diceva: usciva un messaggio di Android in inglese e nessuna via d'uscita.
Il tasto per il permesso
Se manca solo il consenso di sistema, adesso esce "Serve il tuo consenso" con il pulsante Apri le impostazioni, che porta dritto a Installa app sconosciute · MC Monitor · Consenti da questa origine. Accanto c'è Riprova, che reinstalla senza riscaricare niente.
Provato sull'emulatore negando il permesso: il pulsante arriva esattamente su quella schermata. Se su un telefono quella schermata non esistesse, si ripiega sui dettagli dell'app.
La variante di prova adesso lo dice
Prima di scaricare, l'app controlla se questa copia ha di che consegnare il file all'installer. Se non ce l'ha lo spiega in italiano — che è la variante di prova, che non è un guasto, e cosa fare — e offre il pulsante che apre la pagina delle versioni.
Le stesse due esportazioni che passano dal FileProvider (la configurazione e il progetto del server) si rompevano allo stesso modo su quella variante: ora si fermano prima e dicono cosa usare al posto loro.
E ogni errore dell'aggiornamento ha adesso il pulsante per aprire la pagina delle versioni: un errore senza una via d'uscita è solo un dispiacere.
Se sei sulla variante di prova
L'aggiornamento non partirà comunque, nemmeno con questa versione: quella copia non può installare, e il rimedio è passare a quella normale.
- Salva la configurazione: Impostazioni · Fai un backup ora, scegliendo una cartella. Quello funziona anche sulla variante di prova, perché passa dal selettore di sistema e non dal FileProvider.
- Scarica
MC-Monitor-1.25.apkqui sotto e installalo. È un'app separata: si affianca a quella di prova, non la sostituisce. - Nell'app nuova: Impostazioni · Importa, e scegli il file del backup.
- Quando sei sicuro che ci sia tutto, disinstalla "MC Monitor prova".
252 prove automatiche. Il permesso e la variante li ho provati sul dispositivo, che per questa roba vale più di un test.
Verifica del file
MC-Monitor-1.25.apk sha256 a54eabdc731dd59120a07e9079c87382dd6cb463fce592578fb6c458b0fd87e8