Passer au contenu principal
Il est parfois très utile de disposer d’écouteurs pour les requêtes, ce qui vous permet d’implémenter des fonctionnalités devant être appelées chaque fois que « quelque chose » se produit dans votre application. Deux types d’écouteurs ont été ajoutés à cette fin.

Écouteur de capture

Par exemple, imaginez qu’à chaque fois qu’une requête est effectuée vers la route « /logs », mon code exécute une tâche qui vérifie si les nouveaux logs diffèrent des anciens. Voyons comment cela peut être réalisé :
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
Comme illustré ci-dessus, en utilisant le décorateur app.capture sur une fonction, cette fonction sera appelée chaque fois qu’une requête est effectuée vers l’endpoint spécifié dans le décorateur. Les endpoints acceptés sont APP_STATUS, LOGS ou BACKUP. Cette fonction doit prendre deux paramètres :
  • before (représente l’état avant la requête)
  • after (représente l’état après la requête)
Le type de données renvoyé par before et after dépend de l’endpoint que l’écouteur « écoute ». S’il s’agit de la route APP_STATUS, il recevra un StatusData, LOGS recevra un LogsData et BACKUP recevra un BackupData. Comme vous l’avez peut-être remarqué dans l’exemple ci-dessus, la première fois que la comparaison entre les logs a lieu, after != before renvoie True. Cela se produit précisément parce que after est égal à LogsData(logs=''), car rien n’est encore stocké dans le cache en interne.
  • Si vous utilisez discord.py ou l’un de ses forks (c’est probablement le cas), vous devez savoir que ce qui différencie les événements est le nom des fonctions que le décorateur enveloppe, mais ici c’est différent. Pour savoir quelle route de l’API le décorateur doit « écouter », nous utilisons le paramètre endpopint, qui reçoit une classe Endpoint ; ainsi, le nom de la fonction que le décorateur enveloppe est à votre discrétion.
  • La fonction que le décorateur enveloppe peut en réalité être tout ce qui est appelable. Cela inclut les fonctions classiques, les coroutines et même les classes (__init__ sera appelé).
  • Si l’endpoint n’est pas un [Endpoint.app_status()], [Endpoint.logs()] ou [Endpoint.backup()], seul un paramètre response (de type squarecloud.http.Response) sera renvoyé.
Vous pouvez utiliser le paramètre avoid_listener=True pour que l’écouteur de l’application ne soit pas appelé.

Écouteur de requête

Les « écouteurs de requête » font pratiquement la même chose. Mais ici, vous utilisez le [Client], et la valeur de retour de tous les endpoints est un objet 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)

Passer des arguments supplémentaires

Vous pouvez passer à certaines méthodes un argument nommé extra, et celui-ci sera transmis à votre écouteur
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'})
Vous pouvez bénéficier de fonctionnalités intéressantes dans les écouteurs en utilisant pydantic dans votre projet, jetez un œil à utiliser pydantic