QNet
~~~~
QNet est un nime client pour <Mtp> Chat! crit en Qt (enfin c'est le
premier en Qt et le nime en gnral... enfin je me comprends)
Version actuelle : 0.47-cvs


Compiler
~~~~~~~~
pr-requis : 
- libqt3 + headers 
- qmake

Les versions de Qt testes sont les suivantes : Qt 3.0.5 (marche  peu prs convenablement), Qt >= 3.1 (pas de problme particulier)
Pour les autres versions : je n'ai pas la possibilit de tester dans ces conditions (non je n'ai pas 50 versions de Qt installes).
Si le problme que vous constatez n'est pas reproductible sur l'une des plateformes prcdemment cites, JE NE POURRAI RIEN FAIRE
Si quelqu'un me propose un patch spcifique pour contourner ce genre de problme je l'accepterai avec joie. Sinon, tant pis.

pour la compilation proprement dite, il faut positionner les variables
d'environnements QTDIR et QMAKESPEC
(ex : 
    "export QTDIR=/usr/lib/qt3" (mandrake) ou "export QTDIR=/usr/share/qt" voire "export QTDIR=/usr/share/qt3" (debian)
    "export QMAKESPEC=linux-g++"
)

puis un "qmake && make" devrait suffire... (l un caf s'impose, en
plus a compile en mode debug)

J'insiste sur le fait qu'il faut positionner les variables *avant* le
qmake, sinon make vous insulte. Dans ce cas, outre le fait que ce
n'est pas bien de ne pas lire le README, il faut effacer le Makefile
de *chaque* rpertoire avant de recommencer (bien fait pour vous)

Aprs a, si tout s'est bien pass (mouahaha je n'y crois pas un instant) le joli excutable se trouve dans bin/

Reste  copier le qnetrc en ~/.qnetrc et  lancer le monstre.
update: dans l'tat actuel des choses, il vous faudra diter le .qnetrc et remplacer les lignes /path/to/*.so par les chemins absolus menant  chacun des plugins.
On essaiera de faire un peu mieux plus tard ;-)

Sigma.

Commentaires d'utilisateurs
~~~~~~~~~~~~~~~~~~~~~~~~~~~
"<Kartoch> Lofic: trs simple, il te suffit de peindre une fenetre de scroll et 5 boutons sur un parpaing... mme ergonomie que le qnet original"

Fonctionnalits
~~~~~~~~~~~~~~~
Toutes les fonctionnalits ou presque sont lies  la notion de filtre (entre/sortie). Les filtres ne sont pas encore directement accessibles  l'utilisateurs pour configuration dynamique, mais c'est prvu ;-)

Exemples de fonctionnalits :
- multi-sessions (seul le protocole "Mtp" est support pour l'heure)
- coloration/formatage de la sortie
- support des urls, configuration des applications  lancer (attention aux trous de scurit, aucun contrle n'est effectu au niveau des urls)
- onglets de tell / wall
- fentres des utilisateurs prsents
- historique des commandes entres au clavier (Shift + haut/bas)
- zone d'entre multilignes (Ctrl-Entre pour aller  la ligne, flches pour naviguer)
- redimensionnage des messages trop longs (avec respect des commandes prfixes : tell, senddata ...)
- mode fortune (indispensable)
- compltion des logins (Tab aprs au moins une lettre de login)
- support dessin (exprimental -- norme  dfinir avec les autres implmenteurs)
- contrle distant (en cours, utilit indniable ;-))
- quivalent du kaware (apparition en bas de l'cran d'un message contenant le login, ou d'un message de tell)


Prcisions sur les filtres
~~~~~~~~~~~~~~~~~~~~~~~~~~
Les versions antrieures  la 0.47 intgrent les filtres dans le code : outre le fait que ceci est Mal(tm) ca vous empche de les configurer, donc la question est rgle.
Bon maintenant, suite  des demandes rptes de nombreux fans (assorties de menaces d'ailleurs) les filtres sont dports dans le .qnetrc, ce qui est Bien(tm). A l'heure o j'cris (Vendredi 9 Mai, 10h, tout est calme), la configuration a l'intrieur du client n'est pas encore possible, mais nos meilleurs techniciens y travaillent jour et nuit. Donc, si vous voulez vous lancer dans l'criture d'un filtre, il vous faudra :
- matriser la syntaxe obscure desdits filtres
- les convertir en format xml (ce qui n'est pas ncessairement la partie la plus facile)

On va s'occuper de la premire partie.
Au commencement il y eut le filtre (Filter) dans toute sa splendeur de gnralit. Malheureusement il tait fort virtuel (virtual) car ne sachant gure  quoi on allait l'employer, il engendra donc 5 fils :

- GlobalFilter l'an, qui a le premier un droit de regard sur tout ce qui est mis par le serveur

- BlockFilter le second, qui a la charge fort peu enviable de reconnatre des blocs spcifiques dans le bordel infme qu'est votre session de chat.

- LineFilter, dont la tache est d'agir sur les lments plus simples que sont les lignes de texte.

- ItemFilter, qui essaie de ramasser par ci, par l quelques lments caractristiques 

- InputFilter, qui lui n'agit pas sur ce qui arrive dans le client, mais sur ce qui en sort, nous reviendrons sur son rle ultrieurement.

Il existe une hirarchie naturelle entre les 4 premiers : chacun peut autoriser ou non le suivant  agir, et un filtre ne peut participer au repas que lorsque son suprieur a fini de manger. Oui je sais, c'est affreux ce que je dis, moyenageux et tout, mais ca simplifie la vie :-).
InputFilter quant  lui, seul de sa caste, il n'a pas ce genre de soucis.

Attardons nous un instant sur l'intration entre filtres et plugins. Pour faire simple : les plugins fournissent des outils aux filtres, et c'est tout. Un plugin peut-tre charg ou pas, si il n'est pas utilis par un filtre, cela revient au mme. Inversement, si un filtre fait appel  un plugin inexistant, le tout fonctionne forcment moins bien. Pour le moment il n'existe pas de solution permettant de conditionner un filtre par l'existence d'un plugin, ca viendra plus tard.

Maintenant que j'ai dessin le contexte, un exemple simplifi (hourras dans la foule)
<aboutme>
  <result>\1\&lt;font color=red>\2\\3\\4\\5\&lt;/font>
:splash:spl:\2\\3\\4\</result>
  <regexp>(:\w+:\w+:)?(&lt;.*>)?(\d{2}:\d{2}:\d{2} )?(&amp;lt .*\login\[^&lt;]*)(&lt;.*>)?</regexp>
</aboutme>

L je sens comme un silence gn, non? bon on va dtailler un peu plus. Traduit du xml en bonnes expressions rgulires ca donne :
regexp : (:\w+:\w+:)?(<.*>)?(\d{2}:\d{2}:\d{2} )?(&lt .*\login\[^<]*)(<.*>)?
result : \1\<font color=red>\2\\3\\4\\5\</font>
	 :splash:spl:\2\\3\\4\

Toujours pas? ok
globalement la regexp match tout ce qui peut venir du serveur et qui comporte la valeur \login\ dans la phrase principale (comprendre tout ce qui vient VRAIMENT du serveur, et pas de ce qu'on a pu y ajouter dans les tages de filtres qui prcdent)
\login\ est une variable qui est initialise auparavant (vous n'avez pas besoin de vous en proccuper) pour matcher votre login, qu'il soit tout en majuscules, en minuscules ou combinaison exotique des deux.

result se dcoupe en 2 parties: la premire est transmise au plugin de destination de la ligne avant qu'elle traverse notre filtre (voir le "(:\w+:\w+:)?" qui est appel grace  "\1\") et colorie en rouge toute la ligne.
la deuxime partie est adresse spcifiquement au plugin qui exporte le type "splash" et a pour effet de lui faire afficher une partie de la ligne.

Voil, simple non?
Ah oui comme vous n'aurez pas manqu de le remarquer, les lignes du serveur arrivent sous une forme un peu altre : les "<" sont convertis en "&lt " etc.

Plugins
~~~~~~~
Les plugins fournis avec l'engin sont les suivants:

- affect : permet l'affectation d'une variable dans un filtre

- browser : affichage dans une frame de texte

- drawing : supporte le channel Dessin propre  <Mtp> Chat !

- emit : emet un message (auto-reply, etc.)

- id : fenetre exprimentale pour le finger ;-)

- splash : popup dans un coin de l'cran

- tell : onglet de discussion prive

- ptime : gestion de l'heure et de la date (timestamp par exemple)
  ex : :ptime:ok:HOUR<-[time]hh:mm:ss
  ex : :ptime:ok:DAY<-[date]dd:MM:yy

- pformat : formatage de chaines de caractres
  ex : :pformat:ok:PLOP<-"%1",("\Login\":-8)
  met dans la variable PLOP votre login format sur 8 caractres avec alignement  gauche
