From 76fee480003d01aa68f7ce3dd8957b5b31d85fb2 Mon Sep 17 00:00:00 2001 From: octospacc Date: Sat, 6 May 2023 00:13:32 +0200 Subject: [PATCH] Agg. interni --- ...02-Piu-Che-un-Esame-Ho-Fatto-una-Guerra.md | 18 +++- Scripts/WordpressUpsync.js | 96 +++++++++++++++++++ Site.ini | 17 ++-- Templates/WM.html | 2 +- 4 files changed, 120 insertions(+), 13 deletions(-) create mode 100755 Scripts/WordpressUpsync.js diff --git a/Posts/2023-05-02-Piu-Che-un-Esame-Ho-Fatto-una-Guerra.md b/Posts/2023-05-02-Piu-Che-un-Esame-Ho-Fatto-una-Guerra.md index b872e6c..e076da5 100644 --- a/Posts/2023-05-02-Piu-Che-un-Esame-Ho-Fatto-una-Guerra.md +++ b/Posts/2023-05-02-Piu-Che-un-Esame-Ho-Fatto-una-Guerra.md @@ -13,21 +13,27 @@

Fino a 30 minuti prima, maremma bona, volevo solo esplodere. Atttenzione, però: non per l'esame in sé (l'ultimo di una serie di extra-curriculari, precisamente), per me semplicissimo, di cui non mi importa nulla se non della certificazione!1 È successa un'altra roba.

+

Torniamo indietro

+

Quando passai le prime sessioni due anni fa, andò tutto liscissimo, quasi all'insegna del chilling: erano ancora i tempi delle restrizioni anti-COVID, e quei 2 esami che affrontai a scuola erano in un'aula comunque poco affollata.

Quest'anno, però, una schifezza. La carta l'ho presa senza ripetere nulla, quindi i miei non hanno buttato soldi in quel riguardo, ma l'esperienza è stata terrificante.
L'aula a questi giri è stata sempre pienissima, e proprio questa cosa è finita per essere un problema per la mia anima.
Non credo di meritarmi tutto questo...

+

Aria di problemi

+

Il mese scorso feci 2 esami dei 3 che mi mancavano, e già non filò nulla liscio, affatto:

  1. Il mio professore (referente del progetto) non mi aveva detto che sulla casella email del dominio scolastico mi sarebbe dovuto arrivare un link privato, per creare un account sulla piattaforma di esaminazione online... Peccato che l'accesso alla posta lo ho solo sulla chiavetta con Puppy Linux e sul tablet, e non riesco ad accedere altrove2. Risultato: dovetti farmi la corsa a casa per prendere il tablet e tornare a scuola... Fortuna che abito nelle vicinanze.

  2. -
  3. La piattaforma di testing si ruppe totalmente quando avevo finito uno degli esami (non senza fatica, alcune domande erano glitchate!): appena feci partire il secondo, il sistema disse che avevo esaurito il tempo, e mi chiuse in faccia la prova appena avviata... Il prof. dovette perdere tempo a chiamare il supporto per spiegare la cosa, e dopo un bel casino l'esame venne ripristinato come non svolto.

  4. +
  5. La piattaforma di testing si ruppe totalmente quando avevo finito uno degli esami (non senza fatica, alcune domande erano [glitchate](https://en.wikipedia.org/wiki/Glitch#Computerglitch)_!): appena feci partire il secondo, il sistema disse che avevo esaurito il tempo, e mi chiuse in faccia la prova appena avviata... Il prof. dovette perdere tempo a chiamare il supporto per spiegare la cosa, e dopo un bel casino l'esame venne ripristinato come non svolto.

Tra entrambe le cose, allora, fu persa una buona quantità di tempo. E se così non fosse stato, forse ce l'avrei fatta a finire tutti gli esami quel giorno.

+

Il presente

+

Torniamo ad oggi.
Finita la scocciatura dell'attesa (non troppo problematica, grazie al rettangolo di plastica, vetro, metallo, con connessione Internet, e tascabile, che anche io porto sempre in giro), dovuta al fatto che tutte le postazioni erano occupate inizialmente, inizio.
...Ma non l'avessi mai fatto!

@@ -35,6 +41,8 @@ Finita la scocciatura dell'attesa (non troppo problematica, grazie al rettangolo

I miei primi minuti vanno per bene, fino a che non iniziano a terminare l'esame anche una buona selezione (casuale, o il destino le ha scelte accuratamente?) di scimmie, che dalle file dietro a tutto farfugliavano con chi (immagino in confidenza) ancora non aveva finito, ad un volume esagerato e in contemporanea.
Ecco, ecco, ora, lentamente, il sangue inizia a ribollire nel mio corpo, manco fosse una caffettiera, perché con quel casino non riesco a leggere metà di una domanda senza distrarmi totalmente. Nemmeno avere gli auricolari nelle orecchie (ma staccati) attenuava abbastanza il rumore. Finire in quel modo l'esame? Impossibile.

+

Ci ho provato

+

Prima che fosse troppo tardi, ho cercato di chiamare l'insegnante — che, mannaggia allo strafaccio, era parecchio distratto, perché ad un'altra persona in quel momento era capitato lo stesso glitch della mia volta precedente (e qui devo: ma che backend di merda che ha 'sta piattaforma, buttatelo via e riscrivetelo da capo, per cortesia!!!).
Volevo gentilmente dirgli di far stare in silenzio tutti coloro che non avevano diritto di parola, e dopo qualche minuto (a onor suo, di sua sponte, un attimo prima che sentisse me) ha blaterato qualcosa (di poco convincente) per dire alla platea di acquietarsi. La platea non si è acquietata, e il prof. stava uscendo pazzo per via dei problemi generali, purtroppo, quindi poco poteva dar retta a me.

@@ -42,17 +50,23 @@ Volevo gentilmente dirgli di far stare in silenzioAddirittura decido di chiamare a telefono mio padre, arrivata qui, per dirgli di chiamare a sua volta il professore a telefono; magari a 'sto giro riesce a capire. In effetti, a questo giro l'invito al silenzio era più convincente. Lo era?

+

Un disastro

+

Ma, ormai, troppo tardi comunque: la mia tensione è salita troppo, non riesco a riacquisire un minimo di concentrazione, costringendomi, dopo forse 21 mesi buoni in cui ho potuto farne a meno, a graffiarmi per convertire una minima parte del carico mentale (che richiede energie mentali di primo piano per essere gestito, le stesse che in quel momento mi servivano per completare la mia sessione) in bruciore cutaneo (che, fino ad un certo livello, è gestito dal cervello in background). Che palle.

Il danno ormai l'ho fatto, ahimè ed e che cazzo, e sembrava che lentamente si stesse per calmare tutto e la concentrazione potesse tornare... e invece no. Il richiamo del prof. è stato comunque troppo morbido e non ha stroncato i cattivi comportamenti di quella parte degli altri studenti, li ha solo messi un po' in pausa.

+

La soluzione vera

+

Boh, a questo punto mi viene semplicemente da tirare un pugno sulla scrivania e "urlare" (non che io lo sappia fare, ma il pugno proprio a sopperire a questo serve; l'ho inconsciamente imparato da un altro mio professore) di fare silenzio, che altrimenti non avrei potuto concludere nulla, e... ha funzionato. Ah?...
Si, tutto qui. Non posso dire altro su questo attimo, si è immediatamente cristallizzato in bene. Da lì, fino a quando ho finito e ho potuto andarmene, non è volata più una mosca.

A quel punto, purtroppo, l'irritazione l'avevo comunque accumulata, e ci ho messo ore e ore e ore per smaltirla, tra il fare varie cose a caso e lo scrivere questo articolo.
L'unica cosa di cui logicamente posso pentirmi è di non aver fatto risuonare quel banco qualche prezioso minuto prima di arrivare sul serio al limite, dato che i metodi gentili non funzionavano. Purtroppo o per fortuna, mannaggia, non è un riflesso che mi sorge troppo spesso; solo quando ormai sono già oltre quel limite, e forse ho già commesso altri danni evitabili.

-

Eppure, quel dubbio mi resta ancora: ma cosa avrò fatto di tanto male al mondo per meritarmi queste cose?

+
+ +

Eppure, quel dubbio mi resta ancora: ma cosa avrò fatto di tanto male al mondo per meritarmi queste cose? E vallo a capire...

diff --git a/Scripts/WordpressUpsync.js b/Scripts/WordpressUpsync.js new file mode 100755 index 0000000..2273e0d --- /dev/null +++ b/Scripts/WordpressUpsync.js @@ -0,0 +1,96 @@ +#!/usr/bin/env node +const Http = require('http'); +const Https = require('https'); + +const Host = '127.0.0.1'; +let [Auth, Session] = [ + JSON.parse(process.env.WordpressAuth || '{}'), + JSON.parse(process.env.WordpressSession || '{}'), +]; + +const ApiBase = 'public-api.wordpress.com'; +const Msg = { + NoAuth: '\nPlease set the "WordpressAuth" ENV variable as a JSON string with keys "client_id" and "client_secret".\n()', + NoSession: "\nNo valid session is available. You need to log in.\nOpen this link in a Web browser to log into Wordpress.com:\n", + GotSession: '\nGot a new session string. Store it, and load it via the "WordpressSession" ENV variable for future use:\n', +}; + +const AuthHeaders = () => { + return { + headers: { + "Authorization": `Bearer ${Session.access_token}`, + }, + }; +}; + +// https://developer.wordpress.com/docs/oauth2/ +const AuthServer = () => { + const Serv = Http.createServer((Req, Res) => { + Res.setHeader('Content-Type', 'text/plain'); + let Query = new URLSearchParams(Req.url.slice(1).replaceAll('?', '')); + let AuthCode = Query.get('code'); + if (AuthCode) { + Res.statusCode = 200; + Res.end('This window can now be closed.'); + Req = Https.request({ + method: "POST", + host: ApiBase, + path: "/oauth2/token", + headers: { "Content-Type": "application/x-www-form-urlencoded", }, + }, (Res) => { + let Data = ''; + Res.on('data', (Frag) => { + Data += Frag; + }).on('end', () => { + console.log(`${Msg.GotSession}'${Data}'`); + Session = JSON.parse(Data); + }); + }); + Req.write(`&client_id=${Auth.client_id}&client_secret=${Auth.client_secret}&code=${AuthCode}&redirect_uri=http://${Host}:${Serv.address().port}&grant_type=authorization_code`); + Req.end(); + }; + Res.statusCode = 500; + Res.end(); + }); + + Serv.listen(0, Host, () => { + if (Auth.client_id && Auth.client_secret) { + console.log(`${Msg.NoSession}`); + } else { + console.log(Msg.NoAuth); + Serv.close(); + }; + }); +}; + +// TODO +const TryUpsync = () => { + // https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/posts/ + Https.get(`https://${ApiBase}/rest/v1.1/sites/${Session.blog_id}/posts/?&fields=ID,slug,status,categories,tags,title,content&context=edit`, AuthHeaders(), + (Res) => { + let Data = ''; + Res.on('data', (Frag) => { + Data += Frag; + }).on('end', () => { + let RemotePosts = JSON.parse(Data); + console.log(RemotePosts); + // Read existing posts from ./Posts/ here + // Find out which posts exist on remote and which not + // Exist on remote and local: + // Check if remote data is same as local, update remote if not + // https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/%24post_ID/ + // Exist on local only: + // Create blank post on remote (as draft), then edit it like the first case + // https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/new/ + // Exist on remote only: + // Was probably deleted or moved locally, what to do here? + }); + }); +}; + +if (!Session.access_token) { + AuthServer(); +}; +if (Session.access_token) { + TryUpsync(); +}; diff --git a/Site.ini b/Site.ini index 6ed4a1d..b81f600 100644 --- a/Site.ini +++ b/Site.ini @@ -33,15 +33,13 @@ Redirect = False # 2 = Donazioni # 3 = Devlog # 4 = PicoBlog -4 = [💎 OctoSpacc Hub](https://hub.octt.eu.org) -5 = [📦 OcttKB](https://kb.octt.eu.org){target="_blank" rel="noopener"} -6 = [🔖️ Bacheca (Old)](https://octtspacc.gitlab.io/bachecoctt){target="_blank" rel="noopener"} -7 = [📖 Guestbook](https://listed.to/@u8/guestbook){target="_blank" rel="noopener"} -8 = Donazioni -9 = Categories/index -10 = Categories/Blog -11 = Categories/MicroBlog -12 = Categories/Fritto-Misto +4 = [📖 Guestbook](https://listed.to/@u8/guestbook){target="_blank" rel="noopener"} +5 = Esterni +6 = Donazioni +7 = Categories/index +8 = Categories/Blog +9 = Categories/MicroBlog +10 = Categories/Fritto-Misto # 5 = [💎 OctoSpacc Hub](https://hub.octt.eu.org) # 6 = [📦 OcttKB](https://kb.octt.eu.org){target="_blank" rel="noopener"} # 7 = [🔖️ Bacheca (Old)](https://octtspacc.gitlab.io/bachecoctt){target="_blank" rel="noopener"} @@ -50,7 +48,6 @@ Redirect = False # 10 = Categories/MicroBlog # 11 = Categories/Fritto-Misto - [Macros] # Note: For some macros, because of a problem with python-markdown's "attr_list" extension, the quotes need to be written messy here HNotesRefsHTML = 🏷️ Note e Riferimenti diff --git a/Templates/WM.html b/Templates/WM.html index 3eb0d24..2576aac 100644 --- a/Templates/WM.html +++ b/Templates/WM.html @@ -21,7 +21,7 @@ -  

sitoctt2022

 
+  

sitoctt2023