;Includes
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <TCP.au3>
#include <Inet.au3>
;Includes END
;Cleanup
OnAutoItExitRegister("_End")
;Cleanup END
;Variablen und Arrays
Global $BanList[1] ;Ban Liste
Global $NameArray[1] ;Namens Liste
Global $ClientArray[5] ;Socket/Client Liste
Global $ip = @IPAddress1 ;IP
Global $port = 3333 ;Port
Global $state = False ;Erfolgreich?
Global $block = False ;5 User erreicht?
$hServer = _TCP_Server_Create($port, $ip) ;Server erstellen
_TCP_RegisterEvent($hServer, $TCP_RECEIVE, "Receive") ;Funktion wenn empfangen
_TCP_RegisterEvent($hServer, $TCP_NEWCLIENT, "NewClient") ;Neuer Client
_TCP_RegisterEvent($hServer, $TCP_DISCONNECT, "Disconnect") ;Client Disconnected
;GUI
Opt("GUIOnEventMode", 1)
#region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 615, 438, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
Global $List1 = GUICtrlCreateList("", 24, 72, 201, 253)
Global $Button1 = GUICtrlCreateButton("Ban", 232, 72, 75, 25)
GUICtrlSetOnEvent(-1, "Button1Click")
Global $Button2 = GUICtrlCreateButton("Unban", 232, 104, 75, 25)
GUICtrlSetOnEvent(-1, "Button2Click")
Global $Button3 = GUICtrlCreateButton("Senden", 232, 136, 75, 25)
GUICtrlSetOnEvent(-1, "Button3Click")
Global $Input1 = GUICtrlCreateInput("...", 232, 168, 121, 21)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
;Main While Schleife
While 1
	Sleep(100)
WEnd
;GUI END
Func NewClient($hSocket, $iError) ;Neuer Client
	;MsgBox(0, "SERVER", "NewClient") MSGBOX für Debug
	Global $hClient = $hSocket ;Eigentlich sinnlos...
	Global $hClientIP = _TCP_Server_ClientIP($hClient) ;IP des Clienten
	Global $hClientName = _TCPIpToName($hClientIP) ;Netzwerkname
	;Bann Abfrage
	If _ArraySearch($BanList, $hClientIP) <> -1 Then ;Wenn die IP in der Banliste steht dann schicke zum Client:
		_TCP_Send($hClient, "##banned~1") ;##banned~1
	Else ;Wenn nicht dann:
		_TCP_Send($hClient, "##banned~0") ;##banned~0
	EndIf
	;END
	;Clienten Abfrage
	If $block = True Then ;Wenn 5 Clienten verbunden sind und ein neuer kommt dann:
		_TCP_Send($hClient, "##block~1") ;##block~1
	EndIf
	;END
	Select ;Clienten Freie Array Plätze zuweisen
		Case $ClientArray[0] = "" And $state = False And $block = False
			$ClientArray[0] = $hClient & "|" & $hClientName
			Global $state = True
		Case $ClientArray[1] = "" And $state = False And $block = False
			$ClientArray[1] = $hClient & "|" & $hClientName
			Global $state = True
		Case $ClientArray[2] = "" And $state = False And $block = False
			$ClientArray[2] = $hClient & "|" & $hClientName
			Global $state = True
		Case $ClientArray[3] = "" And $state = False And $block = False
			$ClientArray[3] = $hClient & "|" & $hClientName
			Global $state = True
		Case $ClientArray[4] = "" And $state = False And $block = False
			$ClientArray[4] = $hClient & "|" & $hClientName
			Global $state = True
			Global $block = True
	EndSelect
	;END
	If $state = True Then ;Wenn alles erfolgreich war dann:
		_TCP_Send($hClient, "##accepted~" & $hClient) ;##accepted~($hclient)
		Call("Chat", "Client: " & $hClientName & " has joined!") ;Schreibe in den Chat: "Client: " & $hClientName & " has joined!"
	EndIf
	;END
	Global $state = False ;Abschluss
	FileDelete("client.txt") ;Dateien löschen
	FileDelete("ban.txt")
	FileDelete("clientnames.txt")
	;END
	_FileWriteFromArray("clientnames.txt", $NameArray) ;Arrays in Dateien schreiben
	_FileWriteFromArray("client.txt", $ClientArray)
	_FileWriteFromArray("ban.txt", $BanList)
	;END
	_TCP_Server_Broadcast("##name~" & $hClientIP) ;Nickname Abfrage
	;END
EndFunc   ;==>NewClient
Func Disconnect($hSocket, $iError) ;WEnn jemand disconnectet dann:
	$search = _ArraySearch($NameArray, $hSocket) ;Suche in Nickname Array nach dem Socket
	_ArrayDelete($NameArray, $search) ;Lösche den Eintrag
	$search = _ArraySearch($ClientArray, $hSocket) ;Suche in Clienten Liste nach dem Socket
	_ArrayDelete($ClientArray, $search) ;Lösche den Eintrag
	;END
	FileDelete("client.txt") ;Lösche Dateien
	FileDelete("ban.txt")
	FileDelete("clientnames.txt")
	;END
	_FileWriteFromArray("clientnames.txt", $NameArray) ;Array neuschreiben
	_FileWriteFromArray("client.txt", $ClientArray)
	_FileWriteFromArray("ban.txt", $BanList)
	;END
	ToolTip("SERVER:Client disconnected:" & $hSocket) ;Tooltip
EndFunc   ;==>Disconnect
Func Received($hSocket, $sReceived, $iError) ;Wenn etwas empfangen wurde:
	$split = StringSplit($sReceived, "~") ;Teile auf: vor und nach "~"
	Select
		Case $split[0] = "##useradd"
			If _ArraySearch($NameArray, $split[1]) <> -1 Then ;Wenn der Name schon gefunden wurde
				_TCP_Send($hSocket, "##userblock") ;Sende ##userblock
			Else ;Wenn nicht:
				_ArrayAdd($NameArray, $hSocket & "|" & $split[1]) ;Den Socket und den Namen dem Array hinzufügen
				_TCP_Server_Broadcast("##usersuc~" & $split[1]) ;Allen Clienten das schicken ##usersuc~&$split[1]
			EndIf
	EndSelect
	;END
EndFunc   ;==>Received
Func Kick($ClientName) ;Funktion KICK
	_TCP_Server_Broadcast("##kick~" & $ClientName) ;An Alle Clienten: ##kick~$ClientName
EndFunc   ;==>Kick
Func Chat($hMessage) ;Funktion Chat
	_TCP_Server_Broadcast("##chat~" & $hMessage) ;Sende ##chat~$hMessage
EndFunc   ;==>Chat
Func Ban($hSocket) ;Bann Funktion
	$hIP = _TCP_Server_ClientIP($hSocket) ;IP herausfinden
	_ArrayAdd($BanList, $hIP) ;Füge dem Array die IP hinzu
	ToolTip("IP:" & $hIP & " banned.") ;ToolTip
	;Array neu schreiben
	FileDelete("client.txt")
	FileDelete("ban.txt")
	FileDelete("clientnames.txt")
	_FileWriteFromArray("clientnames.txt", $NameArray)
	_FileWriteFromArray("client.txt", $ClientArray)
	_FileWriteFromArray("ban.txt", $BanList)
EndFunc   ;==>Ban
Func UnBan($hSocket) ;Funktion UnBan
	$search = _ArraySearch($BanList, $hSocket)
	_ArrayDelete($BanList, $search)
	ToolTip("IP:" & $hSocket & " unbanned.") ;ToolTip
	FileDelete("client.txt") ;Array neuschreiben
	FileDelete("ban.txt")
	FileDelete("clientnames.txt")
	_FileWriteFromArray("clientnames.txt", $NameArray)
	_FileWriteFromArray("client.txt", $ClientArray)
	_FileWriteFromArray("ban.txt", $BanList)
EndFunc   ;==>UnBan
Func _End() ;Ende
	_TCP_Server_Stop()
	FileDelete("client.txt")
	FileDelete("ban.txt")
	FileDelete("clientnames.txt")
EndFunc   ;==>_End ;###GUI
Func Button1Click()
	$input = GUICtrlRead($Input1)
	Call("Ban", $input)
EndFunc   ;==>Button1Click
Func Button2Click()
	$input = GUICtrlRead($Input1)
	Call("UnBan", $input)
EndFunc   ;==>Button2Click
Func Button3Click()
	$input = GUICtrlRead($Input1)
	Call("Chat", $input)
EndFunc   ;==>Button3Click
Func Form1Close()
	Exit
EndFunc   ;==>Form1Close
;###GUI END