Open Eye
Description
Vous en avez marre, chaque fois que vous vous absentez, de devoir relire des kilomètres de logs pour savoir si vos utilisateurs adorés n'ont pas trop foutu le bordel en votre absence ?
Vous êtes en charge de surveiller un chan assez fréquenté et vous attrapez des migraines à force de devoir lire chaque ligne pour savoir si tout le monde reste sage ?
Vous rêvez d'avoir un concierge privé qui garderait l'oeil ouvert en permanence et qui vous ferait un résumé des évènements dignes d'intérêt dès votre retour ?
Ou alors vous préféreriez peut-être qu'il avertisse en temps réel sur un chan de votre choix (ou même en pv) dès qu'il se passe quelque chose d'inhabituel ?
C'est précisément tout ce à quoi sert Open Eye.
Open Eye est un système de surveillance complet qui vous rapportera tout ce que vous lui aurez demandé de surveiller.
Il existe 15 types de surveillance différents et chacun de ces types possède un nombre variable de sous-types pour un total de 57 critères de surveillance.
Voici les 15 types de base :
- keyword = surveillance des mots clés dans tous les messages, notices et ctcp action (/me) publics.
- join = surveillance des utilisateurs rejoignant #chan.
- part = surveillance des utilisateurs quittant #chan.
- quit = surveillance des utilisateurs se déconnectant du serveur.
- netsplit = surveillance des utilisateurs perdus sur #chan lors d'un netsplit.
- rejoin = surveillance des utilisateurs rejoignant #chan après un netsplit.
- invite = surveillance des invitations sur #chan.
- nickchange = surveillance des changements de nick sur #chan.
- kick = surveillance des kicks sur #chan.
- ban = surveillance des bannissements sur #chan.
- unban = surveillance des "dé-bannissements" sur #chan.
- mode = surveillance des changements de modes sur #chan.
- topic = surveillance des changements de topic sur #chan.
- connect = surveillance des connexions de votre Eggdrop au serveur.
- disconnect = surveillance des déconnexions de votre Eggdrop du serveur.
Chaque type se décline en sous-types.
Pour le type keyword par exemple, il est possible de détecter l'évènement en fonction du nick de la personne qui a parlé, de son host, de son handle, de ce qu'il a dit, ou encore de tous ces sous-types à la fois.
Voici les différents sous-types possibles (certains ne sont disponibles que pour certains types) :
- nick = la chaîne de détection sera comparée avec le nick de l'utilisateur qui a déclenché l'évènement.
- hand = la chaîne de détection sera comparée avec le handle de l'utilisateur qui a déclenché l'évènement.
- host = la chaîne de détection sera comparée avec le host de l'utilisateur qui a déclenché l'évènement.
- text = la chaîne de détection sera comparée avec le texte que l'utilisateur a écrit.
- msg = la chaîne de détection sera comparée avec le message de part, de quit ou de kick, selon le cas.
- topic = la chaîne de détection sera comparée avec le topic.
- targetnick = la chaîne de détection sera comparée avec le nick de la cible d'une invitation ou d'un kick, selon le cas.
- targethand = la chaîne de détection sera comparée avec le handle de la cible d'une invitation ou d'un kick, selon le cas.
- targethost = la chaîne de détection sera comparée avec le host de la cible d'une invitation ou d'un kick, selon le cas.
- newnick = la chaîne de détection sera comparée avec le nouveau nick d'un l'utilisateur qui vient d'en changer.
- banmask = la chaîne de détection sera comparée avec le masque de ban ou d'unban, selon le cas.
- mode = la chaîne de détection sera comparée avec le mode.
- arg = la chaîne de détection sera comparée avec l'argument du mode.
- all = la chaîne de détection sera comparée avec tous les sous-types disponibles à la fois.
Comme je l'expliquais juste avant, certains sous-types ne sont disponibles que pour certains types :
- pour le type keyword, le sous-type peut être nick hand host text ou all
- pour le type join, le sous-type peut être nick hand host ou all
- pour le type part, le sous-type peut être nick hand host msg ou all
- pour le type quit, le sous-type peut être nick hand host msg ou all
- pour le type netsplit, le sous-type peut être nick hand host ou all
- pour le type rejoin, le sous-type peut être nick hand host ou all
- pour le type invite, le sous-type peut être nick hand host targetnick targethand targethost ou all
- pour le type nickchange, le sous-type peut être nick hand host newnick ou all
- pour le type kick, le sous-type peut être nick hand host targetnick targethand targethost msg ou all
- pour le type ban, le sous-type peut être nick hand host banmask ou all
- pour le type unban, le sous-type peut être nick hand host banmask ou all
- pour le type mode, le sous-type peut être nick hand host mode arg ou all
- pour le type topic, le sous-type peut être nick hand host topic ou all
Quelques exemples concrets
- Mettons que je veuille qu'Open Eye me rapporte quand quelqu'un prononce le mot "p0rn" sur le chan #monchan.
Je dois dans un premier temps activer la surveillance des mots clés dans les messages publics sur #monchan :
.survey set #monchan keyword on
Ensuite, je dois ajouter une chaîne de détection comme ceci :
.survey add #monchan keyword text *p0rn*
J'utilise des "*" afin qu'il détecte le mot p0rn même en plein milieu d'une phrase et non pas uniquement lorsqu'il est employé tout seul.
- Maintenant je veux qu'Open Eye me rapporte chaque fois qu'un user dont le host contient "BsMax" ouvre la bouche sur #monchan pour dire quelque chose; il me suffit d'ajouter une chaîne de détection supplémentaire :
.survey add #monchan keyword host *bsmax*
- Je souhaite aussi qu'Open Eye m'informe chaque fois qu'un user est banni sur n'importe quel chan où se trouve mon Eggdrop :
.survey add global ban nick *
En définissant des détections globales, assurez-vous que le type de surveillance en question soit activé au moins sur l'un de vos chans, sinon Open Eye ne verra pas grand-chose.
- Enfin, j'aimerais qu'Open Eye enregistre chaque fois que le mode m est mis ou enlevé sur #monchan :
.survey add #monchan mode mode ?m
Le ? remplaçant n'importe quel caractère, ?m détectera les modes +m et -m.
Informations complémentaires
Si le nom de certains de vos chans comporte des majuscules, assurez-vous de les avoir ajouté à l'Eggdrop (avec la commande .+chan) en respectant la casse des caractères, sans quoi Open Eye ne fonctionnera pas correctement.
Si vous avez fait l'erreur d'ajouter un chan à votre Eggdrop sans en respecter les majuscules et que vous ne voulez pas le supprimer / recréer pour ne pas perdre vos paramétrages, voici ce que vous pouvez faire :
- arrêtez votre Eggdrop
- éditez le fichier eggdrop.chan et remplacez toutes les occurrences du nom du chan que vous voulez rectifier
- démarrez votre Eggdrop
Veuillez noter que toutes les commandes doivent être tapées en partyline, et que l'affichage de l'historique de surveillance se fait lui aussi en partyline pour des raisons de rapidité d'affichage de nombreuses lignes de texte.
Vous pouvez contrôler si Open Eye doit appliquer ou non un style visuel (couleurs, gras, soulignement) sur ce qu'il affiche en partyline, au moyen du flag h.
Par exemple si vous voulez utiliser la coloration, vous devez taper :
et si vous préférez ne pas utiliser de style visuel du tout :
Vous ne verrez pas les couleurs si vous vous connectez à votre bot en telnet; pour les voir, connectez-vous à lui par CTCP chat.
Lorsqu'un déclencheur de type keyword (mot clé dans un message public) enregistre une ligne dans le rapport, vous noterez qu'il ajoute également les quelques lignes précédant la ligne qui l'a déclenché, ainsi que les quelques lignes qui suivent.
Il est ainsi possible de reconstituer le contexte de ce qui a été dit.
La ligne contenant le déclencheur est signalée au moyen d'un marqueur rouge afin de la différencier des lignes appartenant au contexte.
Les différents types de surveillance peuvent être activés/désactivés séparément sur chaque chan (au moyen de la commande .survey set) et ils sont sont tous désactivés par défaut si c'est la première fois que vous lancez ce script.
Dans le rapport de surveillance, les lignes impliquant deux utilisateurs (comme par exemple un kick impliquant l'auteur et la cible) ont une forme particulière : les deux derniers champs indiquent (handle_user1 / host_user1) et (handle_user2 / host_user2).
Dans le rapport de surveillance, les détections de type KEYWORD indiquent leur type de la façon suivante :
message normal :
<nick> blabla bla
notice au chan :
-nick- blabla bla
ctcp action (/me) :
* nick blabla bla
Il est possible pour d'autres scripts d'envoyer des lignes à Open Eye afin de les adjoindre au rapport, une procédure existe dans ce but précis.
Cette procédure se trouve en dehors du namespace d'Open Eye afin d'offrir une plus grande facilité d'utilisation; le revers potentiel est que si vous utilisez un autre script qui définit une procédure du même nom, vous aurez un conflit sur les bras.
Vous pourrez facilement corriger ce problème en modifiant le nom de ladite procédure dans Open Eye.
Voici comment utiliser cette fonction :
add_to_report <nom_du_script_appelant> <#chan> <information_à_ajouter>
Si l'information ne concerne pas un chan en particulier, mettez "-" à la place du nom du chan.
Nom_du_script_appelant doit être le nom du script qui envoie l'information.
Soyez prudent dans la façon dont vous utilisez cette fonction, si vous envoyez par exemple "\n" comme information, ça provoquera un retour à la ligne inopiné en plein milieu du fichier rapport et Open Eye n'aimera pas ça.
Open Eye déclare le package "OpenEye" afin que vous puissiez vérifier sa présence depuis d'autres scripts au moyen de la commande
package require OpenEye.
Syntaxe
.survey <on/off>
Active/désactive la surveillance (agit comme un interrupteur global).
.survey set [#chan] <type> <on/off>
Active/désactive la surveillance d'un type donné.
.survey <add/del> <global/#chan> <type> <subtype> <chaîne de détection>
Ajoute/supprime une chaîne de détection du type et du sous-type spécifié.
.survey list <global/#chan> <type> <subtype>
Affiche les chaînes de détection du type et du sous-type spécifié.
Si subtype vaut *, affiche les chaînes de détection de tous les sous-types confondus.
.survey lists <global/#chan>
Affiche un récapitulatif de toutes les listes de détection.
.survey copy <#chan1> <#chan2>
Copie les listes de détection de #chan1 sur #chan2 (il s'agit d'une fusion, aucun paramètre préexistant de #chan2 ne sera effacé)
.survey status [#chan]
Affiche un récapitulatif du statut de la surveillance sur tous les chans, ou seulement celui de #chan si ce dernier est spécifié.
.report <*/#chan/server> [date ou étendue de dates]
Affiche le rapport de surveillance complet, celui de #chan, ou le rapport d'évènements concernant le serveur (comme par exemple les connexions et déconnexions de l'Eggdrop).
Il est possible de filtrer les résultats en spécifiant une date ou une étendue de dates.
De nombreux formats de dates sont reconnus, en voici quelques exemples :
maintenant, aujourd'hui, jour, hier, lundi, sam, jeudi 23h10, 05/02, 5 février, février, février 2015, février 15, 5 fev 15, 5 février 2015, 5 février 2015 23:10, 02/2015, 2015, 23:10, 23:10:58, 23h, 23, 23h10, ...
D'autres variantes sont acceptées, notamment les équivalents anglais (now, today, yesterday, february, feb, saturday, sat, ...)
Syntaxe des étendues de dates :
date : seulement cette date (exemple : 05/02 = le 5 février dernier entre 0h et 23h59)
-date : avant cette date (exemple : -février 2015 = avant le 5 février 2015 à 0h00)
date- : à partir de cette date (exemple : 6h- = à partir de 6h aujourd'hui)
date1-date2 : entre ces deux dates incluses (exemple : 5 février 23:10-12/02 = entre le 5 février dernier à 23h10 et le 12 février dernier à 23h59)
.report search <*/#chan/server> <text/id> <arguments de recherche>
Effectue une recherche dans les rapports.
En spécifiant "text", la recherche s'effectuera dans le texte (messages, notices, messages de kick, ...).
En spécifiant "id", la recherche s'effectuera dans les informations d'identification (nick, handle, host, cible).
.report chanlist
Affiche une liste des emplacements surveillés pour lesquels des évènements ont été rapportés.
.report range <*/#chan/server>
Affiche le nombre d'éléments présents dans le rapport de surveillance de l'emplacement spécifié, ainsi que l'étendue temporelle couverte par tous ces éléments.
.report purge <*/#chan/server>
Efface tous les rapports de surveillance, celui de #chan, ou le rapport d'évènements concernant le serveur.
Informations complémentaires relatives à la syntaxe
Valeurs possibles pour l'argument type : keyword join part quit netsplit rejoin invite nickchange kick ban unban mode topic.
Pour la commande
.survey set, 2 types supplémentaires sont disponibles : connect et disconnect.
Si type vaut connect ou disconnect, vous ne devez pas spécifier #chan car ces 2 types de surveillance ne sont pas liés à un chan en particulier.
Exemples :
Activer la surveillance des changements de nick sur #monchan :
.survey set #monchan nickchange on
Désactiver la surveillance des déconnexions du serveur :
.survey set disconnect off
Valeurs possibles pour l'argument subtype : nick hand host text msg topic targetnick targethand targethost newnick mode banmask arg ou all
Pour la commande
.survey list, subtype peut aussi valoir *, auquel cas seront affichées les chaînes de correspondances de tous les sous-types à la fois.
Dans les chaînes de détection, la casse des caractères importe peu car tout est mis en minuscule SAUF en ce qui concerne les modes. En effet, les modes +m et +M n'ont pas la même signification par exemple.
Les chaînes de détection peuvent contenir des jokers :
? remplace n'importe quel caractère (te?t matche "test" et "text" mais pas "tesst" ni "tet")
* remplace n'importe quel nombre de caractères, y compris aucun (*test* matche "test", "abctestabc" et "ceci est un test !")
Les chaînes de détection sont littérales sauf en ce qui concerne les caractères jokers * et ?
Pour ajouter une chaîne de détection comportant un espace, entrez-la naturellement sans utiliser de guillemets.
Exemple :
.survey add #monchan keyword text ceci est un test
Pour ajouter une chaîne de détection devant matcher littéralement ? ou *, c'est à dire sans les considérer comme des jokers, faites-les précéder d'un antislash comme ceci : \? et \*
Changelog
1.0
1.1
- Correction d'un bug se produisant lorsqu'un mode était appliqué à l'Eggdrop (erreur [Open_Eye::check_RAW_MODE]: no such channel record).
- Correction : lorsque le bot rejoint un chan, il n'enregistre désormais plus un changement de topic dans son log.
- passage sous licence Creative Commons
1.2
- Correction : les modes +b ou -b ne sont plus adjoints au destinataire d'un ban/unban dans les rapports.
- Correction : faire partir l'Eggdrop d'un chan non défini comme statique ne provoque plus d'erreur.
- Correction : les CTCP ACTION (/me) sont maintenant clairement différenciés des messages normaux dans les rapports.
- Correction : le rapport est maintenant proprement déchargé de la mémoire après l'avoir consulté ou avoir fait un effacement sélectif.
- Ajout de l'option post_context_size permettant de définir un nombre de lignes qui seront ajoutées au rapport après qu'un mot clé a été détecté.
- Modification de l'option context_size qui s'appelle désormais pre_context_size.
- Ajout de l'option limit_logfile pour permettre de limiter la taille du rapport.
- Ajout de l'option limit_method permettant de choisir parmi 2 méthodes de limitation : limiter par nombre de lignes et par chan, ou définir une taille en octets à ne pas dépasser pour le fichier rapport.
- Ajout de l'option max_value_for_limit pour définir la valeur pour la limitation.
- Quelques ajustements mineurs du code ci et là.
1.21
- Correction : l'utilisation d'un "*" mal placé dans certaines commandes pouvait provoquer une erreur.
- Modification : l'utilisation de la commande "!survey list <place> <type> <subtype>" avec "*" comme sous-type, précise désormais le sous-type au début de chaque chaîne de détection.
1.3
- Ajout : la commande ".report chanlist" permet d'afficher une liste des emplacements surveillés pour lesquels des évènements ont été rapportés.
- Ajout : la commande ".report" accepte désormais "server" comme argument afin de n'afficher que les évènements concernant le serveur (comme par exemple les connexions et déconnexions de l'Eggdrop).
- Ajout : la commande ".report purge" accepte désormais "server" comme argument afin de n'effacer que le rapport d'évènements concernant le serveur.
- Ajout : l'affichage d'un rapport est maintenant précédé et suivi d'un séparateur pour clarifier.
- Modification : lorsque vous affichez le rapport d'un chan en particulier plutôt que de tous les chans à la fois, le nom du chan n'est plus inclus au début de chaque ligne du rapport à côté de la date et de l'heure.
1.4
- Correction : la sous-commande "chanlist" avait été oubliée dans l'aide à la syntaxe affichée par la commande .report
- Correction : l'aide affichée en cas d'ajout d'un filtre sur un type qui n'est actuellement pas surveillé était incorrecte.
- Correction : en activant la limitation de taille du fichier log avec la méthode 1, le rapport restait en mémoire après le comptage des lignes.
- Correction : une erreur survenait au démarrage du script si la limitation de taille des logs était activée et que le fichier de rapport était inexistant ou vide.
- Correction : la commande !report purge ne réinitialisait pas les compteurs de nombre de lignes utilisés pour la limitation des logs.
- Correction : les entrées en double sont désormais filtrées en cas de chevauchement de deux contextes pour le type KEYWORD.
- Correction : les notices étaient représentées comme un message normal dans le rapport pour le type KEYWORD.
- Ajout : le rapport d'activité peut désormais être affiché en temps réel sur un chan de votre choix, ou encore par message privé au premier utilisateur connecté parmi ceux d'une liste que vous spécifierez.
Les paramètres de configuration realtime_monitoring, realtime_monitoring_target et low_priority_realtime_monitoring ont été ajouté à cet effet.
- Ajout : il est maintenant possible de filtrer l'affichage des logs par date.
- Ajout : nouveaux paramètres de configuration highlight_txt_match1 et highlight_txt_match2, vous permettant de choisir de mettre en gras le ou les mots qui ont matché une chaîne de détection de type KEYWORD/TEXT, KICK/MSG, PART/MSG, QUIT/MSG ou TOPIC/TOPIC.
- Ajout : nouveau paramètre de configuration show_delimiters, vous permettant de choisir d'afficher ou non les délimiteurs au début et à la fin des rapports affichés avec la commande .report
- Ajout : nouvelle option log_rotation vous permettant de choisir le comportement de l'écriture du fichier log lorsque les quotas que vous avez définis sont atteints.
Le cas échéant, Open Eye pourra soit arrêter d'écrire dans ce fichier, soit effectuer une rotation en supprimant les données les plus anciennes.
- Ajout : nouveau paramètre de configuration file_logging, permettant d'activer ou désactiver l'écriture du log dans un fichier.
- Ajout : nouveaux paramètres de configuration filter_styles1 et filter_styles2, vous permettant de filtrer les styles visuels dans certaines données loguées (textes, topics et messages de quit/part/kick) afin de ne pas gêner la lisibilité.
- Ajout : Si vous ajoutez une chaîne de détection globale et que la surveillance du type concerné n'est activée sur aucun chan, vous en serez désormais averti.
- Ajout : Lors de la consultation d'un log avec la commande .report, le nombre d'éléments est maintenant indiqué au début.
- Modification : la surveillance ne sera désormais plus arrêtée si la limitation de taille des logs est activée, réglée pour utiliser la 2ème méthode, et que la limite est atteinte. Le cas échéant, seule l'écriture dans le fichier log sera stoppée.
- Modification : afin de ne pas interférer avec la codification chromatique dans les rapports, les ctcp action (/me) ne sont maintenant plus colorés en violet.
- Modification : les entrées concernant des évènements liés au serveur ne seront plus identifiées comme "global" mais comme "server" lorsqu'on tape !report chanlist
- Modification : les délimiteurs de début et de fin de rapport n'apparaissent plus s'il n'y a qu'une seule ligne à afficher.
- Nombreuses optimisations du code, remaniement et enrichissement de la documentation.
1.5
- Correction : le mécanisme de rotation des logs ne comptait pas le bon nombre de lignes à supprimer parmi les entrées les plus anciennes.
- Correction : des traitements inutiles impliquant le parsing de chaque ligne du rapport se produisaient à chaque lecture du fichier log.
- Correction : l'affichage des rapports consommait plus de RAM que nécessaire, car il était dupliqué en mémoire avant l'affichage.
- Correction : la procédure de désinstallation ne supprimait pas la procédure d'interopératibilité ::add_to_report
- Correction : le rappel de syntaxe donné en cas d'emplacement erroné n'était pas complet.
- Correction : le message informant que des éléments ont été omis en raison du filtrage par date n'était pas correctement mis au pluriel en fonction du nombre de lignes omises.
- Correction : certains caractères spéciaux dans les nicks n'étaient pas correctement interprétés lors de l'ajout aux logs.
- Correction : le caractère "*" n'était pas interprété correctement dans les messages lors de l'ajout aux logs.
- Correction : la base de données est désormais mieux formatée afin de respecter exactemnt 11 champs par entrée.
Les bases de données créées par des versions antérieures de Open Eye seront automatiquement converties au nouveau format au chargement du script.
- Correction : les appels à "::tcl::clock::scan" ont été remplacés par "clock scan" car ils posaient problème sur certains Eggdrops.
- Correction : Open Eye ne fonctionnait pas sur les chans dont le nom comporte des majuscules.
Si malgré la réparation de ce bug vous rencontrez encore des problèmes de fonctionnement sur les chans comportant des majuscules, veuillez vous reporter à la note sur ce sujet dans la documentation (sous INFORMATIONS COMPLEMENTAIRES).
- Correction : "maintenant" n'était pas reconnu comme un format de date valide pour le filtrage par date de la commande .report
- Correction : un problème d'encodage cassait parfois les caractères accentués.
- Correction : des caractères accentués à la fin d'un texte (message, message de quit ou de kick, ...) pouvait corrompre la structure de la base de données contenant les rapports.
- Correction : lors de la suppression d'un chan de l'Eggdrop, ses listes de détection et ses rapports restaient en place mais ne pouvaient ni être consultés, ni être supprimés. Ils sont désormais correctement effacés en même temps que le chan.
- Ajout : commande .report range <*/#chan/server> permettant de connaître le nombre d'éléments présents dans le log pour un emplacement donné, ainsi que leur étendue dans le temps.
- Ajout : commande .report search <*/#chan/server> <text/id> <arguments de recherche> vous permettant d'effectuer une recherche dans les rapports.
La recherche peut s'effectuer dans le texte (message, message de quit, ...) ou dans les informations d'identification (nick, handle, host, cible).
- Ajout : un en-tête est maintenant ajouté aux bases de données, afin de permettre d'en vérifier la version. Cet en-tête comporte également un rappel de la structure d'une entrée dans la base de données.
- Ajout : les lignes trop longues pour être affichées en une seule fois seront désormais découpées en autant de lignes que nécessaires pour pouvoir afficher toute l'information.
- Ajout : Open Eye utilise désormais des fichiers de langue pour l'affichage des messages du script.
Des fichiers pour la langue française et la langue anglaise sont fournis.
Un nouveau paramètre de configuration permettant de contrôler la langue a été ajouté, ainsi qu'un autre afin de contrôler l'emplacement des fichiers de langue.
- Ajout : le handle / host d'un utilisateur ayant changé un topic sera maintenant affiché dans les rapports.
- Ajout : l'Eggdrop "se voit" maintenant parler, ce qui permet de surveiller ses propos.
De plus, il pourra désormais apparaître dans le contexte des logs comme n'importe quel autre utilisateur.
- Ajout : création quotidienne d'une copie de sauvegarde des bases de données.
Le nouveau paramètre de configuration backup_time a été ajouté.
- Nombreuses optimisations du code.
Téléchargement
Open Eye v1.5
Laissez vos commentaires / questions / suggestions / rapports de bugs
ici.