Well, you found me. Congratulations. Was it worth it?
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
Darks 08507b3df0
Updated readme
2 weeks ago
.gitignore Better PoC 6 months ago
README.md Updated readme 2 weeks ago
bot.py Improved the API 6 months ago
irc.py Added better logging system 2 weeks ago
main.py Added better logging system 2 weeks ago
v5.py Added better logging system 2 weeks ago

README.md

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 pour être précis).

Le troisième est une liste de canaux à joindre automatiquement lors de la connexion au serveur IRC.

from bot import Bot


glados = Bot(
    ('irc.planet-casio.com', 6697),
    ('127.0.0.1', 5555),
    ["#general", "#glados", "#tests"]
)

Ajout de commandes

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}")

Réaction à des évènements v5

Le bot écoute en permanence sur un socket UDP. C'est sur ce socket que la v5 envoie des messages. Actuellement les messages transitent au format #channel1 #channel2: message.

Coté bot, le système d'ajout de commandes est le même que pour IRC, à savoir deux fonctions à définir, une de test et une d'action. Ces fonctions prennent comme arguments une liste de strings correspondant aux canaux spécifiés lors de l'envoi, et une string correspondant au message envoyé.

Un exemple qui ne fait que retransmettre les messages :

@glados.v5.on(lambda c, m: True)
def announce(channels, message):
    for c in channels:
        glados.irc.send(c, message)

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.>
[...]

Axes d'amélioration

Le bot n'a aucune notion d'historique : un message ne peut être traité qu'individuellement, et non analysé dans son contexte. Ajouter un historique restreint (quelques dizaines de messages) permettrait de diversifier le comportement du bot.