irccd 3.0.0 et le futur
Il y a quelques mois de cela j’annonçais la sortie prochaine d’irccd 3.0.0. Au final beaucoup de temps a passé et la version n’a toujours pas vu le jour. Plusieurs raisons à cela, certaines personnelles qui m’ont légèrement démotivé de manière générale à la programmation et d’autres facteurs du cadre privé.
Néanmoins, ma motivation est à nouveau à son rendez vous et je pense pouvoir sortir cette tant attendue version.
L’après 3.0.0
Avant toute chose, je tiens à préciser que ça fait déjà 6 ans que je maintiens ce petit robot IRC. C’est un de mes premiers projet personnel en C++ et qui m’a été très formateur. Notez toutefois que ce n’est pas parce qu’il était un des premiers qu’il est nécessairement mal codé, j’attache une importance particulière à la qualité du code. Par ailleurs c’est ce qui change régulièrement dans irccd, il y a plus de refactoring que de nouvelles fonctionnalités juste parce qu’à mes yeux le code n’est jamais assez parfait.
Revenons en à nos robots. Après la version 3.0.0 je commencerai à ralentir son développement car je cherche maintenant sa stabilité au maximum et à mes yeux il n’a plus besoin de nouvelles fonctionnalités. C’est un robot IRC après tout, pas un système d’exploitation et à un moment donné il faut arrêter de rajouter au risque de tomber dans l’over engineering. Cela ne veut pas dire qu’il sera plus maintenu bien au contraire ! Je continuerai de corriger des bugs et de rajouter de nouveaux plugins. Il ne faudra simplment plus s’attendre à de gros changements majeurs d’une année à l’autre.
D’autant plus que la demande de bot IRC en C++ ne court pas les rues et malheureusement le plus beau et ancien protocol de communication textuel commence à perdre en parts de marchés face aux mastodones comme discord, slack et autres consommateurs de RAM. Par ailleurs, cela me permettra de dégager plus de temps sur des projets ayant plus d’ampleur comme ma distribution vanilla et mon moteur de RPG 2D.
La version 3.0.0
Mais qu’il y a-t-il dans cette nouvelle version qui prend autant de temps ? À vrai dire quelques fonctionnalités intéressantes mais surtout une stabilité interne et de l’API en plus.
Boost
Le premier changement qui saute aux yeux est l’inclusion de Boost. Longtemps réfractaire à ce framework j’ai finalement cédé lorsque mon syndrome NIH de mon code réseau me donnait plus de mal que de bien. Personnellement, je pense que Boost est loin d’être parfait ni même KISS mais ça a l’avantage d’être presque une unique dépendance pour pas mal de fonctionnalités nécessaires. À l’heure actuelle irccd utilise les composants suivants :
- Boost.System :
devrait disparaitre au profit de
std::error_code
, - Boost.Filesystem :
disparaitra quand
std::filesystem
sera stable avec GCC/Clang, - Boost.Test : seulement pour les tests unitaires,
- Boost.Process : seulement pour les tests unitaires,
- Boost.Predef : pour quelques macros de portabilité,
- Boost.DLL : pour charger les plugins natifs,
- Boost.Asio : pour la partie réseau.
Un exemple de module que je n’aime pas du tout est Program Options.
Celui ci est clairement compliqué et mal documenté. Par ailleurs il ne
m’est impossible de l’utiliser car je ne pourrais pas substituer mon
simple parseur pour les alias d’irccdctl
.
Nouvelle documentation
Si vous suivez irccd depuis un moment, vous allez peut-être vous dire « encore ? ». En effet irccd a largement changé de format de documentation au fil du temps. On est passé du wiki redmine à asciidoc/ldoc, de asciidoc/ldoc à un pandoc et pendant un court instant à outil de conversion markdown maison.
L’explication est plutôt simple. Au départ je voulais une source unique de documentation qui génère différents formats : HTML, man et éventuellement PDF. Sauf que c’est tout sauf simple. Un problème récurrent est la gestion des liens. En effet, lorsque vous voulez faire un lien interne dans votre documentation celle ci va être différente du format. Avec HTML vous allez faire un lien référence, dans un man vous pouvez faire une référence croisée et cela ce complique si vous séparez la documentation en plusieurs partie. À cela vous pouvez ajouter les images et certains niveaux d’indentation.
Aussi, je souhaitais rajouter des blocs spéciaux comme des « alertes/notice » qui vont nécessiter pas mal de code HTML et ne seront tout simplement pas possible en page de manuel.
Ce problème récurrent a fini par me démotiver et c’est d’ailleurs une des dernières tâches qui restaient pour la version 3.0.0. Étant libriste pur et dur et fan d’UNIX j’ai pris la décision radicale de faire des pages de manuel brutes et plus aucun autre format.
Au revoir libircclient
La bibliothèque de George Yunaev a finalement quitté irccd pour plusieurs raisons. Bien que je n’aime pas réinventer la roue, IRC est un protocol encore assez simple pour implémenter un parseur soi même. Et pour cause, l’implémentation maison ne dépasse pas les 400 lignes de code.
Le principal problème de cette bibliothèque est sa dépendance à
l’appel select(2)
qui empêchait une utilisation avec
Boost.Asio.
L’outil de test irccd-test fait son retour
L’outil irccd-test
qui avait été supprimé dans la
version 2.0.0 lors du passage de Lua à Javascript fait finalement son
retour. En prime, il offre un léger support de l’autocomplétion avec libedit.
Nouveau plugin joke
Un nouveau plugin destiné à afficher des blagues de manière aléatoires et non successives a fait son entrée dans le dépôt. Il se base sur un simple fichier JSON contenant un tableau de tableaux de chaînes de caractères.
markand: !joke
irccd: Have you tried turning it off and on again?
markand: !joke
irccd: Tip to generate a good random password:
irccd: Ask a Windows user to quit vim.
Nouveau plugin tictactoe
Un plugin pour jouer au morpion sur IRC fait son entrée. Ce plugin est particulièrement verbeux du fait de l’affichage de la grille et doit donc s’utiliser à bon escient sur des canaux destinés à cet usage.
Exemple :
markand: !tictactoe francis
irccd: a b c
irccd: 1 . . .
irccd: 2 . . .
irccd: 3 . . .
irccd: markand, it's your turn
markand: a 1
irccd: a b c
irccd: 1 x . .
irccd: 2 . . .
irccd: 3 . . .
irccd: francis, it's your turn
francis: c 1
irccd: a b c
irccd: 1 x . o
irccd: 2 . . .
irccd: 3 . . .
irccd: markand, it's your turn
markand: a 2
irccd: a b c
irccd: 1 x . o
irccd: 2 x . .
irccd: 3 . . .
irccd: francis, it's your turn
francis: c 3
irccd: a b c
irccd: 1 x . o
irccd: 2 x . .
irccd: 3 . . o
irccd: markand, it's your turn
markand: a 3
irccd: a b c
irccd: 1 x . o
irccd: 2 x . .
irccd: 3 x . o
irccd: markand, congratulations, you won!
Nouveau plugin links
Le tout premier plugin natif links débarque dans irccd. C’est un plugin qui s’occupe de récupérer la balise de titre d’une page web lorsqu’un lien est affiché sur IRC.
Encore légèrement expérimental ce plugin n’arrive pas toujours à tout récupérer et ne convertit pas la plupart des caractères HTML.
markand: http://example.org regardez !
irccd: Example domain
API réseau
Toutes les commandes réseau envoient désormais un code d’erreur défini en même temps qu’une chaîne de caractère informative. Cela permet d’avoir une gestion plus fine des erreurs côté client si nécessaire.
Gestion fine d’IPV4/IPV6
Certaines personnes souhaitent encore se passer d’IPV6 ou n’utiliser qu’IPV6. Maintenant, la plupart des connexions réseaux peuvent définir d’interdire ou non l’utilisation de l’un des protocoles.
Par exemple, vous pouvez demander à un serveur de n’utiliser qu’IPV6 :
[server]
host = example.org
port = 6667
ipv4 = false
ipv6 = true
Il en va de même pour la connexion irccdctl à irccd.
Suppression de la section [identity]
Bien qu’étant une bonne idée originale, elle sort de son principe de simplicité. La section était originellement prévue pour ne pas répéter un pseudonyme/nom/etc pour chaque serveur. Mais comme beaucoup de personnes utilisent seulement un serveur avec irccd j’ai préféré simplifié son utilisation pour une meilleure expérience utilisateur.
Ainsi, toutes les options d’une section [identity]
sont
simplement à déplacer dans chaque [server]
.
SSL pour les transports UNIX
Le support d’SSL est maintenant disponible pour les transport UNIX bien que ce soit rarement nécessaire.
Autres changements lors de la compilation
- Il n’y a plus de faux répertoire “fakeroot” lors de la compilation avec CMake,
- Tous les binaires et toutes les bibliothèques sont dorénavant placées dans un répertoire bin/ pour simplifier l’utilisation sur Windows.
Encore plus de tests
Davantages de tests unitaires ont été rajoutés pour tester notamment
l’outil irccdctl
et son affichage afin de garantir une
stabilité au niveau des scripts.