#cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.6.1 Author: Matwachich Script Function: Serveur de tchat réseau local TCP. #ce ---------------------------------------------------------------------------- #include #include Opt("TrayOnEventMode", 1) Opt("TrayMenuMode", 3) Global $bavard = True If StringInStr($cmdlineRaw, "/notips") Then $bavard = False ; si on ajoute le parametre /notips, alors le serveur sera moins bavards! (moin de traytips) ; ##### Tray menu ##### $t_list = TrayCreateItem("Clients list") $t_ban = TrayCreateItem("Ban client") TrayCreateItem("") $t_exit = TrayCreateItem("Exit") TrayItemSetOnEvent($t_exit, "_exit") TrayItemSetOnEvent($t_list, "_displayClientsList") TrayItemSetOnEvent($t_ban, "_banClient") ; ##### ##### Global $hSocket, $ip, $port, $f, $iniName = "server.ini", $ret = 0 _getConfig($ip, $port) ; Récupere les parametres (ip et port) ; ##### Lancement du serveur ##### $hSocket = _TCP_Server_Create($port, $ip) ConsoleWrite("> Server launched on " & $ip & ":" & $port & " - Socket: " & $hSocket & @CRLF) If $bavard Then TrayTip("Server", "Launched on " & $ip & ":" & $port, 1) $ret = _TCP_RegisterEvent($hSocket, $TCP_NEWCLIENT, "_newClient") ConsoleWrite(" register new client: " & $ret & @CRLF) $ret = _TCP_RegisterEvent($hSocket, $TCP_RECEIVE, "_receive") ConsoleWrite(" register receive: " & $ret & @CRLF) $ret = _TCP_RegisterEvent($hSocket, $TCP_DISCONNECT, "_disconnect") ConsoleWrite(" register disconnect: " & $ret & @CRLF) ; ##### ##### Func _receive($hSocket, $sReceived, $iError) ; ##### c'est la fonction principale, elle se charge des messages entrants ConsoleWrite('(F) _receive: ' & $sReceived & @CRLF) If StringInStr($sReceived, "setNick") Then ; identification _setNick($hSocket, StringTrimLeft($sReceived, 8)) ElseIf $sReceived = "/clients list" Then ; liste des clients Local $list = _getClientsList() _TCP_Send($hSocket, $list) ElseIf StringLeft($sReceived, 1) = "@" Then ; message privé Local $nick = _StringBetween($sReceived, "@", ":") ; On recupere le destinataire du message privé If Not IsArray($nick) Then ; si la fonction n'a pas marcher, c'est qu'il y a une erreur de syntax dans la commande du PM _TCP_Send($hSocket, "Syntax error: @user:your message") Return EndIf Local $count = StringLen($nick[0]) ; on recupere la longeur du nom du destinataire Local $handle = _getHandle($nick[0]) ; on recuper la socket ($handle) du destinataire, à partir de son nom If $handle = -1 Then ; s'il n'existe pas (le destinataire), on renvoi une erreur _TCP_Send($hSocket, "User not found!") Return EndIf If _getNick($hSocket) = $nick[0] Then ; on verifie si l'envoyeur n'essay pas de s'envoyer un PM à lui même!!! si oui, on revoi "lol!" ;-p _TCP_Send($hSocket, "lol!") Return EndIf _TCP_Send($handle, "(PM) " & _getNick($hSocket) & ": " & StringTrimLeft($sReceived, $count + 2)) ; on envoi le message privé au destinataire _TCP_Send($hSocket, "YOU (PM) " & $nick[0] & ": " & StringTrimLeft($sReceived, $count + 2)) ; on envoi la confirmation que le message est arrivé Else ; les autres cas Local $nick = _getNick($hSocket) If $nick <> "_error_" Then ; si l'utilisateur n'est pas identifié, on ne transmet pas son message et lui demande de s'identifier _TCP_Server_Broadcast($nick & ": " & $sReceived) Else ; si l'utilisateur est identifié, on transmet son message à tous les autres _TCP_Send($hSocket, "SERVER: Please identify yourself!") EndIf EndIf EndFunc Func _getClientsList() ; envoi la liste des clients à l'utilisateur avec la socket $hSocket ConsoleWrite('(F) _sendClientsList' & @CRLF) Local $ret = "Clients list:" Local $array = _TCP_Server_ClientList() For $i = 1 To $array[0] $ret &= @CRLF & " " & $i & "- " & _getNick($array[$i]) & " - Ip: " & _TCP_Server_ClientIP($array[$i]) Next $ret &= @CRLF & " -----" Return $ret EndFunc Func _displayClientsList() ; Utiliser pour le serveur: affiche la liste des clients dans un traytip TrayTip("Clients connected", _getClientsList(), 5) EndFunc Func _banClient() ; Utiliser pour le serveur: Banir un client Local $nick = InputBox("Ban client", "Which client to ban?") Local $socket = _getHandle($nick) If $socket = -1 Then TrayTip("Server", "Client not found", 1) Return EndIf _TCP_Server_DisconnectClient($socket) EndFunc Func _setNick($hSocket, $nick) ; inscrit dans le fichier de configuration un couplet (correspondance): $hSocket=$nick (c-a-d un correspondance entre une socket et un nom d'utilisateur, ou nick) ConsoleWrite('(F) _setNick' & @CRLF) IniWrite($iniName, "nicks", String($hSocket), $nick) _TCP_Server_Broadcast("SERVER: " & $nick & " is connected!") If $bavard Then TrayTip("Server", $nick & " is connected!", 1) EndFunc Func _getNick($hSocket) ; recuper le nom de l'utilisateur avec la socket $hSocket ConsoleWrite('(F) _getNick' & @CRLF) Return IniRead($iniName, "nicks", String($hSocket), "_error_") EndFunc Func _getHandle($nick) ; recuper la socket de l'utilisateur avec le nom $nick ConsoleWrite("(F) _getHandle" & @CRLF) Local $array = IniReadSection($iniName, "nicks") For $i = 1 To $array[0][0] If $array[$i][1] = $nick Then Return $array[$i][0] Next Return -1 EndFunc Func _newClient($hSocket, $iError) ; Recoit la connexion d'un nouveau client, et lui envoi la demande de s'identifier ConsoleWrite('(F) _newClient' & @CRLF) _TCP_Send($hSocket, "SERVER: Please identify yourself!") If $bavard Then TrayTip("Server", "New client!", 1) EndFunc Func _disconnect($hSocket, $iError) ; detecte la déconnexion d'un client et supprime le couplet $hSocket=$nick correspondante dans le fichier de configuration ConsoleWrite('(F) _disconnect' & @CRLF) Local $nick = _getNick($hSocket) Local $sText = "SERVER: " & $nick & " disconnected!" ConsoleWrite($sText & @CRLF) _TCP_Server_Broadcast($sText) ; previent tous le monde que le client s'est déconnecter IniDelete($iniName, "nicks", $hSocket) If $bavard Then TrayTip("Server", $nick & " disconnected!", 1) EndFunc Func _getConfig(ByRef $ip_, ByRef $port_) ; utiliser pour la création du serveur: renvoi l'ip et le port ConsoleWrite('(F) _getConfig' & @CRLF) $ip_ = IniRead($iniName, "config", "ip", "127.0.0.1") $port_ = Number(IniRead($iniName, "config", "port", "8080")) EndFunc Func _exit() ; Quitter ConsoleWrite('(F) _exit' & @CRLF) FileDelete($iniName) _TCP_Server_Stop() ConsoleWriteError("Server stop, exit..." & @CRLF) Exit EndFunc While 1 ; boucle Sleep(100) WEnd