Voila quelques années que je parcours le forum tel un fantome dans un grenier, sans vraiment y contribuer.
Mais nous avons changé d'année, pour le meilleur et pour le pire, aussi j'ai décidé de rediger un mini tuto sur une facon de creer un tchat, et sans doutes beaucoup plus.
Tout d'abord, il faut savoir que quand je dis "sans serveur, sans BDD", je parle des serveurs virtuels ou autres. Il faut tout de meme un hebergeur pour.. du PHP. Et oui, le php va faire office de serveur : il gerera l'enregistrement des messages et leur affichage.
Je vous fourni ici les codes :
Code : Tout sélectionner
Tchat.php :
<?php
if(!is_file('Tchat.txt'))
{
$Tchat=array();
file_put_contents('Tchat.txt', serialize($Tchat));
}
if(isset($_GET['Action']))
{
if($_GET['Action']=='Post' AND isset($_GET['Pseudo']) AND isset($_GET['Message']))
{
$Tchat=unserialize(file_get_contents('Tchat.txt'));
$Tchat[time()]=$_GET['Pseudo'].':'.$_GET['Message'];
file_put_contents('Tchat.txt', serialize($Tchat));
}
elseif($_GET['Action']=='Refresh')
{
$Tchat=unserialize(file_get_contents('Tchat.txt'));
ksort($Tchat);
foreach($Tchat as $Time => $Message)
{
echo $Message.'<br/>';
}
}
}
?>
Code : Tout sélectionner
Votre fichier .pb
DelayRefresh=3 ; frequence d'actualisation du tchat en secondes
Enumeration
#Fenetre
#Editeur
#Message
#Pseudo
#Police
EndEnumeration
Procedure.s Url2Text2(Url.s, OpenType.b,ProxyAndPort.s)
isLoop.b=1
INET_RELOAD.l = $80000000
hInet.l=0
hURL.l=0
Bytes.l=0
Buffer.s=Space(2048)
RES.s=""
hInet = InternetOpen_("", OpenType, ProxyAndPort, "", 0)
hURL = InternetOpenUrl_(hInet, Url, #Null, 0, INET_RELOAD, 0)
Repeat
InternetReadFile_(hURL,@Buffer, Len(Buffer), @Bytes)
If Bytes = 0
isLoop=0
Else
RES = RES + Left(Buffer, Bytes)
EndIf
Until isLoop=0
InternetCloseHandle_(hURL)
InternetCloseHandle_(hInet)
ProcedureReturn RES
EndProcedure
Procedure.s Get(Url.s)
ProcedureReturn Url2Text2(Url,1,"")
EndProcedure
Procedure Refresh(Delay)
Repeat
Try$=Get("http://URLDUSCRIPT.fr/Tchat.php?Action=Refresh")
Affichage$=ReplaceString(Try$,"<br/>",Chr(10))
SetGadgetText(#Editeur,Affichage$)
Delay(Delay*1000)
ForEver
EndProcedure
OpenWindow(#Fenetre, 0, 0, 600, 560,"Yrahen", #PB_Window_SystemMenu)
LoadFont(#Police, "Tahoma", 14)
SetGadgetFont(#PB_Default, FontID(#Police))
EditorGadget(#Editeur, 10, 10, 580, 490,#PB_Editor_ReadOnly|#PB_Editor_WordWrap)
StringGadget(#Message, 190, 510, 400, 40, "")
StringGadget(#Pseudo, 10, 510, 170, 40, "")
AddKeyboardShortcut(#Fenetre, #PB_Shortcut_Return, 15)
CreateThread(@Refresh(), DelayRefresh)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow
End
ElseIf Event=#PB_Event_Menu And EventMenu()=15
Pseudo$=GetGadgetText(#Pseudo)
Message$=GetGadgetText(#Message)
try$=Get("http://URLDUSCRIPT.fr/Tchat.php?Action=Post&Pseudo="+Pseudo$+"&Message="+Message$)
SetGadgetText(#Message,"")
EndIf
ForEver
Explication du code PHP :
En fait, quiconque à deja pratiqué le php dans sa vie se rendra vite compte que je n'ai utilisé que des bases. Pour les autres, en clair j'utilise un fichier Tchat.txt qui contient un array ( tableau ) contenant les pseudos/messages des tchateurs.
Pourquoi ne pas utiliser une base de données?
Pour plusieurs raisons. Une base de données c'est bien, mais c'est lent. De plus, le tchat est refresh regulierement, ce qui multiplie les ouvertures/fermetures/manipulations,ce qui peut amener un soucis d'overflow de la bdd. Et on a un gain de temps considerable avec le systeme de fichier.
Explication du code PureBasic :
Je tiens tout d'abord a grandement remercier celui qui a pondu la procedure Url2Text, elle est la base de ce code et de nombreux autres dont je me sert. Je ne me souviens pas ou je l'ai trouvé, mais je lui dit un grand merci et je lui offre le reste du champagne du nouvel an

Le code Pb est simple : un gadget Editeur dans lequel j'affiche les messages, 2 strings pour pseudo et messages.
Les messages sont affichés grace au code Php, dans la partie "Refresh", ou l'on affiche le contenu du tableau. Grace a Url2Text, on interroge le fichier Php qui renvoi les valeurs.
Les messages sont postés lorsque l'on appuie sur la touche ENTER : "If Event=#PB_Event_Menu And EventMenu()=15" ( je me suis tout betement suivi de la doc pour addkeyboardshorcut )
L'actualisation de l'affichage se fait grace a un thread, tout simplement. Dans ce thread, on interroge le serveur pour recuperer les messages et on les affiches dans l'editorgadget.
Tout cela n'est pas bien compliqué. Encore une fois, tout ceci n'est que base, rien de plus. Il est largement optimisable. Par exemple, a chaque refresh on recupere l'ensemble des messages alors que l'on pourrait recuperer seulement les nouveaux. C'est sans doutes simple grace a un systeme de timestamp. Par ailleurs, il n'y a pas d'auth, on peut changer de pseudo a notre guise, pourquoi ne pas faire un systeme de connexion par exemple.
J'ai voulu partager ce fragment de code parce que je le trouve extremement pratique, pour ma part je developpe un MUD ( sorte de mini mmorpg textuel un peu vintage ), basé sur Url2Text. Peut etre que ce code donnera a d'autres des idées funs, qui sait?
