Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.1
Author: Matwachich
Script Function:
Test UDP - Chat décentralisé (LAN)
To do:
- Messages privés
- Affichage HTML
#ce ----------------------------------------------------------------------------
#NoTrayIcon
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <GuiEdit.au3>
#include <GuiListBox.au3>
Global $__Name
Do
$__Name = InputBox("MiniChat", "Votre identifiant", @UserName)
If @error Then Exit
If Not $__Name Then MsgBox(16, "Erreur", "Il vous faut un identifiant!")
Until $__Name
; ça sera le nom "interne", même 2 utilisateurs avec le même pseudo
; n'auront pas le même nom interne (du moins, très peut de chances!)
$__Name &= Chr(29) & Random(10000, 90000, 1) & @HOUR & @MIN & @SEC & Random(10000, 90000, 1)
UDPStartup()
; à modifier selon votre réseau
$Sock_Recv = UDPBind(@IPAddress1, 8080)
$Sock_Send = UDPOpen("192.168.1.255", 8080, 1)
Global $buffer, $__Onlines[1] = [0]
#Region ### START Koda GUI section ###
$GUI_Main = GUICreate("UDP Test - " & _GetName($__Name), 513, 270)
GUISetFont(10, 400, 0, "Calibri")
$Edit = GUICtrlCreateEdit("", 6, 6, 365, 227, BitOR($ES_AUTOVSCROLL,$ES_READONLY,$ES_WANTRETURN,$WS_VSCROLL,$LBS_NOINTEGRALHEIGHT), $WS_EX_STATICEDGE)
$hEdit = GuiCtrlGetHandle($Edit)
$List = GUICtrlCreateList("", 378, 6, 127, 264, BitOR($LBS_NOTIFY,$LBS_SORT,$WS_HSCROLL,$WS_VSCROLL), $WS_EX_STATICEDGE)
$hList = GuiCtrlGetHandle($List)
$Input = GUICtrlCreateInput("", 6, 240, 277, 23)
$B_Send = GUICtrlCreateButton("Send", 288, 240, 39, 21)
$B_Menu = GUICtrlCreateButton("Menu", 330, 240, 39, 21)
$B_Menu_ContextMenu = GuiCtrlCreateContextMenu($B_Menu)
$B_Menu_Void = GuiCtrlCreateMenuItem("Vider la fenêtre de conversation", $B_Menu_ContextMenu)
$B_Menu_Refresh = GuiCtrlCreateMenuItem("Actualiser la liste des utilisateurs", $B_Menu_ContextMenu)
Dim $accels[1][2] = [["{enter}",$B_Send]]
GuiSetAccelerators($accels)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_Send("in", $__Name)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_Send("out", $__Name)
UDPShutdown()
Exit
Case $B_Send
$tmp = GuiCtrlRead($Input)
If $tmp Then
_Send("msg", "[" & _GetName($__Name) & "] " & $tmp)
GuiCtrlSetData($Input, "")
EndIf
Case $B_Menu
ControlClick($GUI_Main, "", $B_Menu, "right")
Case $B_Menu_Refresh
_Send("in", $__Name)
Case $B_Menu_Void
GuiCtrlSetData($Edit, "")
EndSwitch
; ---
$recv = UDPRecv($Sock_Recv, 1024)
If $recv Then $buffer &= $recv
; ---
If StringRegExp($buffer, Chr(2) & ".*" & Chr(3)) Then
$buffer = StringRegExpReplace($buffer, Chr(2) & "(.*)" & Chr(3), "$1")
$buffer = BinaryToString($buffer, 4)
;ConsoleWrite("Received: " & StringReplace($buffer, Chr(28), @TAB) & @CRLF)
$buffer = StringSplit($buffer, Chr(28))
; ---
Switch $buffer[1]
Case "msg"
$buffer[2] = StringRegExpReplace($buffer[2], '(?s)(\[)(' & _GetName($__Name) & ')(\].*)', '$1Moi$3')
_GuiCtrlEdit_AppendText($hEdit, $buffer[2] & @CRLF)
Case "in"
_Onlines_Add($buffer[2], 1)
_Send("notif_in", $buffer[2])
If $buffer[2] <> $__Name Then _
_Send("notif_in", $__Name) ; Pour dir "je suis là!" au nouveaux venus!
Case "out"
_Onlines_Del($buffer[2], 1)
_Send("notif_out", $buffer[2])
Case "notif_in"
_Onlines_Add($buffer[2])
Case "notif_out"
_Onlines_Del($buffer[2])
EndSwitch
; ---
$buffer = ""
EndIf
WEnd
Func _Send($sCmd, $sData)
Return UDPSend($Sock_Send, Chr(2) & StringToBinary($sCmd & Chr(28) & $sData, 4) & Chr(3))
EndFunc
Func _Onlines_Add($sName, $iNotif = 0)
If _Onlines_UserExists($sName) Then Return ; On évite les doublons
; ---
Local $ub = $__Onlines[0]
ReDim $__Onlines[$ub + 2]
$__Onlines[$ub + 1] = $sName
$__Onlines[0] += 1
; ---
_GuiCtrlListBox_AddString($hList, _GetName($sName))
If $iNotif Then _GuiCtrlEdit_AppendText($hEdit, "< " & _GetName($sName) & " est connecté >" & @CRLF)
EndFunc
Func _Onlines_Del($sName, $iNotif = 0)
For $i = $__Onlines[0] To 1 Step -1
If $sName = $__Onlines[$i] Then
_GuiCtrlListBox_DeleteString($hList, _GUICtrlListBox_FindString($hList, _GetName($__Onlines[$i]), True))
If $iNotif Then _GuiCtrlEdit_AppendText($hEdit, "< " & _GetName($__Onlines[$i]) & " s'est déconnecté >" & @CRLF)
; ---
_ArrayDelete($__Onlines, $i)
$__Onlines[0] -= 1
Return
EndIf
Next
EndFunc
Func _Onlines_UserExists($sName)
For $i = 1 To $__Onlines[0]
If $sName = $__Onlines[$i] Then Return 1
Next
Return 0
EndFunc
Func _GetName($sName)
Return StringLeft($sName, StringInStr($sName, Chr(29)) - 1)
EndFunc