Vai al contenuto principale
A volte è molto utile avere dei listeners per le richieste, che ti permettono di implementare funzionalità da richiamare ogni volta che “qualcosa” accade nella tua applicazione. Per questo scopo sono stati aggiunti due tipi di listeners.

Capture Listener

Ad esempio, immagina che ogni volta che viene effettuata una richiesta alla rotta ‘/logs’, il mio codice esegua un’operazione che verifica se i nuovi log differiscono da quelli precedenti. Bene, vediamo come si può fare:
import squarecloud as square
from squarecloud import Endpoint

@app.capture(endpoint=Endpoint.logs())
async def on_logs_request(before, after):
    if after != before:
        print(f'New logs!!! {after}')

async def main():
    client = square.Client('your api key')
    app = await client.app('application_id')

    await app.logs()  # True
    await app.logs()  # False
Come mostrato sopra, usando il decoratore app.capture su una funzione, questa funzione verrà chiamata ogni volta che viene effettuata una richiesta all’endpoint specificato nel decoratore. Gli endpoint accettati sono APP_STATUS, LOGS o BACKUP. Questa funzione dovrebbe accettare due parametri:
  • before (rappresenta lo stato prima della richiesta)
  • after (rappresenta lo stato dopo la richiesta)
Il tipo di dato restituito da before e after dipende da quale endpoint il listener sta “ascoltando”. Se si tratta della rotta APP_STATUS, riceverà uno StatusData, LOGS riceverà un LogsData e BACKUP riceverà un BackupData. Come avrai notato nell’esempio sopra, la prima volta che avviene il confronto tra i log, after != before restituisce True. Questo accade proprio perché after è uguale a LogsData(logs=''), dato che non è ancora stato memorizzato nulla nella cache interna.
  • Se usi discord.py o qualche suo fork (probabilmente lo usi), dovresti sapere che ciò che differenzia gli eventi è il nome delle funzioni che il decoratore avvolge, ma qui è diverso. Per sapere quale rotta API il decoratore deve “ascoltare”, usiamo il parametro endpopint, che riceve una classe Endpoint, quindi il nome della funzione che il decoratore avvolge dipende da te.
  • La funzione che il decoratore avvolge può in realtà essere qualsiasi cosa che sia un callable. Questo include funzioni normali, coroutine e persino classi (__init__ verrà chiamato).
  • Se l’endpoint non è un [Endpoint.app_status()], [Endpoint.logs()] o [Endpoint.backup()], verrà restituito solo un parametro response (di tipo squarecloud.http.Response).
Puoi usare il parametro avoid_listener=True affinché il listener dell’applicazione non venga chiamato.

Request Listener

I “request listeners” fanno praticamente la stessa cosa. Ma qui usi il [Client], e il valore restituito da tutti gli endpoint è un oggetto squarecloud.http.Response.
import squarecloud as square
from squarecloud import Endpoint

@client.on_request(endpoint=Endpoint.logs())
async def on_logs_request(response):
    print(1, response)

async def main():
    client = square.Client('your api key')
    await client.get_logs(app_id='application_id')  # 1, Response(success)

Passare argomenti aggiuntivi

Puoi passare ad alcuni metodi un argomento con parola chiave chiamato extra, che verrà passato al tuo listener
import squarecloud as square
from squarecloud import Endpoint

@client.on_request(Endpoint.status())
async def get_extra_param(before, after, extra: dict[str, str]):
    print(extra)

async def main():
    client = square.Client('your api key')
    await client.app_status('application_id', extra={'name': 'robertinho'})
Puoi ottenere alcune funzionalità interessanti nei listeners usando pydantic nel tuo progetto, dai un’occhiata a using pydantic