104 lines
3.6 KiB
Markdown
104 lines
3.6 KiB
Markdown
|
# GLaDOS, le bot de la v5
|
||
|
|
||
|
GLaDOS est un bot dont le but est d'enrichir l'IRC avec des informations provenant de la v5. Elle peut aussi réagir à des messages envoyés depuis l'IRC.
|
||
|
|
||
|
## Configuration
|
||
|
|
||
|
### Identifiants
|
||
|
|
||
|
Pour connecter un compte, il faut créer un fichier `secrets.py` contenant les identifiants du compte. Vous pouvez utiliser un compte quelconque.
|
||
|
|
||
|
```
|
||
|
# secrets.py
|
||
|
USER = "GLaDOS"
|
||
|
PASSWORD = "str0ngP@ssprh4s3"
|
||
|
```
|
||
|
|
||
|
### Instanciation du bot
|
||
|
|
||
|
Lors de l'instanciation de la classe `Bot`, vous pouvez configurer trois paramètres.
|
||
|
|
||
|
Le premier est le serveur IRC auquel se connecter. Il est défini par un tuple `(hostname, port)`. La connexion s'effectue obligatoirement via TLS, en utilisant le fichier `secrets.py` pour la connexion SASL (obligatoire elle-aussi).
|
||
|
|
||
|
Le second est le serveur UDP qui écoutera les évènements en provenance de la v5. Il est défini par une adresse sur laquelle écouter (en général, `127.0.0.1` ou `0.0.0.0`) et un port. Ces paramètres sont à synchroniser avec la configuration de la v5 ([ici](https://gitea.planet-casio.com/devs/PCv5/src/branch/master/config.py#L54) pour être précis).
|
||
|
|
||
|
Le troisième est une liste de canaux à joindre automatiquement lors de la connexion au serveur IRC.
|
||
|
|
||
|
## Lancement
|
||
|
|
||
|
Pour lancer le bot, exécutez simplement `main.py`.
|
||
|
|
||
|
```
|
||
|
$ ./main.py
|
||
|
_handle: <:irc.planet-casio.com NOTICE * :*** Looking up your hostname...>
|
||
|
_handle: <:irc.planet-casio.com NOTICE * :*** Found your hostname (cached)>
|
||
|
_handle: <:irc.planet-casio.com NOTICE Darks :Serveur réservé aux membres de Planète Casio.>
|
||
|
[...]
|
||
|
```
|
||
|
|
||
|
## Ajout de commandes
|
||
|
|
||
|
### Réaction à des évènements v5
|
||
|
|
||
|
TBD
|
||
|
|
||
|
### Réaction à des messages IRC
|
||
|
|
||
|
Le bot reçoit tous les messages des canaux dans lequel il est présent. Ajouter une commande consiste à définir deux fonctions : une première qui filtre les messages, et une seconde qui exécute une action dans le cas où le filtre a laissé passer le message.
|
||
|
|
||
|
Dans les deux cas les fonctions prennent comme paramètre un objet de la classe Message. Il est donc possible d'accéder aux propriétés suivantes :
|
||
|
|
||
|
```
|
||
|
msg.author # L'auteur du message
|
||
|
msg.to # Le canal sur lequel il a été envoyé
|
||
|
msg.text # Le contenu du message
|
||
|
```
|
||
|
|
||
|
Le filtre est passé en paramètre du décorateur de la fonction d'action. On peut utiliser une lambda pour gagner en clarté dans le cas où la condition du filtre est triviale.
|
||
|
|
||
|
Il est possible d'envoyer des messages IRC avec la commande `<bot>.irc.send(to, message)`. Notons que `to` peut être soit un channel (préfixé par `#`), soit un utilisateur (pas de préfixe).
|
||
|
|
||
|
Les exemples suivants ajoutent deux fonctionnalités, l'une qui réagit aux messages comprennant le mot "heure", l'autre aux messages privés à destination de GLaDOS et comprenant une insulte.
|
||
|
|
||
|
```
|
||
|
@glados.irc.on(lambda m: "heure" in m.text)
|
||
|
def say_time(msg):
|
||
|
now = datetime.now().strftime("%Hh%M")
|
||
|
if msg.to == "GLaDOS":
|
||
|
# Private message
|
||
|
reply_to = msg.author
|
||
|
elif msg.to[0] == "#":
|
||
|
# Message on a public channel
|
||
|
reply_to = msg.to
|
||
|
else:
|
||
|
# WTF we received this message???
|
||
|
return
|
||
|
|
||
|
glados.irc.send(reply_to, f"Il est très précisément {now}, {msg.from}.")
|
||
|
|
||
|
|
||
|
|
||
|
def privately_insulted(msg):
|
||
|
insults = [
|
||
|
"bachi-bouzouk",
|
||
|
"extrait de cornichon",
|
||
|
"jus de poubelle",
|
||
|
"patagon de zoulous"
|
||
|
]
|
||
|
|
||
|
# It's not private
|
||
|
if msg.to != "GLaDOS":
|
||
|
return False
|
||
|
|
||
|
# It's an insult
|
||
|
for i in insults:
|
||
|
if i in msg.txt:
|
||
|
return True
|
||
|
|
||
|
return False
|
||
|
|
||
|
@glados.irc.on(privately_insulted)
|
||
|
def reply_insult(msg):
|
||
|
glados.irc.send(msg.author, "Ce n'est pas gentil, {msg.author}")
|
||
|
```
|