#include-once
#include <File.au3>
#include <Array.au3>
#include <Crypt.au3>
#include <SQLite.au3>
Global $aResult,$iRows,$iColumns,$tcp_socket_main,$tcp_socket_accept,$tcp_recv,$db
_Server_Database_Init()
_Server_TCP_Init()
_SQLite_Exec($db,"INSERT INTO RegisteredClients VALUES ('568','0','Jonas','-','-','-','17:41');") ;Klappt
_SQLite_GetTable2d($db,"SELECT * FROM RegisteredClients",$aResult,$iRows,$iColumns)
_ArrayDisplay($aResult)
_Server_Database_ClientAdd($tcp_socket_main,"Jonas")
_Server_TCP_Stop()
_Server_Database_Stop()
Func _Server_TCP_Init()
TCPStartup()
UDPStartup()
Global $tcp_socket_main = TCPListen(@IPAddress1,25560)
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" "&$tcp_socket_main&" TCP Main Socket is listening on "&@IPAddress1&" at Port 25560"&@CRLF)
Return $tcp_socket_main
EndFunc
Func _Server_TCP_Stop()
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" TCP is closing...")
TCPCloseSocket($tcp_socket_main)
TCPShutdown()
UDPShutdown()
ConsoleWrite("Done."&@CRLF)
EndFunc
Func _Server_Database_Init() ;Initialize the Tables
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" Database is initializing...")
_Crypt_Startup()
_SQLite_Startup()
FileDelete("Server.db")
Global $db = _SQLite_Open("Server.db")
_SQLite_Exec($db,"CREATE TABLE RegisteredClients (Socket,IP,Name,Banned,CBanned,TBanned,LastLogin);")
_SQLite_Exec($db,"CREATE TABLE ConnectedClients (Socket,IP,Name,LoginTime);")
ConsoleWrite("Done."&@CRLF)
EndFunc
Func _Server_Database_ClientLogout($hSocket) ;Deletes Temporal Info
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" Client with Socket "&$hSocket&" logged off"&@CRLF)
Return _SQLite_Exec($db,"DELETE FROM ConnectedClients WHERE Socket = '"&$hSocket&"';")
EndFunc
Func _Server_Database_ClientAdd($hSocket,$sName) ;Creates persistant Info
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" Client ADD "&$hSocket&@CRLF)
$sIP = SocketToIP($hSocket)
$ret = _SQLite_Exec($db,"INSERT INTO RegisteredClients VALUES ('"&$hSocket&"','"&$sIP&"','"&$sName&"','False','"-"','"-"','""');") ;Klappt nicht
MsgBox(0,"",$ret&@CRLF&@error&@CRLF&@extended&@CRLF&"---"&@CRLF&"Socket="&$hSocket&@CRLF&"Name="&$sName&@CRLF&"IP="&$sIP)
Return _Server_Database_ClientLogin($hSocket,$sName)
EndFunc
Func _Server_Database_ClientDel($hSocket) ;Deletes persistant Info
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" Client DEL "&$hSocket&@CRLF)
Return _SQLite_Exec($db,"DELETE FROM RegisteredClients WHERE Socket = '"&$hSocket&"';")
EndFunc
Func _Server_Database_ClientLogin($hSocket1,$sName) ;Creates Temporal Info
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" Client with Socket "&$hSocket1&" logged in"&@CRLF)
$sIP = SocketToIP($hSocket1)
_SQLite_Exec($db,"INSERT INTO ConnectedClients VALUES ('"&$hSocket1&"','"&$sIP&"','"&$sName&"','"&@HOUR&":"&@MIN&":"&@SEC&"');")
Return _SQLite_Exec($db,"UPDATE RegisteredClients SET LastLogin = '"&@HOUR&":"&@MIN&":"&@SEC&"' WHERE Socket = '"&$hSocket1&"';")
EndFunc
Func _Server_TCP_Recv($hSocket)
Do
Global $recv = TCPRecv($hSocket,1024^2)
Until $recv <> ""
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" TCP Message received: "&$recv&@CRLF)
Return $recv
EndFunc
Func _Server_TCP_Accept($hSocket)
Do
Global $tcp_socket_accept = TCPAccept($hSocket)
Until $tcp_socket_accept <> -1
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" TCP Request received: "&$tcp_socket_accept&@CRLF)
Return $tcp_socket_accept
EndFunc
Func _Server_TCP_Send($hSocket,$sData)
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" TCP Send to "&$hSocket&":"&$sData&@CRLF)
Return TCPSend($hSocket,$sData)
EndFunc
Func _Server_Database_Stop()
ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" Database is stopping...")
_SQLite_Close($db)
_SQLite_Shutdown()
_Crypt_Shutdown()
ConsoleWrite("Done."&@CRLF)
EndFunc
Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
            "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
        If Not @error Then $aRet = $aRet[0]
    Else
        $aRet = 0
    EndIf

    $sockaddr = 0
	ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" Socket "&$SHOCKET&" to IP "&$aRet&@CRLF)
    Return $aRet
EndFunc   ;==>SocketToIP