Je me suis lancé dans la création d'un chat Client<>Serveur, je me suis basé sur l'UDF SimpleTCP de Matwachich, un grand merci à lui déjà.
Mais je rencontre un problème je voudrais créer un système de message privé entre utilisateur. Je pense qu'il faut que j'envoie une commande spéciale reconnu par le serveur pour lui dire que ce message est privé mais je ne comprend pas vraiment comment faire.
Je pense que ça fonctionne comme ça : Commande pour le serveur | Destinataire du message | Contenu du message.
Dans l'état je sais connais envoyer tout ça au serveur mais comment faire pour qu'il l'interprète, le traite et le renvoi à la bonne personne dans la foulée ?
Ca doit être à base de Stringleft tout ça mais le nom du destinataire ne feras pas toujours le même nombre de caractères, par exemple.
Bref je bloque sur plusieurs points donc si quelqu'un avais le courage d'analyser un le code et de me dire comment faire ça serais simpa, merci d'avance.
► Afficher le texteCode Client
Code : Tout sélectionner
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
AutoIt Version : 3.3.8.1
Auteur: MonNom
Fonction du Script :
Modèle de Script AutoIt.
#ce ----------------------------------------------------------------------------
#include <GuiEdit.au3>
#include "TCPClient.au3"
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <File.au3>
#include <GuiIPAddress.au3>
#include <FTPEx.au3>
#include <ComboConstants.au3>
#include <Crypt.au3>
#include "TCPServer.au3"
#include <Array.au3>
If Not FileExists(@UserProfileDir & "\Chat") Then DirCreate(@UserProfileDir & "\Chat")
$file = @UserProfileDir & "\Chat\Config.ini"
$file_update = @UserProfileDir & "\Chat\update.dat"
If Not FileExists($file) Then
IniWrite($file, "Configuration", "Pseudo", "")
IniWrite($file, "Configuration", "Adresse IP", "")
IniWrite($file, "Configuration", "Version", "1.0")
IniWrite($file, "Configuration", "MAJ Auto", "False")
IniWrite($file, "Configuration", "FTP", "FTP1")
EndIf
If Not FileExists($file_update) Then
IniWrite($file_update, "Client", "Version", IniRead($file, "Configuration", "Version", "Erreur de lecture"))
EndIf
TCPStartup()
; Choix du serveur de connexion grâce à l'adresse ip
; Choose your server with ip adress
If IniRead($file, "Configuration", "Adresse IP", "Erreur") <> "" Then
$ip = IniRead($file, "Configuration", "Adresse IP", "Erreur")
TrayTip("Connexion serveur", "Connexion au serveur : " & $ip, 1)
ElseIf IniRead($file, "Configuration", "Adresse IP", "Erreur") = "" Then
$ip = InputBox("Adresse ip", "Entrez l'adresse ip du serveur à joindre")
If $ip <> "" Then
IniWrite($file, "Configuration", "Adresse IP", $ip)
TrayTip("Connexion serveur", "Connexion au serveur : " & $ip, 1)
EndIf
EndIf
; On demande un nom d'utilisateur
; We need a user name
If IniRead($file, "Configuration", "Pseudo", "Erreur") <> "" Then
$__NickName = IniRead($file, "Configuration", "Pseudo", "Erreur")
ElseIf IniRead($file, "Configuration", "Pseudo", "Erreur") = "" Then
Do
$__NickName = InputBox("Chat", "Entrez votre pseudo")
If @error Then Exit
If $__NickName <> "" Then
IniWrite($file, "Configuration", "Pseudo", $__NickName)
EndIf
Until $__NickName
EndIf
$server = IniRead($file, IniRead($file, "Configuration", "FTP", "Erreur de lecture"), "Serveur", "Erreur de lecture")
$id = IniRead($file, IniRead($file, "Configuration", "FTP", "Erreur de lecture"), "Identifiant", "Erreur de lecture")
$mdp = "xxxxxx"
$int = True
AdlibRegister("ftp", 500)
AdlibRegister("_users", 500)
$version = IniRead($file, "Configuration", "Version", "Erreur")
;Cette ligne va aller chercher la version du logiciel en cours d'utilisation
#region ### START Koda GUI section ### Form=
Global $GUI = GUICreate("Chat", 748, 464, 192, 124)
Global $MenuItem1 = GUICtrlCreateMenu("&Menu")
Global $options = GUICtrlCreateMenuItem("Options", $MenuItem1)
Global $redemarrer = GUICtrlCreateMenuItem("Redémarrer", $MenuItem1)
Global $MenuItem4 = GUICtrlCreateMenuItem("" & @TAB & "", $MenuItem1)
Global $quit = GUICtrlCreateMenuItem("Quitter" & @TAB & "", $MenuItem1)
Global $Edit = GUICtrlCreateEdit("", 0, 0, 537, 401, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
GUICtrlSetData(-1, "")
Global $Label1 = GUICtrlCreateLabel("Liste des connectés :", 544, 8, 201, 17, BitOR($SS_CENTER, $SS_CENTERIMAGE))
Global $Combo1 = GUICtrlCreateCombo("", 544, 48, 201, 25)
Global $Input = GUICtrlCreateInput("", 8, 416, 449, 21)
Global $Button1 = GUICtrlCreateButton("Envoyer", 464, 416, 75, 25)
Global $Label2 = GUICtrlCreateLabel("Sélectionner un nom dans la liste", 544, 88, 204, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE))
Global $Label3 = GUICtrlCreateLabel("pour envoyer un message privé.", 544, 112, 204, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUISetState(@SW_SHOW)
Global $Form2 = GUICreate("Options", 315, 198, 192, 124)
Global $Checkbox1 = GUICtrlCreateCheckbox("Modifier l'adresse ip par défaut", 8, 16, 169, 17)
Global $Checkbox2 = GUICtrlCreateCheckbox("Modifier mon pseudo", 8, 40, 161, 17)
Global $Input2 = GUICtrlCreateInput($__NickName, 176, 40, 129, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
GUICtrlSetState($Input2, $GUI_DISABLE)
Global $Label1 = GUICtrlCreateLabel("L'application va re-démarrer pour confirmer les changements.", 8, 128, 292, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE))
Global $quitter = GUICtrlCreateButton("Retour", 8, 168, 75, 25)
Global $valider = GUICtrlCreateButton("Valider", 232, 168, 75, 25)
Global $maj = GUICtrlCreateButton("Verification Mise à Jour", 88, 168, 139, 25)
Global $modif_ip = _GUICtrlIpAddress_Create($Form2, 176, 16, 130, 21)
_GUICtrlIpAddress_Set($modif_ip, IniRead($file, "Configuration", "Adresse IP", "Erreur"))
_GUICtrlIpAddress_ShowHide($modif_ip, @SW_HIDE)
Global $Label2 = GUICtrlCreateLabel("Choix du FTP", 8, 72, 148, 17, BitOR($SS_CENTER, $SS_CENTERIMAGE))
Global $Combo1 = GUICtrlCreateCombo("", 160, 72, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
GUICtrlSetData($Combo1, "FTP1|FTP2", IniRead($file, "Configuration", "FTP favori", "Erreur de lecture"))
Global $Checkbox3 = GUICtrlCreateCheckbox("Verification des mise à jour au démarrage", 8, 104, 217, 17)
#endregion ### END Koda GUI section ###
Global $tmp, $connTimer = TimerInit()
$connect = False
Global $inetget
Opt('GUICloseOnEsc', 0)
Global Const $SC_CLOSE = 0xF060
Global Const $MF_GRAYED = 0x00000001
$hMenu = DllCall('user32.dll', 'int', 'GetSystemMenu', 'hwnd', $Form2, 'int', 0)
DllCall('user32.dll', 'int', 'EnableMenuItem', 'hwnd', $hMenu[0], 'int', $SC_CLOSE, 'int', $MF_GRAYED)
; On créer un client et on lui assigne des fonction callback
; Client creation, and callbacks functions assigning
Global $Client = _TCPClient_Create($ip, 53698, "motdepassedecryptagedesdonneessupersecret")
_TCPClient_SetCallbacks($Client, "_TCP_Recv")
If _TCPClient_IsConnected($Client) = False Then
$connTimer = TimerInit()
TrayTip("Connexion", "Connexion en cours au serveur : " & $ip, 3)
Do
_TCPClient_Connect($Client)
If _TCPClient_IsConnected($Client) Then
$connect = True
TrayTip("Connexion", "Connexion établie", 1)
ExitLoop
ElseIf Not _TCPClient_IsConnected($Client) Then
$connect = False
EndIf
Until (TimerDiff($connTimer) > 5000 Or $connect = True)
If $connect = False Then TrayTip("Connexion", "Connexion au serveur échouée", 1)
EndIf
If IniRead($file, "Configuration", "MAJ Auto", "Erreur de lecture") = "True" Then
_maj()
EndIf
$infos = _TCPServer_SocketList()
For $i = 0 To UBound($infos) - 1
$ip = _TCPServer_IP2SocketID($infos[$i][1])
$user = _TCPServer_ClientPropertyGet($ip, 0)
GUICtrlSetData($Combo1, $user)
Next
; Boucle principale
; Main loop
While 1
Switch GUIGetMsg()
; Avant de quitter, on detruit le client
; Befor exit, we destroy the client
Case $GUI_EVENT_CLOSE
_quitter()
; ---
; Envoi d'un message, seulement si le Input contient quelque chose
; Sending message, only if there is something in the Input
Case $Button1
$tmp = GUICtrlRead($Input)
If $tmp Then
_TCPClient_Send($Client, $tmp)
GUICtrlSetData($Input, "")
EndIf
; ---
Case $maj
_maj()
Case $redemarrer
GUIDelete()
ShellExecute(@ScriptFullPath)
Exit
Case $quit
_quitter()
Case $options
GUISetState(@SW_SHOW, $Form2)
GUICtrlSetData($modif_ip, $ip)
GUICtrlSetData($Input2, $__NickName)
If IniRead($file, "Configuration", "MAJ Auto", "Erreur de lecture") = "False" Then
GUICtrlSetState($Checkbox3, $GUI_UNCHECKED)
ElseIf IniRead($file, "Configuration", "MAJ Auto", "Erreur de lecture") = "True" Then
GUICtrlSetState($Checkbox3, $GUI_CHECKED)
EndIf
GUICtrlSetData($Combo1, IniRead($file, "Configuration", "FTP", "Erreur de lecture"))
Case $quitter
GUISetState(@SW_HIDE, $Form2)
GUICtrlSetState($Checkbox1, $GUI_UNCHECKED)
GUICtrlSetState($Checkbox2, $GUI_UNCHECKED)
GUICtrlSetState($modif_ip, $GUI_DISABLE)
GUICtrlSetState($Input2, $GUI_DISABLE)
Case $Checkbox1
If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
_GUICtrlIpAddress_ShowHide($modif_ip, @SW_SHOW)
ElseIf GUICtrlRead($Checkbox1) = $GUI_UNCHECKED Then
_GUICtrlIpAddress_ShowHide($modif_ip, @SW_HIDE)
EndIf
Case $Checkbox2
If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
GUICtrlSetState($Input2, $GUI_ENABLE)
ElseIf GUICtrlRead($Checkbox2) = $GUI_UNCHECKED Then
GUICtrlSetState($Input2, $GUI_DISABLE)
EndIf
Case $valider
If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
If _GUICtrlIpAddress_Get($modif_ip) <> "" And GUICtrlRead($Input2) <> "" Then
IniWrite($file, "Configuration", "Adresse IP", _GUICtrlIpAddress_Get($modif_ip))
IniWrite($file, "Configuration", "Pseudo", GUICtrlRead($Input2))
GUIDelete()
ShellExecute(@ScriptFullPath)
Exit
Else
MsgBox(0, "Erreur", "Au moins un des deux champs est vide !")
EndIf
Else
If _GUICtrlIpAddress_Get($modif_ip) <> "" Then
IniWrite($file, "Configuration", "Adresse IP", _GUICtrlIpAddress_Get($modif_ip))
GUIDelete()
ShellExecute(@ScriptFullPath)
Exit
Else
MsgBox(0, "Erreur", "Le champ est vide !")
EndIf
EndIf
ElseIf GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
If GUICtrlRead($Input2) <> "" Then
IniWrite($file, "Configuration", "Pseudo", GUICtrlRead($Input2))
GUIDelete()
ShellExecute(@ScriptFullPath)
Exit
Else
MsgBox(0, "Erreur", "Le champ est vide !")
EndIf
Else
GUISetState(@SW_HIDE, $Form2)
EndIf
If _IsChecked($Checkbox3) Then IniWrite($file, "Configuration", "MAJ Auto", "True")
If Not _IsChecked($Checkbox3) Then IniWrite($file, "Configuration", "MAJ Auto", "False")
IniWrite($file, "Configuration", "FTP", GUICtrlRead($Combo1))
EndSwitch
; ---
; Si le client est déconnecté, on essay de se connecter 1 fois / seconde
; If the client is disconnected, then we indefinitly try to connect once per second
; ---
; Fonction de traitement
; Processing function
_TCPClient_Process()
WEnd
Func _users()
$infos = _TCPServer_SocketList()
For $i = 0 To UBound($infos) - 1
$ip = _TCPServer_IP2SocketID($infos[$i][1])
$user = _TCPServer_ClientPropertyGet($ip, 0)
GUICtrlSetData($Combo1, $user)
Next
EndFunc ;==>_users
Func _maj()
$int = True
$ping = Ping("www.google.fr")
If Not $ping Then
MsgBox(0, "Erreur", "Problème de connexion internet." & @CRLF & @CRLF & "Ré-essayer plus tard.")
$int = False
EndIf
Sleep(1000)
If $int = True Then
$s_DatFile_Local = $file_update
$open = _FTP_Open("DownloadSession")
$myftp = _FTP_Connect($open, $server, $id, $mdp)
_FTP_ProgressDownload($myftp, $file_update, "/Update/update.dat")
;_FTP_FileGet($myftp, "/Update/update.dat", @ScriptDir & "\update.dat")
Global $s_ReleaseVer
$s_ReleaseVer = IniRead($s_DatFile_Local, "Client", "Version", "Erreur de lecture")
If _CompareVersions($s_ReleaseVer, $version) Then;On compare ici les versions, marche pour n'importe quel systeme de version avec des points "."
$msgversion = MsgBox(4 + 64, "Une nouvelle Version est Disponible", "Souhaitez vous la télécharger?" & @CRLF & @CRLF & "Si le téléchargement ne fonctionne pas, essayez de changer le FTP dans les options")
If $msgversion = 6 Then
_FTP_ProgressDownload($myftp, @ScriptDir & "\Client.exe", "/Update/Client.exe")
IniWrite($file, "Configuration", "Version", IniRead($s_DatFile_Local, "Client", "Version", "Erreur de lecture"))
ElseIf $msgversion = 7 Then
EndIf
Else
MsgBox(64, "Verification Mise à Jour", "Votre version est à jour.")
EndIf
FileDelete($s_DatFile_Local)
ElseIf $int = False Then
EndIf
EndFunc ;==>_maj
Func ftp()
$server = IniRead($file, "Configuration", "Serveur", "Erreur de lecture")
$id = IniRead($file, "Configuration", "Identifiant", "Erreur de lecture")
EndFunc ;==>ftp
Func _IsChecked($control)
Return BitAND(GUICtrlRead($control), $GUI_CHECKED) = $GUI_CHECKED
EndFunc ;==>_IsChecked
Func _SelfDelete($num = 1)
If @Compiled Then Exit ShellExecute(@ComSpec, " /c ping 127.0.0.1 -n " & $num & " & DEL /F " & FileGetShortName(@ScriptName), @ScriptDir, "open", @SW_HIDE)
EndFunc ;==>_SelfDelete
; Fonction appelée à la reception d'un message depuis le serveur
; Function called when a message is received from the server
Func _TCP_Recv($iClient, $Data)
If StringLeft($Data, 5) = "file" & Chr(11) Then
$Data = StringSplit($Data, Chr(11))
; ouvrir un fichier en mode écriture binaire
$hFile = FileOpen("fichier", 1)
FileWrite($hFile, $Data[2])
FileClose($hFile)
Return
EndIf
; Cette ligne ne sert à rien puisque nous n'avons qu'un seul client dans le script, mais si nous
; en avion plusieurs, elle permetterai si tous les clients avait la même fonction callback de réception,
; de savoir de quel client émane le message reçu
; This line isn't very usefull in our example, but it would be usefull in a script containing many clients
; in order to (if all the client had the same callback function) know which client is concerned by the event
If $iClient <> $Client Then Return
; ---
; Si le message reçu est une requète d'identification, alors on s'identify au pres du serveur
; If the message received is an identification request, then we identify ourself to the server
If $Data = "#IDENTIFY#" Then
If IniRead($file, "Configuration", "Pseudo", "Erreur") <> "" Then
$__NickName = IniRead($file, "Configuration", "Pseudo", "Erreur")
EndIf
_TCPClient_Send($iClient, "#NAME#" & $__NickName)
Return
EndIf
; ---
; Si non, ça veut dir que c'est un simple message, alors on l'affiche de le Edit
; Else, it's a simple chat message, so we display it in the Edit
Local $read = GUICtrlRead($Edit)
GUICtrlSetData($Edit, $read & $Data & @CRLF)
_GUICtrlEdit_LineScroll($Edit, 0, _GUICtrlEdit_GetLineCount($Edit))
EndFunc ;==>_TCP_Recv
Func _quitter()
_TCPClient_Destroy($Client)
TCPShutdown()
Exit
EndFunc ;==>_quitter
Func _Start($s_StartPath);Permet de lancer des sites internets
If @OSType = 'WIN32_NT' Then
$s_StartStr = @ComSpec & ' /c start "" '
Else
$s_StartStr = @ComSpec & ' /c start '
EndIf
Run($s_StartStr & $s_StartPath, '', @SW_HIDE)
If Not @error Then SetError(1)
EndFunc ;==>_Start
Func _CompareVersions($s_Vers1, $s_Vers2, $i_ReturnFlag = 0)
If $s_Vers1 = '' Then Return 0
Local $i, $i_Vers1, $i_Vers2, $i_Top
Local $a_Vers1 = StringSplit($s_Vers1, '.')
Local $a_Vers2 = StringSplit($s_Vers2, '.')
$i_Top = $a_Vers1[0]
If $a_Vers1[0] < $a_Vers2[0] Then
$i_Top = $a_Vers2[0]
EndIf
For $i = 1 To $i_Top
$i_Vers1 = 0
$i_Vers2 = 0
If $i <= $a_Vers1[0] Then
$i_Vers1 = Number($a_Vers1[$i])
EndIf
If $i <= $a_Vers2[0] Then
$i_Vers2 = Number($a_Vers2[$i])
EndIf
If $i_Vers1 > $i_Vers2 Then
$v_Return = 1
ExitLoop
ElseIf $i_Vers1 < $i_Vers2 Then
$v_Return = 0
ExitLoop
Else
$v_Return = -1
EndIf
Next
If $i_ReturnFlag Then
Select
Case $v_Return = -1
SetError(1)
Return 0
Case $v_Return = 1
Return $s_Vers1
Case $v_Return = 0
Return $s_Vers2
EndSelect
ElseIf $v_Return = -1 Then
SetError(1)
Return 0
Else
Return $v_Return
EndIf
EndFunc ;==>_CompareVersions► Afficher le texteCode serveur
Code : Tout sélectionner
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
AutoIt Version : 3.3.8.1
Auteur: MonNom
Fonction du Script :
Modèle de Script AutoIt.
#ce ----------------------------------------------------------------------------
#include "TCPServer.au3"
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <ComboConstants.au3>
#include <GUIListBox.au3>
TCPStartup()
If Not FileExists(@ScriptDir & "\log_server.txt") Then
_FileCreate(@ScriptDir & "\log_server.txt")
EndIf
$log = @ScriptDir & "\log_server.txt"
Global $Form1 = GUICreate("Serveur", 460, 608, 192, 125)
Global $Label1 = GUICtrlCreateLabel("Interface serveur", 8, 8, 444, 33, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont($Label1, 14, 550, "", "Comic Sans MS")
Global $List1 = GUICtrlCreateList("", 8, 56, 441, 188)
Global $Button2 = GUICtrlCreateButton("Quitter", 192, 544, 83, 25)
Global $Input5 = GUICtrlCreateInput("", 280, 576, 177, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $Group1 = GUICtrlCreateGroup("Message Privé", 8, 256, 441, 89)
Global $Combo1 = GUICtrlCreateCombo("", 64, 312, 129, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
Global $Label3 = GUICtrlCreateLabel("Users :", 16, 312, 44, 17)
Global $Label4 = GUICtrlCreateLabel("Message :", 16, 280, 53, 17)
Global $Input3 = GUICtrlCreateInput("", 72, 280, 369, 21)
Global $mp = GUICtrlCreateButton("Envoyer", 200, 312, 75, 25)
Global $fichier = GUICtrlCreateButton("Envoyer fichier", 320, 312, 91, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Group2 = GUICtrlCreateGroup("Message à tous", 8, 360, 441, 89)
Global $Input1 = GUICtrlCreateInput("", 72, 384, 369, 21)
Global $Label5 = GUICtrlCreateLabel("Message :", 16, 384, 53, 17)
Global $Button3 = GUICtrlCreateButton("Envoyer", 200, 416, 75, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Group3 = GUICtrlCreateGroup("Actions liés aux clients", 8, 464, 441, 73)
Global $Button1 = GUICtrlCreateButton("Clients Connectés", 24, 496, 99, 25)
Global $id = GUICtrlCreateButton("ID Clients", 144, 496, 83, 25)
Global $deco_client = GUICtrlCreateButton("Kick", 248, 496, 83, 25)
Global $ban = GUICtrlCreateButton("Ban", 352, 496, 83, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $convertir = GUICtrlCreateButton("Convertir", 192, 576, 83, 25)
Global $Input4 = GUICtrlCreateInput("", 8, 576, 177, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
GUISetState(@SW_SHOW)
; Créer un serveur TCP
; Create the server
_TCPServer_Create(@IPAddress1, 53698, 50, 1, "motdepassedecryptagedesdonneessupersecret")
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & "Le serveur est lancé, adresse ip : " & @IPAddress1)
_FileWriteLog($log, "Le serveur est lancé, adresse ip : " & @IPAddress1)
; Lui assigner ses fonctions callback en fonction des evenements
; Assign it callback functions, that will be called when events occurs
_TCPServer_SetCallbacks("_TCP_New", "_TCP_Lost", "_TCP_Recv")
; On démare le serveur
; Start the server
If Not _TCPServer_Start() Then Exit MsgBox(16, "Erreur", "Impossible de démarer le serveur!")
; Boucle principale, où est appelée la fonction de traitement
; Main loop, where the processing function is called
$count = _FileCountLines(@ScriptDir & "\blacklist.txt")
$nombre_ligne = 0
Global $run = 1
While $run
_TCPServer_Process()
Switch GUIGetMsg()
Case $Button2
_TCPServer_Broadcast("Le serveur est fermé.")
_FileWriteLog($log, "Serveur fermé.")
$run = 0
Case $GUI_EVENT_CLOSE
_TCPServer_Broadcast("Le serveur est fermé.")
_FileWriteLog($log, "Serveur fermé.")
$run = 0
Case $convertir
$socket_client = GUICtrlRead($Input4)
If Not $socket_client = "" Then
$nick = _TCPServer_ClientPropertyGet($socket_client, 0)
GUICtrlSetData($Input5, $nick)
If $nick = "" Then GUICtrlSetData($Input5, "Socket non utilisé par un client.")
Else
GUICtrlSetData($Input5, "Entrez un socket.")
EndIf
Case $Button1
GUICtrlSetData($List1, "Client(s) connecté(s) : " & _TCPServer_ClientCount())
_FileWriteLog($log, "Client(s) connecté(s) : " & _TCPServer_ClientCount())
Case $Button3
If Not GUICtrlRead($Input1) = "" Then
_TCPServer_Broadcast("Message pour tous : " & GUICtrlRead($Input1))
GUICtrlSetData($List1, "Message pour tous : " & GUICtrlRead($Input1))
_FileWriteLog($log, "Message pour tous : " & GUICtrlRead($Input1))
EndIf
GUICtrlSetData($Input1, "")
Case $id
$infos = _TCPServer_SocketList()
For $i = 0 To UBound($infos) - 1
$ip = _TCPServer_IP2SocketID($infos[$i][1])
$user = _TCPServer_ClientPropertyGet($ip, 0)
GUICtrlSetData($Combo1, $user)
Next
Case $deco_client
$socket_client = GUICtrlRead($Combo1)
If Not $socket_client = "" Then
$nick = _TCPServer_ClientPropertyGet($socket_client, 0)
_TCPServer_Broadcast($nick & " à été kické par le serveur. Raison : " & GUICtrlRead($Input3))
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " à été kické par le serveur. Raison : " & GUICtrlRead($Input3))
_TCPServer_Disconnect($socket_client)
_FileWriteLog($log, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " à été kické par le serveur. Raison : " & GUICtrlRead($Input3))
GUICtrlSetData($Input3, "")
EndIf
Case $ban
$socket_client = GUICtrlRead($Combo1)
If Not $socket_client = "" Then
$nick = _TCPServer_ClientPropertyGet($socket_client, 0)
_TCPServer_Broadcast($nick & " à été banni par le serveur. Raison : " & GUICtrlRead($Input3))
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " à été banni par le serveur. Raison : " & GUICtrlRead($Input3))
$ip_ban = _TCPServer_SocketID2IP($socket_client)
FileWriteLine(@ScriptDir & "\blacklist.txt", $ip_ban)
_TCPServer_Disconnect($socket_client)
_FileWriteLog($log, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " à été banni par le serveur. Raison : " & GUICtrlRead($Input3))
GUICtrlSetData($Input3, "")
EndIf
Case $mp
$socket_client = IniRead(@ScriptDir & "\serveur_users.ini", GUICtrlRead($Combo1), "Socket", "Erreur de Lecture")
$data_mp = GUICtrlRead($Input3)
If $socket_client = "" Then
MsgBox(16, "Erreur", "Socket non valide ou non utilisé.")
ElseIf $socket_client <> "" Then
If $data_mp = "" Then
MsgBox(16, "Erreur", "Le message à envoyer est vide.")
ElseIf $data_mp <> "" Then
_TCPServer_Send($socket_client, "Message privé du serveur : " & $data_mp)
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & "Message privé du serveur à " & GUICtrlRead($Combo1) & " : " & $data_mp)
_FileWriteLog($log, "Message privé du serveur à " & GUICtrlRead($Combo1) & " : " $data_mp)
GUICtrlSetData($Input3, "")
EndIf
EndIf
Case $fichier
$socket_client = GUICtrlRead($Combo1)
If $socket_client = "" Then
MsgBox(16, "Erreur", "Socket non valide ou non utilisé.")
Else
; ouvrir un fichier en mode binaire
$hFile = FileOpenDialog("Envoye", @WindowsDir & "\", "Tout (*.*)", 1 + 4)
; lire le contenu
$data = FileRead($hFile)
FileClose($hFile)
; ensuite, on envoi tout simplement. (le file servira juste à dire que c'est un fichier)
_TCPServer_Send($socket_client, "file" & Chr(11) & $data)
EndIf
EndSwitch
WEnd
; A la sortie de la boucle, on détruit le serveur
; Destroy the server and free ressources
_TCPServer_Destroy()
TCPShutdown()
; ##############################################################
; Fonction appelée lors de la connexion d'un nouveau client
; elle envoi à ce client une requète d'identification
; Function called when a new client connects
; it sends to the new connected client an identify request
Func _TCP_New($iSocket, $sIP)
_TCPServer_Send($iSocket, "#IDENTIFY#")
$nombre_ligne = 0
For $i = 1 To $count Step 1
If FileReadLine(@ScriptDir & "\blacklist.txt", $nombre_ligne) = _TCPServer_SocketID2IP($iSocket) Then
_TCPServer_Send($iSocket, "Serveur : Vous êtes banni de ce serveur.")
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " à été déconnecté car il est banni.")
_FileWriteLog($log, $nick & " à été déconnecté car il est banni.")
_TCPServer_Disconnect($iSocket)
ExitLoop
EndIf
$nombre_ligne += 1
Next
; ---
EndFunc ;==>_TCP_New
; Fonction appelée lors de la deconnexion d'un client
; elle envoi à tous le monde la notification de deconnexion
; Function called when a client disconnects
; it sends to other clients a disconnect notification
Func _TCP_Lost($iSocket, $sIP)
Local $nick = _TCPServer_ClientPropertyGet($iSocket, 0)
If $nick Then _TCPServer_Broadcast($nick & " à été déconnecté !")
$user = _TCPServer_ClientPropertyGet($iSocket, 0)
IniDelete(@ScriptDir & "\serveur_users.ini", $user)
; ---
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " à été déconnecté !")
_FileWriteLog($log, $nick & " à été déconnecté !")
EndFunc ;==>_TCP_Lost
; Fonction appelée lors de la réception d'un message d'un client
; Function called when a message is received from a client
Func _TCP_Recv($iSocket, $sIP, $data)
; Si le message est #CLOSE#:
; Notifie que quelqu'un a demandé la fermeture du serveur
; Et met la variable $run à 0
; If the message is #CLOSE#:
; We notify all clients that somebody requested closing the server
; We set $run to 0
If $data = "#CLOSE#" Then
Local $nick = _TCPServer_ClientPropertyGet($iSocket, 0)
If $nick Then
_TCPServer_Broadcast($nick & " Fermeture du serveur ...")
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " Fermeture du serveur ...")
_FileWriteLog($log, $nick & " Fermeture du serveur ...")
$run = 0
EndIf
; ---
; Si le message commence par #NAME#: Ca veut dire que ce client s'identifie
; On extrait son nom du message (avec le StringTrimLeft)
; On l'assigne à la propriété N°0 de sa socket
; On notifie de la connexion d'une nouvelle personne dans le chat
; If the message starts with #NAME#: It means that it's an identification
; We extract the name from the received data (With StringTrimleft)
; We assign it to the client's property N°0
; We notify everybody that a new client is connected
ElseIf StringLeft($data, 6) = "#NAME#" Then
Local $nick = StringTrimLeft($data, 6)
_TCPServer_ClientPropertySet($iSocket, 0, $nick)
IniWrite(@ScriptDir & "\serveur_users.ini", $nick, "Socket", $iSocket)
$nombre_ligne = 0
For $i = 1 To $count Step 1
If FileReadLine(@ScriptDir & "\blacklist.txt", $nombre_ligne) = _TCPServer_SocketID2IP($iSocket) Then
_TCPServer_Send($iSocket, "Serveur : Vous êtes banni de ce serveur.")
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " à été déconnecté car il est banni.")
_FileWriteLog($log, $nick & " à été déconnecté car il est banni.")
$user = _TCPServer_ClientPropertyGet($iSocket, 0)
IniDelete(@ScriptDir & "\serveur_users.ini", $user)
_TCPServer_Disconnect($iSocket)
ExitLoop
Else
_TCPServer_Broadcast($nick & " est connecté !")
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & $nick & " est connecté !")
_FileWriteLog($log, $nick & " est connecté !")
EndIf
$nombre_ligne += 1
Next
; ---
; Si non, ça veut dir que c'est un simple message, alors on le renvoi
; à tous le monde, en y préfixant le nom de la personne (contenu dans la
; propriété N°0 de la socket)
; Else, it's a simple message, so we broadcast it to every body, after adding
; to it as a prefix, the name of the client (contained in the client's property N°0)
Else
Local $nick = _TCPServer_ClientPropertyGet($iSocket, 0)
If $nick Then _TCPServer_Broadcast(@HOUR & ":" & @MIN & ":" & @SEC & " > " & "[" & $nick & "] : " & $data)
GUICtrlSetData($List1, @HOUR & ":" & @MIN & ":" & @SEC & " > " & "[" & $nick & "] : " & $data)
_FileWriteLog($log, "[" & $nick & "] : " & $data)
EndIf
EndFunc ;==>_TCP_Recv


