TCP Multichat Client+Server

  • hi Leute,

    ich weiß, gibt x-Verschiedene Multichats aber ich wollte meinen trotzdem posten xD

    WICHTIG: Er funktioniert(so wie er jetzt geschrieben ist) nur im lokalen Netzwerk!
    Wäre aber denk ich keine große Sache, ihn so umzuschreiben, dass er lokal und im Internet gleichzeitig funktioniert!

    Für Anregungen, Kritik und Bugmeldungen bin ich gerne offen!

    Server-Quellcode:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <Misc.au3>
    #include <Timers.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <EditConstants.au3>
    #include <ButtonConstants.au3>
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $tGes = _Timer_Init()

    [/autoit] [autoit][/autoit] [autoit]

    LogFile("@compiled: " & @Compiled, "Programm")
    LogFile("Pfad zur Exe: " & @AutoItExe, "Programm")
    LogFile("PID: " & @AutoItPID, "Programm")
    LogFile("AutoItVersion: " & @AutoItVersion, "Programm")
    LogFile("", "Programm")

    [/autoit] [autoit][/autoit] [autoit]

    If TCPStartup() <> 1 Then
    MsgBox(48, "Error", "TCP-Service konnte nicht gestartet werden!" & @LF & _
    "Programm wird beendet!")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    LogFile("TCP-Service erfolgreich gestartet", "Programm")

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $sTitle = "Chat Server"
    Global Const $sGUITitle = "Client-Verwaltung"
    Global Const $sIP = @IPAddress1
    Global Const $sPort = 2150
    Global Const $MainSocket = TCPListen($sIP, $sPort)
    Global Const $sPCNetworkName = @ComputerName
    Global Const $sBanListPath = @ScriptDir & "\Banlist.txt"

    [/autoit] [autoit][/autoit] [autoit]

    LogFile("Konstanten definiert", "Programm")
    LogFile("", "Programm")
    LogFile("Server-IP: " & $sIP, "Programm")
    LogFile("Server-Port: " & $sPort, "Programm")
    LogFile("Computername: " & $sPCNetworkName, "Programm")
    LogFile("", "Programm")
    LogFile("Abhör-Anschluss für eingehende Verbindung (Socket): " & $MainSocket, "Programm")
    LogFile("", "Programm")

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists($sBanListPath) Then _FileCreate($sBanListPath)

    [/autoit] [autoit][/autoit] [autoit]

    Global $sTitleChat = "Multichat"
    Global $tTrayTipTimer
    Global $bRestart = False
    Global $sDataAdmin
    Global $iMaxIndexClientList
    Global $iHours
    Global $iMins
    Global $iSecs
    Global $iLastMins
    Global $iLastHour
    Global $Time
    Global $aBanList[1]
    Global $BanMode
    Global $sBannedUser

    [/autoit] [autoit][/autoit] [autoit]

    _FileReadToArray($sBanListPath, $aBanList)
    _ArrayDelete($aBanList, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aUsers[1][4]

    [/autoit] [autoit][/autoit] [autoit]

    If _Singleton($sGUITitle) = 0 Then
    LogFile("Zweite Instanz geschlossen! - Nur eine Instanz erlaubt!", "Programm")
    LogFile("", "Programm")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Opt("TrayOnEventMode", 1)
    Opt("GuiOnEventMode", 1)
    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    If _VersionCompare(@AutoItVersion, "3.3.1.0") = -1 Then
    AdlibEnable("RefreshStuff")
    AdlibEnable("CheckSocket")
    AdlibEnable("CheckConnection", 2000)
    AdlibEnable("CheckIncoming")
    Else
    AdlibRegister("RefreshStuff")
    AdlibRegister("CheckSocket")
    AdlibRegister("CheckConnection", 2000)
    AdlibRegister("CheckIncoming")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    TrayTipExt("Server IP: " & $sIP & "" & @LF _
    & "Computername: " & $sPCNetworkName)

    [/autoit] [autoit][/autoit] [autoit]

    TraySetToolTip("Server IP: " & $sIP & "" & @LF _
    & "Computername: " & $sPCNetworkName)

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### TrayMenu
    TrayCreateItem("Verwaltung")
    TrayItemSetOnEvent(-1, "ToggleClientGUI")
    TrayCreateItem("IP in Zwischenablage kopieren")
    TrayItemSetOnEvent(-1, "CopyIPClipboard")
    TrayCreateItem("Chatchronik öffnen")
    TrayItemSetOnEvent(-1, "OpenChatLog")
    TrayCreateItem("")
    TrayCreateItem("Server neu starten")
    TrayItemSetOnEvent(-1, "_Exit")
    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "_Exit")
    TrayCreateItem("")
    TrayCreateItem("Chat beitreten (als Admin)")
    TrayItemSetOnEvent(-1, "_AdminChat")
    #EndRegion ### TrayMenu

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### VerwaltungGUI
    $hClientverwaltung = GUICreate($sGUITitle, 312, 248, 198, 131)
    $Group1 = GUICtrlCreateGroup("Verbundene Clients ", 0, 0, 185, 241)
    $ListView1 = GUICtrlCreateListView("Name|IP", 8, 16, 169, 217)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 70)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 95)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Kick", 192, 8, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "KickSelected")
    $Button2 = GUICtrlCreateButton("GUI beenden", 192, 104, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "ToggleClientGUI")
    $Button3 = GUICtrlCreateButton("Server beenden", 192, 136, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_Exit")
    $Button4 = GUICtrlCreateButton("Server neu starten", 192, 168, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_Exit")
    $Button5 = GUICtrlCreateButton("Erneuern", 192, 72, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "ShowClients")
    $Button6 = GUICtrlCreateButton("Bann", 192, 40, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "BanSelected")
    GUISetState(@SW_HIDE, $hClientverwaltung)
    #EndRegion ### VerwaltungGUI

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### ChatGUI
    $hMainGUI = GUICreate($sTitleChat, 750, 424, 203, 150)
    $Edit1 = GUICtrlCreateEdit("", 0, 0, 617, 393, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    GUICtrlSetData(-1, "")
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUICtrlSetCursor(-1, 2)
    $Input1 = GUICtrlCreateInput("", 0, 392, 521, 29)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUICtrlSetCursor(-1, 5)
    $Button6 = GUICtrlCreateButton("Senden", 520, 392, 97, 29, BitOR($BS_DEFPUSHBUTTON, $BS_CENTER, $BS_VCENTER, $WS_GROUP))
    GUICtrlSetOnEvent(-1, "_Send")
    $ListView2 = GUICtrlCreateListView("", 616, 0, 129, 420)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUISetState(@SW_HIDE, $hMainGUI)
    #EndRegion ### ChatGUI

    [/autoit] [autoit][/autoit] [autoit]

    #Region ###
    $hBanMsgBox = GUICreate("Wirklich verbannen?", 342, 103, 206, 133, BitOR($WS_CAPTION, $WS_BORDER, $WS_CLIPSIBLINGS))
    $Label1 = GUICtrlCreateLabel("", 16, 24, 308, 20)
    $Button7 = GUICtrlCreateButton("Permanent", 48, 64, 75, 25, $WS_GROUP)
    $Button8 = GUICtrlCreateButton("Temporär", 128, 64, 75, 25, $WS_GROUP)
    $Button9 = GUICtrlCreateButton("Gar nicht", 208, 64, 75, 25, $WS_GROUP)
    GUISetState(@SW_HIDE, $hBanMsgBox)
    #EndRegion ###

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "ToggleClientGUI", $hClientverwaltung)
    GUISetOnEvent($GUI_EVENT_CLOSE, "HideChatGUI", $hMainGUI)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetState($Input1, $GUI_FOCUS)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hListView1 = GUICtrlGetHandle($ListView1)
    Global $hListView2 = GUICtrlGetHandle($ListView2)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_AddColumn($hListView2, "Andere Clients", 125)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func CheckSocket()
    $TempSocket = TCPAccept($MainSocket)
    If $TempSocket <> -1 Then
    LogFile("Verbindungsanfrage von " & SocketToIP($TempSocket), "Programm")
    LogFile("", "Programm")
    If MsgBox(48 + 4, "Neuer Cient", "Ein neuer Client will sich mit dem Server verbinden!" & @LF & _
    "Daten:" & @LF & _
    "IP: " & SocketToIP($TempSocket) & @LF & _
    "Zulassen?", 15) = 6 Then
    ReDim $aUsers[UBound($aUsers, 1) + 1][4]
    $aUsers[UBound($aUsers, 1) - 1][0] = $TempSocket
    $aUsers[UBound($aUsers, 1) - 1][1] = SocketToIP($TempSocket)
    TrayTipExt("Neuer Client verbunden: '" & $aUsers[UBound($aUsers, 1) - 1][1] & "'")
    TCPSend($TempSocket, "//Accept")
    Else
    TCPCloseSocket($TempSocket)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $TempSocket = ""

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>CheckSocket

    [/autoit] [autoit][/autoit] [autoit]

    Func CheckIncoming()
    Local $aData[1]
    Local $TempUsers

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To UBound($aUsers, 1) - 1
    $TempData = TCPRecv($aUsers[$iIndex][0], 8192)
    Select

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 6) = "//Name"
    $TempData = StringTrimLeft($TempData, 7)
    $TempData = StringTrimRight($TempData, 1)
    If $TempData = "" Then ContinueCase
    $aUsers[$iIndex][2] = $TempData
    $TempSearchResultName = _ArraySearch($aUsers, $TempData, _ArraySearch($aUsers, $TempData) + 1)

    [/autoit] [autoit][/autoit] [autoit]

    If $TempSearchResultName <> -1 And StringLen($aUsers[$TempSearchResultName][2]) > 0 Then
    TCPSend($aUsers[$TempSearchResultName][0], "//Kick(DoubleName)")
    TCPCloseSocket($aUsers[$TempSearchResultName][0])

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "Server|" & $sIP & "|'" & $aUsers[$TempSearchResultName][2] & "' wurde vom Server gekickt, weil der Name bereits vergeben ist!")
    LogFile("Server => " & $aUsers[$i][2] & ": '" & $aUsers[$TempSearchResultName][2] & "' wurde vom Server gekickt, weil der Name bereits vergeben ist!", "Chat")
    Next
    WriteMemo("'" & $aUsers[$TempSearchResultName][2] & "' wurde vom Server gekickt, weil der Name bereits vergeben ist!", "Server")
    $aUsers[$TempSearchResultName][0] = ""
    $aUsers[$TempSearchResultName][1] = ""
    $aUsers[$TempSearchResultName][2] = ""
    $aUsers[$TempSearchResultName][3] = ""
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    $TempUsers = $aUsers[$i][2] & ";" & $TempUsers
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//Users(" & $TempUsers & ")")
    If $TempSearchResultName = -1 Then LogFile("Server => " & $aUsers[$i][2] & ": '" & $TempData & "' ist dem Chat beigetreten! IP: (" & $aUsers[$i][1] & ")", "Chat")
    Next
    WriteMemo("'" & $TempData & "' ist dem Chat beigetreten!", "Server")
    _GUICtrlListView_AddItem($hListView2, $TempData)

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 5) = "//Key"
    $TempData = StringTrimLeft($TempData, 6)
    $TempData = StringTrimRight($TempData, 1)

    [/autoit] [autoit][/autoit] [autoit]

    If $TempData = "" Then ContinueCase

    [/autoit] [autoit][/autoit] [autoit]

    $aUsers[$iIndex][3] = $TempData
    $TempSearchResultKey = _ArraySearch($aBanList, $TempData)

    [/autoit] [autoit][/autoit] [autoit]

    If $TempSearchResultKey <> -1 Then
    $sBannedUser = _ArraySearch($aUsers, $TempData)
    TCPSend($aUsers[$sBannedUser][0], "//Kick(Banned)")
    TCPCloseSocket($aUsers[$sBannedUser][0])

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "Server|" & $sIP & "|'" & $aUsers[$sBannedUser][2] & "' ist ein verbannter User!")
    LogFile("Server => " & $aUsers[$i][2] & ": '" & $aUsers[$sBannedUser][2] & "' ist ein verbannter User!", "Chat")
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Else
    TCPSend($aUsers[$iIndex][0], "//Allowed")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $aUsers[$sBannedUser][0] = ""
    $aUsers[$sBannedUser][1] = ""
    $aUsers[$sBannedUser][2] = ""
    $aUsers[$sBannedUser][3] = ""

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 6) = "//Quit"
    $TempData = StringTrimLeft($TempData, 7)
    $TempData = StringTrimRight($TempData, 1)
    If $TempData = "" Then ContinueCase
    $TempSearch = _ArraySearch($aUsers, $TempData)
    TCPCloseSocket($aUsers[$TempSearch][0])

    [/autoit] [autoit][/autoit] [autoit]

    $aUsers[$TempSearch][0] = ""
    $aUsers[$TempSearch][1] = ""
    $aUsers[$TempSearch][2] = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserQuit(" & $TempData & ")")
    LogFile("Server => " & $aUsers[$i][2] & ": '" & $TempData & "' hat den Chat verlassen!", "Chat")
    Next
    WriteMemo("'" & $TempData & "' hat den Chat verlassen!", "Server")
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $TempData))

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLen($TempData) > 0
    _ArrayAdd($aData, $TempData)

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect
    Next
    If StringLen($aData[(UBound($aData, 1) - 1)]) > 0 Then

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 1 To UBound($aData, 1) - 1

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], $aData[$iIndex])
    $aTempData = StringSplit($aData[$iIndex], "|", 2)
    LogFile($aTempData[0] & " => " & $aUsers[$i][2] & ": " & $aTempData[2], "Chat")
    Next
    WriteMemo($aTempData[2], $aTempData[0])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $TempUsers = ""
    $TempData = ""
    $TempSearchResultName = ""

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>CheckIncoming

    [/autoit] [autoit][/autoit] [autoit]

    Func CheckConnection()
    For $iIndex = 0 To UBound($aUsers, 1) - 1
    If Ping($aUsers[$iIndex][1], 250) = 0 And StringLen($aUsers[$iIndex][1]) > 0 Then
    TCPCloseSocket($aUsers[$iIndex][0])
    $aUsers[$iIndex][0] = ""
    $aUsers[$iIndex][1] = ""
    $aUsers[$iIndex][2] = ""
    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "Server|" & $sIP & "|Die Verbindung zur Maschine von '" & $aUsers[$iIndex][1] & "' ging verloren!")
    Next
    EndIf
    Next
    EndFunc ;==>CheckConnection

    [/autoit] [autoit][/autoit] [autoit]

    Func AFKKick()
    EndFunc ;==>AFKKick

    [/autoit] [autoit][/autoit] [autoit]

    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
    Return $aRet
    EndFunc ;==>SocketToIP

    [/autoit] [autoit][/autoit] [autoit]

    Func LogFile($sData, $sType)
    Switch $sType
    Case "Chat"
    _FileWriteLog(@ScriptDir & "\" & $sChatLogName, $sData)
    Case "Programm"
    _FileWriteLog(@ScriptDir & "\" & $sGeneralLogName, $sData)
    EndSwitch
    EndFunc ;==>LogFile

    [/autoit] [autoit][/autoit] [autoit]

    Func OpenChatLog()
    TrayItemSetState(@TRAY_ID, 68)
    If Not FileExists(@SystemDir & "\notepad.exe") Then
    MsgBox(48, "Error", "notepad.exe konnte nicht gefunden werden!")
    Return -1
    EndIf
    Run("notepad.exe " & $sChatLogName)
    EndFunc ;==>OpenChatLog

    [/autoit] [autoit][/autoit] [autoit]

    Func ShowClients()
    _GUICtrlListView_DeleteAllItems($hListView1)
    For $i = 0 To UBound($aUsers, 1) - 1
    If StringLen($aUsers[$i][2]) > 0 And StringLen($aUsers[$i][1]) > 0 Then
    $iTempIndex = _GUICtrlListView_AddItem($hListView1, $aUsers[$i][2], 0)
    _GUICtrlListView_AddSubItem($hListView1, $iTempIndex, $aUsers[$i][1], 1, 1)
    EndIf
    $iMaxIndexClientList = _GUICtrlListView_GetItemCount($hListView1)
    Next
    EndFunc ;==>ShowClients

    [/autoit] [autoit][/autoit] [autoit]

    Func KickSelected()
    For $iIndex = 0 To $iMaxIndexClientList - 1
    $TempStatus = _GUICtrlListView_GetItem($hListView1, $iIndex)
    If BitAND($TempStatus[0], 8) = 8 Then
    $TempSearchResult = _ArraySearch($aUsers, _GUICtrlListView_GetItemText($hListView1, $iIndex))
    If $TempSearchResult <> -1 Then
    TCPSend($aUsers[$TempSearchResult][0], "//Kick(Admin)")
    TCPCloseSocket($aUsers[$TempSearchResult][0])
    $aUsers[$TempSearchResult][0] = ""
    $aUsers[$TempSearchResult][1] = ""
    $aUsers[$TempSearchResult][3] = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserKick(" & $aUsers[$TempSearchResult][2] & ")")
    Next
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $aUsers[$TempSearchResult][2]))
    $aUsers[$TempSearchResult][2] = ""
    Else
    MsgBox(48, "Error", "Der User konnte nicht gefunden werden!")
    Return -1
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_DeleteAllItems($hListView1)
    For $i = 0 To UBound($aUsers, 1) - 1
    If StringLen($aUsers[$i][2]) > 0 And StringLen($aUsers[$i][1]) > 0 Then
    $iTempIndex = _GUICtrlListView_AddItem($hListView1, $aUsers[$i][2], 0)
    _GUICtrlListView_AddSubItem($hListView1, $iTempIndex, $aUsers[$i][1], 1, 1)
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $TempStatus = ""
    $iTempIndex = ""
    $TempSearchResult = ""

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>KickSelected

    [/autoit] [autoit][/autoit] [autoit]

    Func BanSelected()
    For $iIndex = 0 To $iMaxIndexClientList - 1
    $TempStatus = _GUICtrlListView_GetItem($hListView1, $iIndex)
    If BitAND($TempStatus[0], 8) = 8 Then
    $TempSearchResult = _ArraySearch($aUsers, _GUICtrlListView_GetItemText($hListView1, $iIndex))
    If $TempSearchResult <> -1 Then

    [/autoit] [autoit][/autoit] [autoit]

    Switch MsgBox(48 + 3, "Perm/Temp - Ban", "Soll der User permanent gebannt werden?" & @LF _
    "'JA' = Perm, 'NEIN' = Temp, 'Abbrechen' = Abbruch der Funktion")
    Case 6
    _FileWriteToLine($sBanListPath, _FileCountLines($sBanListPath) + 1, $aUsers[$TempSearchResult][3])
    _ArrayAdd($aBanList, $aUsers[$TempSearchResult][3])
    Case 7
    _ArrayAdd($aBanList, $aUsers[$TempSearchResult][3])
    Case Else
    Return -1
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    TCPSend($aUsers[$TempSearchResult][0], "//Kick(AdminBan)")
    TCPCloseSocket($aUsers[$TempSearchResult][0])
    $aUsers[$TempSearchResult][0] = ""
    $aUsers[$TempSearchResult][1] = ""
    $aUsers[$TempSearchResult][3] = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserBan(" & $aUsers[$TempSearchResult][2] & ")")
    Next
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $aUsers[$TempSearchResult][2]))
    $aUsers[$TempSearchResult][2] = ""
    Else
    MsgBox(48, "Error", "Der User konnte nicht gefunden werden!")
    Return -1
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_DeleteAllItems($hListView1)
    For $i = 0 To UBound($aUsers, 1) - 1
    If StringLen($aUsers[$i][2]) > 0 And StringLen($aUsers[$i][1]) > 0 Then
    $iTempIndex = _GUICtrlListView_AddItem($hListView1, $aUsers[$i][2], 0)
    _GUICtrlListView_AddSubItem($hListView1, $iTempIndex, $aUsers[$i][1], 1, 1)
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $TempStatus = ""
    $iTempIndex = ""
    $TempSearchResult = ""

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>BanSelected

    [/autoit] [autoit][/autoit] [autoit]

    Func _AdminChat()

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetState($Input1, $GUI_FOCUS)
    GUISetState(@SW_SHOW, $hMainGUI)
    TrayItemSetState(@TRAY_ID, 68)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_AdminChat

    [/autoit] [autoit][/autoit] [autoit]

    Func _Send()

    [/autoit] [autoit][/autoit] [autoit]

    $sDataAdmin = GUICtrlRead($Input1)

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case StringLower($sDataAdmin) = "restart"
    LogFile("Programm wird von Admin per Chatbefehle neugestartet!", "Programm")
    LogFile("", "Programm")
    $bRestart = True
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLower($sDataAdmin) = "shutdown"
    LogFile("Programm wird von Admin per Chatbefehle beendet!", "Programm")
    LogFile("", "Programm")
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLower(StringLeft($sDataAdmin, 5)) = "kick "
    $sName = StringRight($sDataAdmin, StringLen($sDataAdmin) - 5)
    $TempSearchResult = _ArraySearch($aUsers, $sName)
    If $TempSearchResult <> -1 Then
    TCPSend($aUsers[$TempSearchResult][0], "//Kick(Admin)")
    TCPCloseSocket($aUsers[$TempSearchResult][0])
    $aUsers[$TempSearchResult][0] = ""
    $aUsers[$TempSearchResult][1] = ""
    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserKick(" & $aUsers[$TempSearchResult][2] & ")")
    Next
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $aUsers[$TempSearchResult][2]))
    $aUsers[$TempSearchResult][2] = ""
    Else
    MsgBox(48, "Error", "Der User konnte nicht gefunden werden!")
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLower(StringLeft($sDataAdmin, 4)) = "ban "
    $sName = StringRight($sDataAdmin, StringLen($sDataAdmin) - 4)
    $TempSearchResult = _ArraySearch($aUsers, $sName)
    If $TempSearchResult <> -1 Then

    [/autoit] [autoit][/autoit] [autoit]

    Switch MsgBox(48 + 3, "Perm/Temp - Ban", "Soll der User permanent gebannt werden?" & @LF _
    "'JA' = Perm, 'NEIN' = Temp, 'Abbrechen' = Abbruch der Funktion")
    Case 6
    _FileWriteToLine($sBanListPath, _FileCountLines($sBanListPath) + 1, $aUsers[$TempSearchResult][3])
    _ArrayAdd($aBanList, $aUsers[$TempSearchResult][3])
    Case 7
    _ArrayAdd($aBanList, $aUsers[$TempSearchResult][3])
    Case Else
    Return -1
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    TCPSend($aUsers[$TempSearchResult][0], "//Kick(AdminBan)")
    TCPCloseSocket($aUsers[$TempSearchResult][0])
    $aUsers[$TempSearchResult][0] = ""
    $aUsers[$TempSearchResult][1] = ""
    $aUsers[$TempSearchResult][3] = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserBan(" & $aUsers[$TempSearchResult][2] & ")")
    Next
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $aUsers[$TempSearchResult][2]))
    $aUsers[$TempSearchResult][2] = ""

    [/autoit] [autoit][/autoit] [autoit]

    Else
    MsgBox(48, "Error", "Der User konnte nicht gefunden werden!")
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLen($sDataAdmin) > 0
    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "Admin|" & $sIP & "|" & $sDataAdmin)
    Next
    WriteMemo($sDataAdmin, "Admin")
    LogFile("Admin => ALL: " & $sDataAdmin, "Chat")
    EndSelect

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Input1, "")
    GUICtrlSetState($Input1, $GUI_FOCUS)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Send

    [/autoit] [autoit][/autoit] [autoit]

    Func ToggleClientGUI()
    Switch _WinAPI_IsWindowVisible($hClientverwaltung)
    Case True
    GUISetState(@SW_HIDE, $hClientverwaltung)
    TrayItemSetState(@TRAY_ID, 68)
    ShowClients()
    Case False
    GUISetState(@SW_SHOW, $hClientverwaltung)
    TrayItemSetState(@TRAY_ID, 65)
    ShowClients()
    EndSwitch
    EndFunc ;==>ToggleClientGUI

    [/autoit] [autoit][/autoit] [autoit]

    Func HideChatGUI()
    GUISetState(@SW_HIDE, $hMainGUI)
    EndFunc ;==>HideChatGUI

    [/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItStart()
    Global Const $sChatLogName = "ChatLog_" & @MDAY & "-" & @MON & "-" & @YEAR & ".log"
    Global Const $sGeneralLogName = "GeneralLog_" & @MDAY & "-" & @MON & "-" & @YEAR & ".log"
    LogFile("", "Programm")
    LogFile(" --- SERVER STARTUP --- ", "Programm")
    LogFile("", "Programm")
    LogFile("", "Chat")
    LogFile(" --- SERVER STARTUP --- ", "Chat")
    LogFile("", "Chat")
    EndFunc ;==>OnAutoItStart

    [/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItExit()
    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//Quit(Server-Shutdown)")
    LogFile("Server => " & $aUsers[$i][2] & "(" & $aUsers[$i][1] & "): //Quit(Server-Shutdown)", "Chat")
    TCPCloseSocket($aUsers[$i][0])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    TCPShutdown()

    [/autoit] [autoit][/autoit] [autoit]

    LogFile("Laufzeit: " & $Time, "Programm")
    LogFile("", "Chat")
    LogFile(" --- SERVER SHUTDOWN --- ", "Chat")
    LogFile("", "Chat")
    LogFile("", "Programm")
    LogFile(" --- SERVER SHUTDOWN --- ", "Programm")
    LogFile("", "Programm")
    If $bRestart = True Then ShellExecute(@ScriptFullPath)
    EndFunc ;==>OnAutoItExit

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    If TrayItemGetText(@TRAY_ID) = "Beenden" Then Exit
    If TrayItemGetText(@TRAY_ID) = "Server neu starten" Then
    LogFile("Programm wird von Admin per Traymenü neu gestartet!", "Programm")
    LogFile("", "Programm")
    $bRestart = True
    Exit
    ElseIf GUICtrlRead(@GUI_CtrlId) = "Server neu starten" Then
    LogFile("Programm wird von Admin über das Verwaltungsmenü neu gestartet!", "Programm")
    LogFile("", "Programm")
    $bRestart = True
    Exit
    EndIf
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func CopyIPClipboard()
    TrayItemSetState(@TRAY_ID, 68)
    If StringLen(ClipGet()) > 0 Then
    If MsgBox(48 + 4, "Error", "Die Zwischenablage ist NICHT leer!" & @LF _
    & "Enthält folgendes: " & @LF & @LF & _
    & ClipGet() & @LF & @LF & _
    "Überschreiben?") = 6 Then
    If ClipPut($sIP) = 1 Then
    LogFile("Server-IP (" & $sIP & ") erfolgreich in die Zwischenablage kopiert!", "Programm")
    TrayTipExt("Kopieren erfolgreich!")
    EndIf
    EndIf
    EndIf
    EndFunc ;==>CopyIPClipboard

    [/autoit] [autoit][/autoit] [autoit]

    Func TrayTipExt($sText)
    TrayTip($sTitle, $sText, 3)
    $tTrayTipTimer = _Timer_Init()
    EndFunc ;==>TrayTipExt

    [/autoit] [autoit][/autoit] [autoit]

    Func RefreshStuff()
    If _Timer_Diff($tTrayTipTimer) > 3000 Then TrayTip($sTitle, "", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $iLastMins = $iMins
    $iLastHour = $iHours

    [/autoit] [autoit][/autoit] [autoit]

    _TicksToTime(_Timer_Diff($tGes), $iHours, $iMins, $iSecs)

    [/autoit] [autoit][/autoit] [autoit]

    If $iLastMins <> $iMins Or $iLastHour <> $iHours Then
    $Time = StringFormat("i:i", $iHours, $iMins)
    TraySetToolTip("Server IP: " & $sIP & "" & @LF _
    & "Computername: " & $sPCNetworkName & "" & @LF _
    & "Server läuft: " & $Time)
    EndIf
    EndFunc ;==>RefreshStuff

    [/autoit] [autoit][/autoit] [autoit]

    Func WriteMemo($sData, $sNameEdit)
    GUICtrlSetData($Edit1, GUICtrlRead($Edit1) & @HOUR & ":" & @MIN & " ~ " & $sNameEdit & " > " & $sData & @CRLF)
    EndFunc ;==>WriteMemo

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Client Quellcode:

    Spoiler anzeigen
    [autoit]


    #include <GuiListView.au3>
    #include <Misc.au3>
    #include <Timers.au3>
    #include <Array.au3>
    #include <GuiListBox.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiComboBox.au3>

    [/autoit] [autoit][/autoit] [autoit]

    If TCPStartup() <> 1 Then
    MsgBox(48, "Error", "TCP-Service konnte nicht gestartet werden!" & @LF & _
    "Programm wird beendet!")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Opt("TrayOnEventMode", 1)
    Opt("GuiOnEventMode", 1)
    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 1)
    Opt("TrayIconDebug", 0)
    Opt("TCPTimeout", 500)

    [/autoit] [autoit][/autoit] [autoit]

    TraySetToolTip("Eigene IP-Adresse: " & @IPAddress1)

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $sTitleLogin = "Chat-Login"
    Global Const $sIniPath = @ScriptDir & "\Client.ini"
    Global $sProgID

    [/autoit] [autoit][/autoit] [autoit]

    If RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Multichat", "Key") = "" Then
    _GenerateKey()
    Else
    $sProgID = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Multichat", "Key")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Global $sTitleChat = "Multichat"
    Global $tTrayTipTimer

    [/autoit] [autoit][/autoit] [autoit]

    $sTemp1 = IniRead($sIniPath, "LastSettings", "StyleEdit", "")
    $sTemp2 = IniRead($sIniPath, "LastSettings", "StyleAll", "")

    [/autoit] [autoit][/autoit] [autoit]

    If $sTemp1 <> "" Then $NewStyleEditOnly = StringSplit($sTemp1, "|", 2)
    If $sTemp2 <> "" Then $NewStyleAll = StringSplit($sTemp2, "|", 2)

    [/autoit] [autoit][/autoit] [autoit]

    Global $NewStyleEditOnly
    Global $NewStyleAll

    [/autoit] [autoit][/autoit] [autoit]

    Global $sLastIP = IniRead($sIniPath, "LastSettings", "LastIP", "")
    Global $sLastName = IniRead($sIniPath, "LastSettings", "LastName", "")

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### LoginGUI
    $hLoginGUI = GUICreate($sTitleLogin, 225, 165, 265, 155)
    $Group1 = GUICtrlCreateGroup("Server IP", 8, 0, 185, 49, $BS_CENTER)
    $Input1 = GUICtrlCreateInput($sLastIP, 16, 16, 169, 26, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    GUICtrlSetFont(-1, 10)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Nickname", 8, 48, 185, 49, $BS_CENTER)
    $Input2 = GUICtrlCreateInput($sLastName, 16, 64, 169, 26, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    GUICtrlSetFont(-1, 10)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Starte Verbindungsversuch", 10, 104, 179, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Connect")
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    GUICtrlSetFont(-1, 10)
    $Progress1 = GUICtrlCreateProgress(200, 8, 17, 153, $PBS_VERTICAL)
    $Button11 = GUICtrlCreateButton("Abbrechen", 10, 136, 179, 25, $WS_GROUP)
    GUICtrlSetFont(-1, 10)
    ;~ GUISetState(@SW_HIDE, $hLoginGUI)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### ChatGUI
    $hMainGUI = GUICreate($sTitleChat, 749, 450, 185, 137, BitOR($WS_SIZEBOX, $WS_SYSMENU))
    $Edit1 = GUICtrlCreateEdit("", 0, 0, 617, 393, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetData(-1, "")
    GUICtrlSetFont(-1, 10)
    GUICtrlSetCursor(-1, 2)
    $Input3 = GUICtrlCreateInput("", 0, 392, 521, 29)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetCursor(-1, 5)
    $Button2 = GUICtrlCreateButton("Senden", 520, 392, 97, 29, BitOR($BS_DEFPUSHBUTTON, $BS_CENTER, $BS_VCENTER, $WS_GROUP))
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetOnEvent(-1, "_Send")
    $ListView1 = GUICtrlCreateListView("", 616, 0, 129, 292)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 10)
    $Button6 = GUICtrlCreateButton("Style ändern", 616, 296, 131, 29, $WS_GROUP)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetOnEvent(-1, "HideStyleGUI")
    $Button3 = GUICtrlCreateButton("Chat verstecken", 616, 328, 131, 29, $WS_GROUP)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetOnEvent(-1, "ShowHideMultichat")
    $Button4 = GUICtrlCreateButton("Beenden", 616, 360, 131, 29, $WS_GROUP)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetOnEvent(-1, "_Exit")
    $Button5 = GUICtrlCreateButton("Neu starten", 616, 392, 131, 29, $WS_GROUP)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetOnEvent(-1, "_Exit")
    ;~ GUISetState(@SW_HIDE, $hMainGUI)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### ChangeStyleGUI
    $hChangeStyle = GUICreate("Style ändern", 212, 229, 332, 131)
    $Group2 = GUICtrlCreateGroup("Schriftgröße / Schriftfarbe ", 8, 8, 201, 129)
    $Group3 = GUICtrlCreateGroup("Nur Edit-Felder ", 16, 24, 185, 49)
    $Button7 = GUICtrlCreateButton("Auswählen", 24, 40, 171, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "ChooseFont")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group4 = GUICtrlCreateGroup("Alles ", 16, 80, 185, 49)
    $Button8 = GUICtrlCreateButton("Auswählen", 24, 96, 171, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "ChooseFont")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button9 = GUICtrlCreateButton("Speichern", 8, 144, 99, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "SaveStyle")
    $Button10 = GUICtrlCreateButton("Abbrechen", 112, 144, 91, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "HideStyleGUI")
    $Group1 = GUICtrlCreateGroup("Transparenz", 8, 176, 201, 49)
    $Slider1 = GUICtrlCreateSlider(16, 192, 185, 25)
    GUICtrlSetOnEvent(-1, "SetTransparenz")
    GUICtrlSetLimit(-1, 255, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    ;~ GUISetState(@SW_HIDE, $hChangeStyle)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hLoginGUI)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hMainGUI)
    GUISetOnEvent($GUI_EVENT_CLOSE, "HideStyleGUI", $hChangeStyle)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hListView1 = GUICtrlGetHandle($ListView1)
    Global $ServerSocket
    Global $ServerIP
    Global $Nickname
    Global $bRestart = False

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_AddColumn($hListView1, "Andere Clients", 125)

    [/autoit] [autoit][/autoit] [autoit]

    SaveStyle()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hLoginGUI)
    WinActivate($sTitleLogin)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Connect()

    [/autoit] [autoit][/autoit] [autoit]

    Local $intTryConnect = 0

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetState($Input3, $GUI_FOCUS)
    GUICtrlSetState($Button2, $GUI_DEFBUTTON)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Progress1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $ServerIP = GUICtrlRead($Input1)
    $Nickname = GUICtrlRead($Input2)

    [/autoit] [autoit][/autoit] [autoit]

    If Not StringRegExp($ServerIP, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." & _
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." & _
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." & _
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$") Then
    MsgBox(48, "Error", "IP Adresse hat nicht das richtige Format! (xxx.xxx.xxx.xxx)" & @LF & _
    "Fehlercode: " & StringRegExp($ServerIP, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"))
    GUICtrlSetData($Progress1, 0)
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Progress1, 10)

    [/autoit] [autoit][/autoit] [autoit]

    If StringRegExp($Nickname, "\A[\w-\s]+\z", 0) = 0 Then
    MsgBox(48, "Error", "Nickname enthält ungültige Zeichen!" & @LF & _
    "Es sind nur Buchstaben, Zahlen und Unterstrich sowie Bindestrich erlaubt!")
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Progress1, 20)

    [/autoit] [autoit][/autoit] [autoit]

    If Ping($ServerIP, 500) = 0 Then
    MsgBox(48, "Error", "Der Server konnte nicht angepingt werden!" & @LF & _
    "Fehlercode: [" & @error & "]" & @LF & _
    "Bitte überprüfen Sie die IP-Adresse!")
    GUICtrlSetData($Progress1, 0)
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $ServerSocket = TCPConnect($ServerIP, 2150)
    GUICtrlSetData($Progress1, GUICtrlRead($Progress1) + 10)
    $intTryConnect += 1
    Sleep(500)
    Until $intTryConnect > 5 Or $ServerSocket <> -1

    [/autoit] [autoit][/autoit] [autoit]

    If $intTryConnect > 5 Then
    GUICtrlSetData($Progress1, 0)
    MsgBox(48, "Error", "Server nach 5 Verbindungsversuchen nicht erreichbar!")
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    TrayTip($sTitleChat, "Warte bis der Server die Verbindung zulässt...", 20)
    $TimerWaitAccept = _Timer_Init()

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GuiOnEventMode", 0)

    [/autoit] [autoit][/autoit] [autoit]

    If _VersionCompare(@AutoItVersion, "3.3.1.0") = -1 Then
    AdlibEnable("CheckIncoming")
    AdlibEnable("CheckConnection")
    Else
    AdlibRegister("CheckIncoming")
    AdlibRegister("CheckConnection")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Sleep(100)
    $TempRecv = TCPRecv($ServerSocket, 1024)
    If @error Then
    TrayTipExt("Verbindungsversuch wurde abgelehnt..")
    GUICtrlSetData($Progress1, 0)
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If _Timer_Diff($TimerWaitAccept) > 15000 Then
    MsgBox(48, "Error", "Verbindungstimeout (15 Sekunden) wurde erreicht!" & @LF & _
    "Verbindungsversuch wurde abgebrochen!")
    GUICtrlSetData($Progress1, 0)
    Return -2
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If GUIGetMsg() = $Button11 Then
    GUICtrlSetData(0, $Progress1)
    Opt("GuiOnEventMode", 1)
    MsgBox(48, "Abbruch", "Verbindungsversuch wurde abgebrochen!")
    Return -3
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Until $TempRecv = "//Accept"

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GuiOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    TrayTip($sTitleChat, "", 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Progress1, 100)

    [/autoit] [autoit][/autoit] [autoit]

    TrayCreateItem("Zeige Multichat")
    TrayItemSetOnEvent(-1, "ShowHideMultichat")
    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    SendSpecial($ServerSocket, "Key", $sProgID)
    Sleep(500)
    SendSpecial($ServerSocket, "Name", $Nickname)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_HIDE, $hLoginGUI)
    GUISetState(@SW_SHOW, $hMainGUI)

    [/autoit] [autoit][/autoit] [autoit]

    WinSetTitle($sTitleChat, "", $sTitleChat & " - " & $Nickname)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>Connect

    [/autoit] [autoit][/autoit] [autoit]

    Func CheckIncoming()
    $TestTimer = _Timer_Init()
    $TempData = TCPRecv($ServerSocket, 8192)
    If StringLen($TempData) > 0 Then
    $aRecv = StringSplit($TempData, "|", 2)

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case StringLeft($TempData, 6) = "//Quit"
    TCPCloseSocket($ServerSocket)
    WriteMemo("Verbindung verloren!", "Server")
    If MsgBox(48 + 4, "Error", "Die Verbindung zum Server ging verloren!" & @LF & _
    "Der Socket wurde geschlossen! - Programm neu starten?") = 6 Then
    $bRestart = True
    Exit
    Else
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 6) = "//Kick"
    $TempData = StringTrimLeft($TempData, 7)
    $TempData = StringTrimRight($TempData, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Switch $TempData
    Case "DoubleName"
    MsgBox(48, "Name bereits verwendet!", "Der Name wird auf dem Server bereits verwendet!" & @LF & _
    "Bitte anderen Namen verwenden!")
    $bRestart = True
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case "Admin"
    GUISetState(@SW_HIDE, $hMainGUI)
    If MsgBox(48 + 4, "Verbindung verloren!", "Sie wurden vom Server gekickt!" & @LF & _
    "Client neu starten?") = 6 Then $bRestart = True
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case "Banned"
    GUISetState(@SW_HIDE, $hMainGUI)
    MsgBox(48, "Verbindung verloren!", "Sie sind auf diesem Server gebannt!")
    Return -1

    [/autoit] [autoit][/autoit] [autoit]

    Case "AdminBan"
    GUISetState(@SW_HIDE, $hMainGUI)
    MsgBox(48, "Verbindung verloren!", "Sie wurden soeben auf diesem Server gebannt!")
    Return -2

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 7) = "//Users"
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $TempData = ' & $TempData & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $TempData = StringTrimLeft($TempData, 8)
    $TempData = StringTrimRight($TempData, 1)
    $aTempUsers = StringSplit($TempData, ";")
    WriteMemo("'" & $aTempUsers[1] & "' ist dem Chat beigetreten!", "Server")
    _GUICtrlListView_DeleteAllItems($hListView1)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aTempUsers[0]
    If $aTempUsers[$i] = "" Then ContinueLoop
    _GUICtrlListView_AddItem($hListView1, $aTempUsers[$i])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 10) = "//UserQuit"
    $TempData = StringTrimLeft($TempData, 11)
    $TempData = StringTrimRight($TempData, 1)
    WriteMemo("'" & $TempData & "' hat den Chat verlassen!", "Server")
    _GUICtrlListView_DeleteItem($hListView1, _GUICtrlListView_FindInText($hListView1, $TempData))

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 10) = "//UserKick"
    $TempData = StringTrimLeft($TempData, 11)
    $TempData = StringTrimRight($TempData, 1)
    WriteMemo("'" & $TempData & "' wurde vom Server gekickt!", "Server")
    _GUICtrlListView_DeleteItem($hListView1, _GUICtrlListView_FindInText($hListView1, $TempData))

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 10) = "//UserKick"
    $TempData = StringTrimLeft($TempData, 11)
    $TempData = StringTrimRight($TempData, 1)
    WriteMemo("'" & $TempData & "' wurde vom Server gebannt!", "Server")
    _GUICtrlListView_DeleteItem($hListView1, _GUICtrlListView_FindInText($hListView1, $TempData))

    [/autoit] [autoit][/autoit] [autoit]

    Case IsArray($aRecv) And @error <> 1
    WriteMemo($aRecv[2], $aRecv[0])

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect
    EndIf
    ConsoleWrite("Durchlaufdauer von 'Check Incoming' beträgt: " & @LF & _Timer_Diff($TestTimer) & @LF & @LF)
    EndFunc ;==>CheckIncoming

    [/autoit] [autoit][/autoit] [autoit]

    Func CheckConnection()
    If Ping($ServerIP, 500) = 0 And $intTryConnect > 0 Then
    WriteMemo("Verbindung verloren!", "Server")
    TCPCloseSocket($ServerSocket)
    If MsgBox(262144 + 4, "Verbindungstimeout", "Die Verbindung zum Server ging verloren!" & @LF & _
    "Der Socket wurde geschlossen! - Programm neu starten?") = 6 Then
    $bRestart = True
    Exit
    Else
    Exit
    EndIf
    EndIf
    EndFunc ;==>CheckConnection

    [/autoit] [autoit][/autoit] [autoit]

    Func _Send()
    Local $intTrySend = 0

    [/autoit] [autoit][/autoit] [autoit]

    If StringLen(GUICtrlRead($Input3)) = 0 Then Return -1

    [/autoit] [autoit][/autoit] [autoit]

    If StringLen(GUICtrlRead($Input3)) > 200 Then
    MsgBox(48, "Error", "Die maximale Zeichenanzahl beträgt 200!" & @LF _
    & "Sie wollten '" StringLen(GUICtrlRead($Input3)) & "' Zeichen senden." & @LF _
    & "Das sind '" & StringLen(GUICtrlRead($Input3)) - 200 & "' Zeichen zuviel!")
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $TCPData = TCPSend($ServerSocket, $Nickname & "|" & @IPAddress1 & "|" & GUICtrlRead($Input3))
    $intTrySend += 1
    Until $intTrySend > 5 Or $TCPData > 0

    [/autoit] [autoit][/autoit] [autoit]

    If $intTrySend > 5 Then
    WriteMemo("Konnte Daten nicht an den Server schicken!", "Error")
    Else
    GUICtrlSetData($Input3, "")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Send

    [/autoit] [autoit][/autoit] [autoit]

    Func SendSpecial($Socket, $sType, $sData)
    TCPSend($Socket, "//" & $sType & "(" & $sData & ")")
    EndFunc ;==>SendSpecial

    [/autoit] [autoit][/autoit] [autoit]

    Func WriteMemo($sData, $sNameEdit)
    GUICtrlSetData($Edit1, GUICtrlRead($Edit1) & @HOUR & ":" & @MIN & " ~ " & $sNameEdit & " > " & $sData & @CRLF)
    EndFunc ;==>WriteMemo

    [/autoit] [autoit][/autoit] [autoit]

    Func ChooseFont()
    Switch @GUI_CtrlId
    Case $Button7
    Switch IsArray($NewStyleEditOnly)
    Case 1
    $NewStyleEditOnly = _ChooseFont($NewStyleEditOnly[2], $NewStyleEditOnly[3], $NewStyleEditOnly[5], $NewStyleEditOnly[4], BitAND($NewStyleEditOnly[1], 2), BitAND($NewStyleEditOnly[1], 4), BitAND($NewStyleEditOnly[1], 8))
    Case 0
    $NewStyleEditOnly = _ChooseFont()
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    Case $Button8
    Switch IsArray($NewStyleAll)
    Case 1
    $NewStyleAll = _ChooseFont($NewStyleAll[2], $NewStyleAll[3], $NewStyleAll[5], $NewStyleAll[4], BitAND($NewStyleAll[1], 2), BitAND($NewStyleAll[1], 4), BitAND($NewStyleAll[1], 8))
    Case 0
    $NewStyleAll = _ChooseFont()
    EndSwitch
    EndSwitch
    EndFunc ;==>ChooseFont

    [/autoit] [autoit][/autoit] [autoit]

    Func SaveStyle()
    If IsArray($NewStyleAll) Then
    GUICtrlSetFont($Edit1, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Input1, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Input2, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Input3, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button1, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button2, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button3, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button4, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button5, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button6, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button7, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button8, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button9, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button10, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetFont($Button11, $NewStyleAll[3], $NewStyleAll[4], $NewStyleAll[1], $NewStyleAll[2])
    GUICtrlSetColor($Edit1, $NewStyleAll[7])
    GUICtrlSetColor($Input1, $NewStyleAll[7])
    GUICtrlSetColor($Input2, $NewStyleAll[7])
    GUICtrlSetColor($Input3, $NewStyleAll[7])
    GUICtrlSetColor($Button1, $NewStyleAll[7])
    GUICtrlSetColor($Button2, $NewStyleAll[7])
    GUICtrlSetColor($Button3, $NewStyleAll[7])
    GUICtrlSetColor($Button4, $NewStyleAll[7])
    GUICtrlSetColor($Button5, $NewStyleAll[7])
    GUICtrlSetColor($Button6, $NewStyleAll[7])
    GUICtrlSetColor($Button7, $NewStyleAll[7])
    GUICtrlSetColor($Button8, $NewStyleAll[7])
    GUICtrlSetColor($Button9, $NewStyleAll[7])
    GUICtrlSetColor($Button10, $NewStyleAll[7])
    GUICtrlSetColor($Button11, $NewStyleAll[7])
    EndIf
    If IsArray($NewStyleEditOnly) Then
    GUICtrlSetFont($Edit1, $NewStyleEditOnly[3], $NewStyleEditOnly[4], $NewStyleEditOnly[1], $NewStyleEditOnly[2])
    GUICtrlSetFont($Input1, $NewStyleEditOnly[3], $NewStyleEditOnly[4], $NewStyleEditOnly[1], $NewStyleEditOnly[2])
    GUICtrlSetFont($Input2, $NewStyleEditOnly[3], $NewStyleEditOnly[4], $NewStyleEditOnly[1], $NewStyleEditOnly[2])
    GUICtrlSetFont($Input3, $NewStyleEditOnly[3], $NewStyleEditOnly[4], $NewStyleEditOnly[1], $NewStyleEditOnly[2])
    GUICtrlSetColor($Edit1, $NewStyleEditOnly[7])
    GUICtrlSetColor($Input1, $NewStyleEditOnly[7])
    GUICtrlSetColor($Input2, $NewStyleEditOnly[7])
    GUICtrlSetColor($Input3, $NewStyleEditOnly[7])
    EndIf
    GUISetState(@SW_HIDE, $hChangeStyle)
    EndFunc ;==>SaveStyle

    [/autoit] [autoit][/autoit] [autoit]

    Func HideStyleGUI()
    Switch _WinAPI_IsWindowVisible($hChangeStyle)
    Case True
    GUISetState(@SW_HIDE, $hChangeStyle)
    Case False
    GUISetState(@SW_SHOW, $hChangeStyle)
    EndSwitch
    EndFunc ;==>HideStyleGUI

    [/autoit] [autoit][/autoit] [autoit]

    Func ShowHideMultichat()
    Switch _WinAPI_IsWindowVisible($hMainGUI)
    Case True
    GUISetState(@SW_HIDE, $hMainGUI)
    Case False
    GUISetState(@SW_SHOW, $hMainGUI)
    EndSwitch
    EndFunc ;==>ShowHideMultichat

    [/autoit] [autoit][/autoit] [autoit]

    Func TrayTipExt($sText)
    TrayTip($sTitleChat, $sText, 3)
    $tTrayTipTimer = _Timer_Init()
    If _VersionCompare(@AutoItVersion, "3.3.1.0") = -1 Then
    AdlibEnable("TrayTipTimer", 3100)
    Else
    AdlibRegister("TrayTipTimer", 3100)
    EndIf
    EndFunc ;==>TrayTipExt

    [/autoit] [autoit][/autoit] [autoit]

    Func TrayTipTimer()
    If _Timer_Diff($tTrayTipTimer) > 3000 Then
    TrayTip($sTitleChat, "", 1)
    If _VersionCompare(@AutoItVersion, "3.3.1.0") = -1 Then
    AdlibDisable("TrayTipTimer")
    Else
    AdlibUnRegister("TrayTipTimer")
    EndIf
    EndIf
    EndFunc ;==>TrayTipTimer

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Select
    Case @GUI_CtrlId = $Button5
    $bRestart = True
    EndSelect
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItExit()
    IniWrite($sIniPath, "LastSettings", "LastIP", $ServerIP)
    IniWrite($sIniPath, "LastSettings", "LastName", $Nickname)
    IniWrite($sIniPath, "LastSettings", "StyleEdit", _ArrayToString($NewStyleEditOnly, "|"))
    IniWrite($sIniPath, "LastSettings", "StyleAll", _ArrayToString($NewStyleAll, "|"))
    SendSpecial($ServerSocket, "Quit", $Nickname)
    TCPCloseSocket($ServerSocket)
    TCPShutdown()
    If $bRestart = True Then ShellExecute(@ScriptFullPath)
    EndFunc ;==>OnAutoItExit

    [/autoit] [autoit][/autoit] [autoit]

    Func SetTransparenz()
    WinSetTrans($sTitleChat, "", GUICtrlRead(@GUI_CtrlId))
    EndFunc ;==>SetTransparenz

    [/autoit] [autoit][/autoit] [autoit]

    Func _GenerateKey()
    Local $TempKey = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $iTemp = 1 To 20
    $TempKey &= Random(0, 10, 1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $sProgID = $TempKey

    [/autoit] [autoit][/autoit] [autoit]

    If RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Multichat", "Key", "REG_SZ", $sProgID) <> 1 Then
    MsgBox(48, "Error", "Programmkey konnte nicht in die Registry geschrieben werden!" & @LF & "Programm wird beendet!")
    Exit
    EndIf
    EndFunc ;==>_GenerateKey

    [/autoit] [autoit][/autoit] [autoit][/autoit]


    Im Anhang sind dann nochmal die Quellcodes!

    Sollte mit der derzeitigen Beta-Version von AutoIT problems funktionieren.
    Wäre nett wenn den Chat jemand mal auf den XP, Vista etc testen könnte (bis jetzt nur auf Win 7 x86 getestet)

    MfG oetzn

  • ähm bei mir kommt leider immer ein fehler und zwar gibt es die Funktion AdLibRegister nicht^^

  • hmm..
    schwieriges Problem xD

    wenn ich das verwende:

    [autoit]


    if _VersionCompare(@AutoItVersion,"3.3.1.0") = - 1 Then
    AdlibEnable("TrayTipTimer")
    Else
    AdlibRegister("TrayTipTimer")
    EndIf

    [/autoit]

    dann kommt trotzdem die Fehlermeldung, dass er AdlibRegister nicht kennt -.-
    obwohl er die Funktion ja gar nicht verwendet...

    Also entweder jeder schreibt sich das für die Version um, die er benützt, oder er verwendet die Beta ^^...

    Im Moment sehe ich keine andere Lösung, sry

    EDIT: Oder doch ;)

    Ich Update den Quellcode im 1. Post dann funzt das.

    Lösung: man muss die Errormeldung der Au3Check.exe ingnorieren (Continue Anyway drücken) weil das Programm ja durch die If-Abfrage sowiso nicht zu der Funktion kommt, die er nicht kennt :D

    Also viel Spaß ;)

  • Du kannst Execute verwenden, um die Funktion zu verstecken ;)

    Spoiler anzeigen
    [autoit]

    #include<Misc.au3>
    Global Const $__ADLIB_OLD_FUNC = (_VersionCompare(@AutoItVersion, "3.3.1.1") < 0)

    [/autoit] [autoit][/autoit] [autoit]

    Func _AdLibRegister($sFunc)
    ;Author: Prog@ndy
    Local $sAdlib = 'A' & 'dlibRegister'
    if $__ADLIB_OLD_FUNC Then $sAdlib = 'A' & 'dlibEnable'
    Local $result = Execute($sAdlib & '($sFunc)')
    Return SetError(@error,@extended, $result)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;--------------------------------
    ;#AutoIt3Wrapper_Version=beta

    [/autoit] [autoit][/autoit] [autoit]

    _AdLibRegister("_test")

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(5000)

    [/autoit] [autoit][/autoit] [autoit]

    Func _test()
    ConsoleWrite("test " & @SEC & @CRLF)
    EndFunc

    [/autoit]
  • ok, ja so gehts natürlich auch..

    vl bau ich das ein, aber derzeit bin ich mit meiner Lösung auch zufrieden, den in dem Fall ist der Mensch klüger als die Au3Check.exe xD
    da ja der Mensch weiß, dass die Funktion die die Au3Check nicht kennt, NIE aufgefrufen wird.

    Aber natürlich ist es schöner wenn erst gar kein Error kommt ;)

    Danke für die Funktion, ich werd sie mir mal speichern :D

  • Update gemacht ;)

    Neuerungen:

    ~~ Server ~~
    - Ein Client wird gekickt, wenn er einen Namen benutzt der schon in Verwendung ist.
    - Clients können generell gekickt werden.
    - Kommandobox hinzugefügt (/Quit, /Restart, /Kick "Clientname")
    - Log-File (Chat)
    - Ein paar kleine, für den Anwender nicht bedeutende, Änderungen ;)
    - Zulassungsabfrage, wenn ein Client connected

    ~~ Client ~~
    - TrayItem(Beenden) hinzugefügt
    - Den $ES_READONLY-Style vom ListView entfernt => Spalten kann man jetzt nach belieben vergrößern
    - GUI vom Chat wird nicht sofort geöffnet, zuerst wird gewartet, ob man überhaupt connecten darf (Siehe Server)
    - Meldung, wenn die Verbindung zum Server verloren ging
    - Eigener Nickname wird in den Titel des Chats eingefügt

    So, das wars eigentlich ;)

    Hat noch jemand Wünsche oder Anliegen? - Mir persönlich gefällt die Art der GUI des Clients nicht sehr, habt ihr Vorschläge für eine bessere?
    Es kann gerne jemand ne neue GUI erstellen, wenn er möchte. Ich werd ihn/sie dann natürlich im Skript erwähnen ;)

  • Schickes Programm ;)
    Habe aber leider 2 Probleme...
    1.: Kann mich nicht mit dem Server connecten.
    Habe die lokale IP eingegeben. Also die IP, die unten rechts beim Serverstart erscheint.
    2.: In der Kommandobox erscheint ein Error.
    Wenn ich /restart eintippe, kommt ein Error der mir sagt das @GUI_CtrlId unbekannt ist.

    Wäre nett wenn du mir sagst woran das beides liegen könnte :P

  • hmm..
    Hast du ne Firewall aktiviert? - wenn ja dann schalt sie mal ab und probier dann nochmal verbinden
    Ich hab gestern noch einiges herumgeschraubt am Programm aber bin zurzeit nicht zuhause, und kann es daher nicht uppn (Skript nicht am Laptop -.-)

    Zu deinem Problem mit der Kommandobox; Hab schon eine Idee an was das liegen könnte ich such mir den Teil oben kurz raus und post ihn dann.
    Moment ;)

    EDIT:

    Ersetz mal die Funktion _Exit mit folgender Funktion, dann müsste es klappen..

    [autoit]


    Func _Exit()
    If TrayItemGetText(@TRAY_ID) = "Beenden" Then Exit
    If TrayItemGetText(@TRAY_ID) = "Server neu starten" Then
    $bRestart = True
    Exit
    ElseIf StringLower($sCmd) = "/restart" Then
    $bRestart = True
    Exit
    ElseIf GUICtrlRead(@GUI_CtrlId) = "Server neu starten" Then
    $bRestart = True
    Exit
    EndIf
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    EDIT 2 xD

    Hatt das Skript doch noch auf meim USB-Stick ;)
    Ich Update mal den 1.Post.
    Hab einiges hinzugefügt/verbessert etc

    Neuerungen:

    ~~ Server ~~
    - Kommandoboxbefehle nun ohne "/" (Quit, Restart, Kick "Clientname", sayall "Text")
    - System mit Client verbindet sich/trennt Verbindung überarbeitet: Die Nachricht wird nicht einfach an alle verschickt, sondern es wird ein Servercommand an alle Clients versendet (//UserQuit(Username)) Ich weiß unbedeutend, aber ich wollts erwähnen *gg*
    - Log-File bisschen verändert (Serverstartup-, Servershutdownmeldungen hinzugefügt)

    ~~ Client ~~
    - NEUE GUI xD (Andere Clients werden angezeigt)
    - Ini-Datei in der die letzte IP und der letzte Name gespeichert wird

    Noch vorhandene Probleme:
    Ich brauch noch ein 'richtiges' Pattern für eine IP (StringRegExp), mein derzeitige lässt es zu, dass HINTER der IP noch jedes mögliche Zeichen steht -.-
    Also wer Lust hat, kann eins basteln xD (Ich werd den jenigen natürlich erwähnen!)

    MfG oetzn

  • So, mal wieder den Thread hochpushen :P

    Ne Spaß beiseite, hab ne neue Version :D

    Update siehe 1.Post
    Ich häng die Dateien auch in diesem Post an!

    Neuerungen:

    ~~ Server ~~

    * Admin kann mitchatten
    * Kommandobox entfernt (Kommandos jetzt in den Admin-Chat schreiben)
    * Ein paar kleine Bugs entfernt

    ~~ Client ~~

    * Neues Pattern für die IP
    * Andere Clients werden angezeigt
    * GUI überarbeitet
    * Style änderbar (Schriftart / Schriftgröße / Schriftfarbe)

  • So, mal wieder weitergeskripted und ich denk das wird jetzt die letzte Version sein...(vorraussichtlich)
    Was eventuell noch kommen wird ist ein Flüster-Funktion und eine votekick-Funktion!

    ~~ Server ~~

    * Admin kann User bannen: Perm/Temp

    ~~ Client ~~

    * Logfile erweitert
    * GUI rezisefähig

    Im Anhang ist der Sourcecode und den 1.Post update ich auch mal.

  • Bei mir kommt immer wenn ich den Server starten möchte diese Fehlermeldung:

    _FileWriteLog(@ScriptDir & "\" & $sGeneralLogName, $sData)
    _FileWriteLog(@ScriptDir & "\" & ^ ERROR


    Ich hab schon versucht es zu entbuggen aber ich bekomme es nicht gebacken =/

  • Hallo 666Chucky666,

    ich habe mal ein wenig rumgebastelt und es so ans Laufen bekommen:

    Multichat-Server.au3
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <Misc.au3>
    #include <Timers.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <EditConstants.au3>
    #include <ButtonConstants.au3>
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("OnAutoItExit")

    [/autoit] [autoit][/autoit] [autoit]

    $tGes = _Timer_Init()

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $sChatLogName = "ChatLog_" & @MDAY & "-" & @MON & "-" & @YEAR & ".log"
    Global Const $sGeneralLogName = "GeneralLog_" & @MDAY & "-" & @MON & "-" & @YEAR & ".log"

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItStart()

    [/autoit] [autoit][/autoit] [autoit]

    LogFile("@compiled: " & @Compiled, "Programm")
    LogFile("Pfad zur Exe: " & @AutoItExe, "Programm")
    LogFile("PID: " & @AutoItPID, "Programm")
    LogFile("AutoItVersion: " & @AutoItVersion, "Programm")
    LogFile("", "Programm")

    [/autoit] [autoit][/autoit] [autoit]

    If TCPStartup() <> 1 Then
    MsgBox(48, "Error", "TCP-Service konnte nicht gestartet werden!" & @LF & _
    "Programm wird beendet!")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    LogFile("TCP-Service erfolgreich gestartet", "Programm")

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $sTitle = "Chat Server"
    Global Const $sGUITitle = "Client-Verwaltung"
    Global Const $sIP = @IPAddress1
    Global Const $sPort = 2150
    Global Const $MainSocket = TCPListen($sIP, $sPort)
    Global Const $sPCNetworkName = @ComputerName
    Global Const $sBanListPath = @ScriptDir & "\Banlist.txt"

    [/autoit] [autoit][/autoit] [autoit]

    LogFile("Konstanten definiert", "Programm")
    LogFile("", "Programm")
    LogFile("Server-IP: " & $sIP, "Programm")
    LogFile("Server-Port: " & $sPort, "Programm")
    LogFile("Computername: " & $sPCNetworkName, "Programm")
    LogFile("", "Programm")
    LogFile("Abhör-Anschluss für eingehende Verbindung (Socket): " & $MainSocket, "Programm")
    LogFile("", "Programm")

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists($sBanListPath) Then _FileCreate($sBanListPath)

    [/autoit] [autoit][/autoit] [autoit]

    Global $sTitleChat = "Multichat"
    Global $tTrayTipTimer
    Global $bRestart = False
    Global $sDataAdmin
    Global $iMaxIndexClientList
    Global $iHours
    Global $iMins
    Global $iSecs
    Global $iLastMins
    Global $iLastHour
    Global $Time
    Global $aBanList[1]
    Global $BanMode
    Global $sBannedUser

    [/autoit] [autoit][/autoit] [autoit]

    _FileReadToArray($sBanListPath, $aBanList)
    _ArrayDelete($aBanList, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aUsers[1][4]

    [/autoit] [autoit][/autoit] [autoit]

    If _Singleton($sGUITitle) = 0 Then
    LogFile("Zweite Instanz geschlossen! - Nur eine Instanz erlaubt!", "Programm")
    LogFile("", "Programm")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Opt("TrayOnEventMode", 1)
    Opt("GuiOnEventMode", 1)
    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    If _VersionCompare(@AutoItVersion, "3.3.1.0") = -1 Then
    AdlibEnable("RefreshStuff")
    AdlibEnable("CheckSocket")
    AdlibEnable("CheckConnection", 2000)
    AdlibEnable("CheckIncoming")
    Else
    AdlibRegister("RefreshStuff")
    AdlibRegister("CheckSocket")
    AdlibRegister("CheckConnection", 2000)
    AdlibRegister("CheckIncoming")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    TrayTipExt("Server IP: " & $sIP & "" & @LF _
    & "Computername: " & $sPCNetworkName)

    [/autoit] [autoit][/autoit] [autoit]

    TraySetToolTip("Server IP: " & $sIP & "" & @LF _
    & "Computername: " & $sPCNetworkName)

    [/autoit] [autoit][/autoit] [autoit]

    #region ### TrayMenu
    TrayCreateItem("Verwaltung")
    TrayItemSetOnEvent(-1, "ToggleClientGUI")
    TrayCreateItem("IP in Zwischenablage kopieren")
    TrayItemSetOnEvent(-1, "CopyIPClipboard")
    TrayCreateItem("Chatchronik öffnen")
    TrayItemSetOnEvent(-1, "OpenChatLog")
    TrayCreateItem("")
    TrayCreateItem("Server neu starten")
    TrayItemSetOnEvent(-1, "_Exit")
    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "_Exit")
    TrayCreateItem("")
    TrayCreateItem("Chat beitreten (als Admin)")
    TrayItemSetOnEvent(-1, "_AdminChat")
    #endregion ### TrayMenu

    [/autoit] [autoit][/autoit] [autoit]

    #region ### VerwaltungGUI
    $hClientverwaltung = GUICreate($sGUITitle, 312, 248, 198, 131)
    $Group1 = GUICtrlCreateGroup("Verbundene Clients ", 0, 0, 185, 241)
    $ListView1 = GUICtrlCreateListView("Name|IP", 8, 16, 169, 217)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 70)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 95)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Kick", 192, 8, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "KickSelected")
    $Button2 = GUICtrlCreateButton("GUI beenden", 192, 104, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "ToggleClientGUI")
    $Button3 = GUICtrlCreateButton("Server beenden", 192, 136, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_Exit")
    $Button4 = GUICtrlCreateButton("Server neu starten", 192, 168, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_Exit")
    $Button5 = GUICtrlCreateButton("Erneuern", 192, 72, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "ShowClients")
    $Button6 = GUICtrlCreateButton("Bann", 192, 40, 115, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "BanSelected")
    GUISetState(@SW_HIDE, $hClientverwaltung)
    #endregion ### VerwaltungGUI

    [/autoit] [autoit][/autoit] [autoit]

    #region ### ChatGUI
    $hMainGUI = GUICreate($sTitleChat, 750, 424, 203, 150)
    $Edit1 = GUICtrlCreateEdit("", 0, 0, 617, 393, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    GUICtrlSetData(-1, "")
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUICtrlSetCursor(-1, 2)
    $Input1 = GUICtrlCreateInput("", 0, 392, 521, 29)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUICtrlSetCursor(-1, 5)
    $Button6 = GUICtrlCreateButton("Senden", 520, 392, 97, 29, BitOR($BS_DEFPUSHBUTTON, $BS_CENTER, $BS_VCENTER, $WS_GROUP))
    GUICtrlSetOnEvent(-1, "_Send")
    $ListView2 = GUICtrlCreateListView("", 616, 0, 129, 420)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUISetState(@SW_HIDE, $hMainGUI)
    #endregion ### ChatGUI

    [/autoit] [autoit][/autoit] [autoit]

    #region ###
    $hBanMsgBox = GUICreate("Wirklich verbannen?", 342, 103, 206, 133, BitOR($WS_CAPTION, $WS_BORDER, $WS_CLIPSIBLINGS))
    $Label1 = GUICtrlCreateLabel("", 16, 24, 308, 20)
    $Button7 = GUICtrlCreateButton("Permanent", 48, 64, 75, 25, $WS_GROUP)
    $Button8 = GUICtrlCreateButton("Temporär", 128, 64, 75, 25, $WS_GROUP)
    $Button9 = GUICtrlCreateButton("Gar nicht", 208, 64, 75, 25, $WS_GROUP)
    GUISetState(@SW_HIDE, $hBanMsgBox)
    #endregion ###

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "ToggleClientGUI", $hClientverwaltung)
    GUISetOnEvent($GUI_EVENT_CLOSE, "HideChatGUI", $hMainGUI)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetState($Input1, $GUI_FOCUS)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hListView1 = GUICtrlGetHandle($ListView1)
    Global $hListView2 = GUICtrlGetHandle($ListView2)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_AddColumn($hListView2, "Andere Clients", 125)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func CheckSocket()
    $TempSocket = TCPAccept($MainSocket)
    If $TempSocket <> -1 Then
    LogFile("Verbindungsanfrage von " & SocketToIP($TempSocket), "Programm")
    LogFile("", "Programm")
    If MsgBox(48 + 4, "Neuer Cient", "Ein neuer Client will sich mit dem Server verbinden!" & @LF & _
    "Daten:" & @LF & _
    "IP: " & SocketToIP($TempSocket) & @LF & _
    "Zulassen?", 15) = 6 Then
    ReDim $aUsers[UBound($aUsers, 1) + 1][4]
    $aUsers[UBound($aUsers, 1) - 1][0] = $TempSocket
    $aUsers[UBound($aUsers, 1) - 1][1] = SocketToIP($TempSocket)
    TrayTipExt("Neuer Client verbunden: '" & $aUsers[UBound($aUsers, 1) - 1][1] & "'")
    TCPSend($TempSocket, "//Accept")
    Else
    TCPCloseSocket($TempSocket)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $TempSocket = ""

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>CheckSocket

    [/autoit] [autoit][/autoit] [autoit]

    Func CheckIncoming()
    Local $aData[1]
    Local $TempUsers

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To UBound($aUsers, 1) - 1
    $TempData = TCPRecv($aUsers[$iIndex][0], 8192)
    Select

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 6) = "//Name"
    $TempData = StringTrimLeft($TempData, 7)
    $TempData = StringTrimRight($TempData, 1)
    If $TempData = "" Then ContinueCase
    $aUsers[$iIndex][2] = $TempData
    $TempSearchResultName = _ArraySearch($aUsers, $TempData, _ArraySearch($aUsers, $TempData) + 1)

    [/autoit] [autoit][/autoit] [autoit]

    If $TempSearchResultName <> -1 And StringLen($aUsers[$TempSearchResultName][2]) > 0 Then
    TCPSend($aUsers[$TempSearchResultName][0], "//Kick(DoubleName)")
    TCPCloseSocket($aUsers[$TempSearchResultName][0])

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "Server|" & $sIP & "|'" & $aUsers[$TempSearchResultName][2] & "' wurde vom Server gekickt, weil der Name bereits vergeben ist!")
    LogFile("Server => " & $aUsers[$i][2] & ": '" & $aUsers[$TempSearchResultName][2] & "' wurde vom Server gekickt, weil der Name bereits vergeben ist!", "Chat")
    Next
    WriteMemo("'" & $aUsers[$TempSearchResultName][2] & "' wurde vom Server gekickt, weil der Name bereits vergeben ist!", "Server")
    $aUsers[$TempSearchResultName][0] = ""
    $aUsers[$TempSearchResultName][1] = ""
    $aUsers[$TempSearchResultName][2] = ""
    $aUsers[$TempSearchResultName][3] = ""
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    $TempUsers = $aUsers[$i][2] & ";" & $TempUsers
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//Users(" & $TempUsers & ")")
    If $TempSearchResultName = -1 Then LogFile("Server => " & $aUsers[$i][2] & ": '" & $TempData & "' ist dem Chat beigetreten! IP: (" & $aUsers[$i][1] & ")", "Chat")
    Next
    WriteMemo("'" & $TempData & "' ist dem Chat beigetreten!", "Server")
    _GUICtrlListView_AddItem($hListView2, $TempData)

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 5) = "//Key"
    $TempData = StringTrimLeft($TempData, 6)
    $TempData = StringTrimRight($TempData, 1)

    [/autoit] [autoit][/autoit] [autoit]

    If $TempData = "" Then ContinueCase

    [/autoit] [autoit][/autoit] [autoit]

    $aUsers[$iIndex][3] = $TempData
    $TempSearchResultKey = _ArraySearch($aBanList, $TempData)

    [/autoit] [autoit][/autoit] [autoit]

    If $TempSearchResultKey <> -1 Then
    $sBannedUser = _ArraySearch($aUsers, $TempData)
    TCPSend($aUsers[$sBannedUser][0], "//Kick(Banned)")
    TCPCloseSocket($aUsers[$sBannedUser][0])

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "Server|" & $sIP & "|'" & $aUsers[$sBannedUser][2] & "' ist ein verbannter User!")
    LogFile("Server => " & $aUsers[$i][2] & ": '" & $aUsers[$sBannedUser][2] & "' ist ein verbannter User!", "Chat")
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Else
    TCPSend($aUsers[$iIndex][0], "//Allowed")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $aUsers[$sBannedUser][0] = ""
    $aUsers[$sBannedUser][1] = ""
    $aUsers[$sBannedUser][2] = ""
    $aUsers[$sBannedUser][3] = ""

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLeft($TempData, 6) = "//Quit"
    $TempData = StringTrimLeft($TempData, 7)
    $TempData = StringTrimRight($TempData, 1)
    If $TempData = "" Then ContinueCase
    $TempSearch = _ArraySearch($aUsers, $TempData)
    TCPCloseSocket($aUsers[$TempSearch][0])

    [/autoit] [autoit][/autoit] [autoit]

    $aUsers[$TempSearch][0] = ""
    $aUsers[$TempSearch][1] = ""
    $aUsers[$TempSearch][2] = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserQuit(" & $TempData & ")")
    LogFile("Server => " & $aUsers[$i][2] & ": '" & $TempData & "' hat den Chat verlassen!", "Chat")
    Next
    WriteMemo("'" & $TempData & "' hat den Chat verlassen!", "Server")
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $TempData))

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLen($TempData) > 0
    _ArrayAdd($aData, $TempData)

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect
    Next
    If StringLen($aData[(UBound($aData, 1) - 1)]) > 0 Then

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 1 To UBound($aData, 1) - 1

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], $aData[$iIndex])
    $aTempData = StringSplit($aData[$iIndex], "|", 2)
    LogFile($aTempData[0] & " => " & $aUsers[$i][2] & ": " & $aTempData[2], "Chat")
    Next
    WriteMemo($aTempData[2], $aTempData[0])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $TempUsers = ""
    $TempData = ""
    $TempSearchResultName = ""

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>CheckIncoming

    [/autoit] [autoit][/autoit] [autoit]

    Func CheckConnection()
    For $iIndex = 0 To UBound($aUsers, 1) - 1
    If Ping($aUsers[$iIndex][1], 250) = 0 And StringLen($aUsers[$iIndex][1]) > 0 Then
    TCPCloseSocket($aUsers[$iIndex][0])
    $aUsers[$iIndex][0] = ""
    $aUsers[$iIndex][1] = ""
    $aUsers[$iIndex][2] = ""
    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "Server|" & $sIP & "|Die Verbindung zur Maschine von '" & $aUsers[$iIndex][1] & "' ging verloren!")
    Next
    EndIf
    Next
    EndFunc ;==>CheckConnection

    [/autoit] [autoit][/autoit] [autoit]

    Func AFKKick()
    EndFunc ;==>AFKKick

    [/autoit] [autoit][/autoit] [autoit]

    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
    Return $aRet
    EndFunc ;==>SocketToIP

    [/autoit] [autoit][/autoit] [autoit]

    Func LogFile($sData, $sType)
    Switch $sType
    Case "Chat"
    _FileWriteLog(@ScriptDir & "\" & $sChatLogName, $sData)
    Case "Programm"
    _FileWriteLog(@ScriptDir & "\" & $sGeneralLogName, $sData)
    EndSwitch
    EndFunc ;==>LogFile

    [/autoit] [autoit][/autoit] [autoit]

    Func OpenChatLog()
    TrayItemSetState(@TRAY_ID, 68)
    If Not FileExists(@SystemDir & "\notepad.exe") Then
    MsgBox(48, "Error", "notepad.exe konnte nicht gefunden werden!")
    Return -1
    EndIf
    Run("notepad.exe " & $sChatLogName)
    EndFunc ;==>OpenChatLog

    [/autoit] [autoit][/autoit] [autoit]

    Func ShowClients()
    _GUICtrlListView_DeleteAllItems($hListView1)
    For $i = 0 To UBound($aUsers, 1) - 1
    If StringLen($aUsers[$i][2]) > 0 And StringLen($aUsers[$i][1]) > 0 Then
    $iTempIndex = _GUICtrlListView_AddItem($hListView1, $aUsers[$i][2], 0)
    _GUICtrlListView_AddSubItem($hListView1, $iTempIndex, $aUsers[$i][1], 1, 1)
    EndIf
    $iMaxIndexClientList = _GUICtrlListView_GetItemCount($hListView1)
    Next
    EndFunc ;==>ShowClients

    [/autoit] [autoit][/autoit] [autoit]

    Func KickSelected()
    For $iIndex = 0 To $iMaxIndexClientList - 1
    $TempStatus = _GUICtrlListView_GetItem($hListView1, $iIndex)
    If BitAND($TempStatus[0], 8) = 8 Then
    $TempSearchResult = _ArraySearch($aUsers, _GUICtrlListView_GetItemText($hListView1, $iIndex))
    If $TempSearchResult <> -1 Then
    TCPSend($aUsers[$TempSearchResult][0], "//Kick(Admin)")
    TCPCloseSocket($aUsers[$TempSearchResult][0])
    $aUsers[$TempSearchResult][0] = ""
    $aUsers[$TempSearchResult][1] = ""
    $aUsers[$TempSearchResult][3] = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserKick(" & $aUsers[$TempSearchResult][2] & ")")
    Next
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $aUsers[$TempSearchResult][2]))
    $aUsers[$TempSearchResult][2] = ""
    Else
    MsgBox(48, "Error", "Der User konnte nicht gefunden werden!")
    Return -1
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_DeleteAllItems($hListView1)
    For $i = 0 To UBound($aUsers, 1) - 1
    If StringLen($aUsers[$i][2]) > 0 And StringLen($aUsers[$i][1]) > 0 Then
    $iTempIndex = _GUICtrlListView_AddItem($hListView1, $aUsers[$i][2], 0)
    _GUICtrlListView_AddSubItem($hListView1, $iTempIndex, $aUsers[$i][1], 1, 1)
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $TempStatus = ""
    $iTempIndex = ""
    $TempSearchResult = ""

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>KickSelected

    [/autoit] [autoit][/autoit] [autoit]

    Func BanSelected()
    For $iIndex = 0 To $iMaxIndexClientList - 1
    $TempStatus = _GUICtrlListView_GetItem($hListView1, $iIndex)
    If BitAND($TempStatus[0], 8) = 8 Then
    $TempSearchResult = _ArraySearch($aUsers, _GUICtrlListView_GetItemText($hListView1, $iIndex))
    If $TempSearchResult <> -1 Then

    [/autoit] [autoit][/autoit] [autoit]

    Switch MsgBox(48 + 3, "Perm/Temp - Ban", "Soll der User permanent gebannt werden?" & @LF & _
    "'JA' = Perm, 'NEIN' = Temp, 'Abbrechen' = Abbruch der Funktion")
    Case 6
    _FileWriteToLine($sBanListPath, _FileCountLines($sBanListPath) + 1, $aUsers[$TempSearchResult][3])
    _ArrayAdd($aBanList, $aUsers[$TempSearchResult][3])
    Case 7
    _ArrayAdd($aBanList, $aUsers[$TempSearchResult][3])
    Case Else
    Return -1
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    TCPSend($aUsers[$TempSearchResult][0], "//Kick(AdminBan)")
    TCPCloseSocket($aUsers[$TempSearchResult][0])
    $aUsers[$TempSearchResult][0] = ""
    $aUsers[$TempSearchResult][1] = ""
    $aUsers[$TempSearchResult][3] = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserBan(" & $aUsers[$TempSearchResult][2] & ")")
    Next
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $aUsers[$TempSearchResult][2]))
    $aUsers[$TempSearchResult][2] = ""
    Else
    MsgBox(48, "Error", "Der User konnte nicht gefunden werden!")
    Return -1
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_DeleteAllItems($hListView1)
    For $i = 0 To UBound($aUsers, 1) - 1
    If StringLen($aUsers[$i][2]) > 0 And StringLen($aUsers[$i][1]) > 0 Then
    $iTempIndex = _GUICtrlListView_AddItem($hListView1, $aUsers[$i][2], 0)
    _GUICtrlListView_AddSubItem($hListView1, $iTempIndex, $aUsers[$i][1], 1, 1)
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $TempStatus = ""
    $iTempIndex = ""
    $TempSearchResult = ""

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>BanSelected

    [/autoit] [autoit][/autoit] [autoit]

    Func _AdminChat()

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetState($Input1, $GUI_FOCUS)
    GUISetState(@SW_SHOW, $hMainGUI)
    TrayItemSetState(@TRAY_ID, 68)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_AdminChat

    [/autoit] [autoit][/autoit] [autoit]

    Func _Send()

    [/autoit] [autoit][/autoit] [autoit]

    $sDataAdmin = GUICtrlRead($Input1)

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case StringLower($sDataAdmin) = "restart"
    LogFile("Programm wird von Admin per Chatbefehle neugestartet!", "Programm")
    LogFile("", "Programm")
    $bRestart = True
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLower($sDataAdmin) = "shutdown"
    LogFile("Programm wird von Admin per Chatbefehle beendet!", "Programm")
    LogFile("", "Programm")
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLower(StringLeft($sDataAdmin, 5)) = "kick "
    $sName = StringRight($sDataAdmin, StringLen($sDataAdmin) - 5)
    $TempSearchResult = _ArraySearch($aUsers, $sName)
    If $TempSearchResult <> -1 Then
    TCPSend($aUsers[$TempSearchResult][0], "//Kick(Admin)")
    TCPCloseSocket($aUsers[$TempSearchResult][0])
    $aUsers[$TempSearchResult][0] = ""
    $aUsers[$TempSearchResult][1] = ""
    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserKick(" & $aUsers[$TempSearchResult][2] & ")")
    Next
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $aUsers[$TempSearchResult][2]))
    $aUsers[$TempSearchResult][2] = ""
    Else
    MsgBox(48, "Error", "Der User konnte nicht gefunden werden!")
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLower(StringLeft($sDataAdmin, 4)) = "ban "
    $sName = StringRight($sDataAdmin, StringLen($sDataAdmin) - 4)
    $TempSearchResult = _ArraySearch($aUsers, $sName)
    If $TempSearchResult <> -1 Then

    [/autoit] [autoit][/autoit] [autoit]

    Switch MsgBox(48 + 3, "Perm/Temp - Ban", "Soll der User permanent gebannt werden?" & @LF & _
    "'JA' = Perm, 'NEIN' = Temp, 'Abbrechen' = Abbruch der Funktion")
    Case 6
    _FileWriteToLine($sBanListPath, _FileCountLines($sBanListPath) + 1, $aUsers[$TempSearchResult][3])
    _ArrayAdd($aBanList, $aUsers[$TempSearchResult][3])
    Case 7
    _ArrayAdd($aBanList, $aUsers[$TempSearchResult][3])
    Case Else
    Return -1
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    TCPSend($aUsers[$TempSearchResult][0], "//Kick(AdminBan)")
    TCPCloseSocket($aUsers[$TempSearchResult][0])
    $aUsers[$TempSearchResult][0] = ""
    $aUsers[$TempSearchResult][1] = ""
    $aUsers[$TempSearchResult][3] = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//UserBan(" & $aUsers[$TempSearchResult][2] & ")")
    Next
    _GUICtrlListView_DeleteItem($hListView2, _GUICtrlListView_FindText($hListView2, $aUsers[$TempSearchResult][2]))
    $aUsers[$TempSearchResult][2] = ""

    [/autoit] [autoit][/autoit] [autoit]

    Else
    MsgBox(48, "Error", "Der User konnte nicht gefunden werden!")
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case StringLen($sDataAdmin) > 0
    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "Admin|" & $sIP & "|" & $sDataAdmin)
    Next
    WriteMemo($sDataAdmin, "Admin")
    LogFile("Admin => ALL: " & $sDataAdmin, "Chat")
    EndSelect

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Input1, "")
    GUICtrlSetState($Input1, $GUI_FOCUS)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Send

    [/autoit] [autoit][/autoit] [autoit]

    Func ToggleClientGUI()
    Switch _WinAPI_IsWindowVisible($hClientverwaltung)
    Case True
    GUISetState(@SW_HIDE, $hClientverwaltung)
    TrayItemSetState(@TRAY_ID, 68)
    ShowClients()
    Case False
    GUISetState(@SW_SHOW, $hClientverwaltung)
    TrayItemSetState(@TRAY_ID, 65)
    ShowClients()
    EndSwitch
    EndFunc ;==>ToggleClientGUI

    [/autoit] [autoit][/autoit] [autoit]

    Func HideChatGUI()
    GUISetState(@SW_HIDE, $hMainGUI)
    EndFunc ;==>HideChatGUI

    [/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItStart()
    LogFile("", "Programm")
    LogFile(" --- SERVER STARTUP --- ", "Programm")
    LogFile("", "Programm")
    LogFile("", "Chat")
    LogFile(" --- SERVER STARTUP --- ", "Chat")
    LogFile("", "Chat")
    EndFunc ;==>OnAutoItStart

    [/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItExit()
    For $i = 1 To UBound($aUsers, 1) - 1
    If $aUsers[$i][0] = "" Then ContinueLoop
    TCPSend($aUsers[$i][0], "//Quit(Server-Shutdown)")
    LogFile("Server => " & $aUsers[$i][2] & "(" & $aUsers[$i][1] & "): //Quit(Server-Shutdown)", "Chat")
    TCPCloseSocket($aUsers[$i][0])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    TCPShutdown()

    [/autoit] [autoit][/autoit] [autoit]

    LogFile("Laufzeit: " & $Time, "Programm")
    LogFile("", "Chat")
    LogFile(" --- SERVER SHUTDOWN --- ", "Chat")
    LogFile("", "Chat")
    LogFile("", "Programm")
    LogFile(" --- SERVER SHUTDOWN --- ", "Programm")
    LogFile("", "Programm")
    If $bRestart = True Then ShellExecute(@ScriptFullPath)
    EndFunc ;==>OnAutoItExit

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    If TrayItemGetText(@TRAY_ID) = "Beenden" Then Exit
    If TrayItemGetText(@TRAY_ID) = "Server neu starten" Then
    LogFile("Programm wird von Admin per Traymenü neu gestartet!", "Programm")
    LogFile("", "Programm")
    $bRestart = True
    Exit
    ElseIf GUICtrlRead(@GUI_CtrlId) = "Server neu starten" Then
    LogFile("Programm wird von Admin über das Verwaltungsmenü neu gestartet!", "Programm")
    LogFile("", "Programm")
    $bRestart = True
    Exit
    EndIf
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func CopyIPClipboard()
    TrayItemSetState(@TRAY_ID, 68)
    If StringLen(ClipGet()) > 0 Then
    If MsgBox(48 + 4, "Error", "Die Zwischenablage ist NICHT leer!" & @LF & _
    "Enthält folgendes: " & @LF & @LF & _
    ClipGet() & @LF & @LF & _
    "Überschreiben?") = 6 Then
    If ClipPut($sIP) = 1 Then
    LogFile("Server-IP (" & $sIP & ") erfolgreich in die Zwischenablage kopiert!", "Programm")
    TrayTipExt("Kopieren erfolgreich!")
    EndIf
    EndIf
    EndIf
    EndFunc ;==>CopyIPClipboard

    [/autoit] [autoit][/autoit] [autoit]

    Func TrayTipExt($sText)
    TrayTip($sTitle, $sText, 3)
    $tTrayTipTimer = _Timer_Init()
    EndFunc ;==>TrayTipExt

    [/autoit] [autoit][/autoit] [autoit]

    Func RefreshStuff()
    If _Timer_Diff($tTrayTipTimer) > 3000 Then TrayTip($sTitle, "", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $iLastMins = $iMins
    $iLastHour = $iHours

    [/autoit] [autoit][/autoit] [autoit]

    _TicksToTime(_Timer_Diff($tGes), $iHours, $iMins, $iSecs)

    [/autoit] [autoit][/autoit] [autoit]

    If $iLastMins <> $iMins Or $iLastHour <> $iHours Then
    $Time = StringFormat("%02i:%02i", $iHours, $iMins)
    TraySetToolTip("Server IP: " & $sIP & "" & @LF _
    & "Computername: " & $sPCNetworkName & "" & @LF _
    & "Server läuft: " & $Time)
    EndIf
    EndFunc ;==>RefreshStuff

    [/autoit] [autoit][/autoit] [autoit]

    Func WriteMemo($sData, $sNameEdit)
    GUICtrlSetData($Edit1, GUICtrlRead($Edit1) & @HOUR & ":" & @MIN & " ~ " & $sNameEdit & " > " & $sData & @CRLF)
    EndFunc ;==>WriteMemo

    [/autoit]

    Gruß
    M3d1c5