TS3-Adminclient

  • Hi,

    so neues Projekt von mir. Diesemal ein TS3-Adminclient zur Verwaltung von vservern eines TS3-Servers. Aktuell braucht man noch einen VOLLEN Serveradminaccount, ein vserver-Account reicht aktuell nicht, kommt aber noch.

    Aktuelle Features:

    - Anzeige von Server, Uptime und aktuellen Usern auf den Servern
    - Starten/Stoppen von Servern
    - Löschen von Servern
    - Erstellen von Servern
    - Log anzeige

    Todo:

    Alles was möglich ist im TS3, also Channels erstellen, gruppen erstellen, user verschieben, kicken, Template von Channelstruktur speichern um diese schnell zu switchen usw.

    Spoiler anzeigen
    [autoit]

    #include <ts3.au3>
    #include <String.au3>
    #include <GuiListView.au3>
    #include <GuiButton.au3>
    #include <WindowsConstants.au3>
    #include <ListViewConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <MenuConstants.au3>
    #include <GuiListBox.au3>

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

    GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

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

    #region ### START Koda GUI section ### Form=
    $loginform = GUICreate("TS3-Admin Login", 272, 149, 192, 124)
    $serverinput = GUICtrlCreateInput("", 80, 8, 177, 26)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $serverlable = GUICtrlCreateLabel("Server:", 8, 8, 54, 22)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $userinput = GUICtrlCreateInput("", 80, 43, 177, 26)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $userlable = GUICtrlCreateLabel("User:", 8, 43, 41, 22)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $passwortinput = GUICtrlCreateInput("", 82, 77, 177, 26)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $passwortlable = GUICtrlCreateLabel("Passwort:", 10, 77, 73, 22)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $loginbutton = GUICtrlCreateButton("Login", 80, 112, 75, 25)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    #region ### START Koda GUI section ### Form=
    $vserverlistform = GUICreate("TS3-Admin Serverliste", 613, 315, 192, 124)
    $vserverlistview = GUICtrlCreateListView("ID|Name|Port|Status|Online|Max Clients|Uptime", 8, 8, 594, 262, BitOR($LVS_NOSORTHEADER, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $vserverstartstopbutton = GUICtrlCreateButton("Start", 8, 280, 75, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $vservereditbutton = GUICtrlCreateButton("Bearbeiten", 88, 280, 75, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $vservernewbutton = GUICtrlCreateButton("Neu", 168, 280, 75, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $vserverdeletebutton = GUICtrlCreateButton("Löschen", 248, 280, 75, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    GUISetState(@SW_HIDE)
    #endregion ### END Koda GUI section ###

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

    #region ### START Koda GUI section ### Form=c:\users\error\desktop\form1.kxf
    $serverneuform = GUICreate("TS3-Admin Server erstellen", 316, 276, 230, 143)
    $Servername = GUICtrlCreateLabel("Servername", 8, 8, 72, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $servernameedit = GUICtrlCreateInput("", 8, 32, 297, 24)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Willkommensnachricht = GUICtrlCreateLabel("Willkommensnachricht", 8, 64, 136, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $willkommenedit = GUICtrlCreateInput("", 8, 88, 297, 24)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $maxClient = GUICtrlCreateLabel("maximale Clients", 8, 120, 104, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $maxclientsedit = GUICtrlCreateInput("", 8, 150, 297, 24, $ES_NUMBER)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Serverpasswort = GUICtrlCreateLabel("Serverpasswort", 8, 181, 104, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $passwortedit = GUICtrlCreateInput("", 8, 206, 297, 24)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $servererstellenbutton = GUICtrlCreateButton("erstellen", 8, 240, 75, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    GUISetState(@SW_HIDE)
    #endregion ### END Koda GUI section ###

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

    #region ### START Koda GUI section ### Form=
    $logform = GUICreate("TS3 Admin - Log", 760, 236, 204, 549)
    $logedit = GUICtrlCreateList("", 8, 8, 737, 217)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    Dim $vserverliststate = 0
    Dim $vserverlistselected = -1
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $loginbutton
    login()
    Case $vserverstartstopbutton
    GUISetState(@SW_HIDE, $vserverlistform)
    startstop()
    GUISetState(@SW_SHOW, $vserverlistform)
    Case $vserverdeletebutton
    GUISetState(@SW_HIDE, $vserverlistform)
    serverloeschen()
    GUISetState(@SW_SHOW, $vserverlistform)
    Case $vservernewbutton
    GUISetState(@SW_HIDE, $vserverlistform)
    GUISetState(@SW_SHOW, $serverneuform)
    Case $servererstellenbutton
    GUISetState(@SW_HIDE, $serverneuform)
    If GUICtrlRead($servernameedit) = "" Then
    MsgBox(16, "TS3-Admin Servernamen", "Servername nicht angegeben!")
    GUISetState(@SW_SHOW, $serverneuform)
    Else
    serverneu(GUICtrlRead($servernameedit), GUICtrlRead($willkommenedit), GUICtrlRead($maxclientsedit), GUICtrlRead($passwortedit))
    GUICtrlSetData($servernameedit, "")
    GUICtrlSetData($willkommenedit, "")
    GUICtrlSetData($maxclientsedit, "")
    GUICtrlSetData($passwortedit, "")
    serverliste()
    GUISetState(@SW_SHOW, $vserverlistform)
    EndIf
    EndSwitch

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

    If $vserverliststate = 1 Then
    serverlistselect()
    EndIf
    WEnd

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

    Func logs($text)
    $timeaktuell = StringFormat("[%i.%i.%i, %i:%i:%i]", @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC)
    _GUICtrlListBox_InsertString($logedit, $timeaktuell & " " & $text, 0)
    EndFunc ;==>logs

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

    Func serverneu($name, $willkomm, $clients, $pass)
    logs("Funktion start: serverneu()")

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

    Dim $prop

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

    If $willkomm <> "" Then
    $prop = "virtualserver_welcomemessage=" & StringReplace($willkomm, " ", "\s") & " "
    EndIf

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

    If $clients > 0 Then
    $prop = $prop & "virtualserver_maxclients=" & $clients & " "
    Else
    $prop = $prop & "virtualserver_maxclients=32" & " "
    EndIf

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

    If $pass <> "" Then
    $prop = $prop & "virtualserver_password=" & $pass & " "
    EndIf

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

    SplashTextOn("TS3-Admin", "Server wird erstellt...", 200, 50)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $result = _TS3servercreate($name, $prop)

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

    logs("_TS3servercreate: " & $result)

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

    If StringInStr($result, "token") > 0 Then
    $token = _StringBetween($result, "token=", " virtualserver")
    $port = _StringBetween($result, "virtualserver_port=", "")
    MsgBox(0, "", $token[0] & " + " & $port[0])
    Else
    SplashOff()
    MsgBox(48, "", $result)
    $i = 1
    EndIf

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

    serverliste()
    SplashOff()
    logs("Funktion stop: serverneu()")
    EndFunc ;==>serverneu

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

    Func serverloeschen()
    logs("Funktion start: serverloeschen()")

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

    SplashTextOn("TS3-Admin", "Server wird gelöscht...", 200, 50)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $vserverlistarray = _GUICtrlListView_GetItemTextArray($vserverlistview, $vserverlistselected)
    $result = _TS3serverstop($vserverlistarray[1])
    logs("_TS3serverstop: " & $result)
    Sleep(2000)
    $result1 = _TS3serverdelete($vserverlistarray[1])
    logs("_TS3serverdelete: " & $result1)
    Sleep(2000)
    serverliste()
    SplashOff()
    logs("Funktion stop: serverloeschen()")
    EndFunc ;==>serverloeschen

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

    Func startstop()
    logs("Funktion start: startstop()")

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

    $vserverlistarray = _GUICtrlListView_GetItemTextArray($vserverlistview, $vserverlistselected)
    _GUICtrlButton_Enable($vserverstartstopbutton, False)
    If GUICtrlRead($vserverstartstopbutton) = "Stop" Then
    SplashTextOn("TS3-Admin", "Server wird gestoppt...", 200, 50)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $result = _TS3serverstop($vserverlistarray[1])
    logs("_TS3serverstop: " & $result)
    GUICtrlSetData($vserverstartstopbutton, "Start")
    Else
    SplashTextOn("TS3-Admin", "Server wird gestartet...", 200, 50)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $result = _TS3serverstart($vserverlistarray[1])
    logs("_TS3serverstart: " & $result)
    GUICtrlSetData($vserverstartstopbutton, "Stop")
    EndIf
    Sleep(2000)
    serverliste()
    SplashOff()
    _GUICtrlButton_Enable($vserverstartstopbutton, True)
    logs("Funktion stop: startstop()")
    EndFunc ;==>startstop

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

    Func serverlistselect()
    If _GUICtrlListView_GetSelectionMark($vserverlistview) <> -1 Then
    If $vserverlistselected <> _GUICtrlListView_GetSelectionMark($vserverlistview) Then
    $vserverlistselected = _GUICtrlListView_GetSelectionMark($vserverlistview)
    $vserverlistarray = _GUICtrlListView_GetItemTextArray($vserverlistview, $vserverlistselected)

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

    If $vserverlistarray[4] = "online" Then
    GUICtrlSetData($vserverstartstopbutton, "Stop")
    Else
    GUICtrlSetData($vserverstartstopbutton, "Start")
    EndIf
    EndIf
    EndIf
    EndFunc ;==>serverlistselect

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

    Func login()
    logs("Funktion start: login()")

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

    $connectrueck = _TS3connect(GUICtrlRead($serverinput))
    logs("_TS3connect: " & $connectrueck)

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

    If $connectrueck = 0 Then
    MsgBox(48, "ERROR", "Server nicht erreichbar")
    logs("Funktion stop: login()")
    Return
    EndIf

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

    If @error Then
    If @error = 1 Then
    MsgBox(48, "ERROR", "falsche IP")
    ElseIf @error = 2 Then
    MsgBox(48, "ERROR", "falscher Port")
    Else
    MsgBox(48, "Windows API WSAGetError", @error)
    EndIf
    Else
    $loginrueck = _TS3login(GUICtrlRead($userinput), GUICtrlRead($passwortinput))
    logs("_TS3login: " & $loginrueck)
    If $loginrueck > 1 Then
    _GUICtrlButton_Enable($loginbutton, False)
    For $i = $loginrueck To 0 Step -1
    GUICtrlSetData($loginbutton, "Ban: " & $i)
    Sleep(1000)
    Next
    GUICtrlSetData($loginbutton, "Login")
    _GUICtrlButton_Enable($loginbutton, True)
    ElseIf $loginrueck = 1 Then
    serverliste()
    GUISetState(@SW_HIDE, $loginform)
    $vserverliststate = 1
    GUISetState(@SW_SHOW, $vserverlistform)
    Else
    MsgBox(48, "ERROR", $loginrueck)
    EndIf
    EndIf
    logs("Funktion stop: login()")
    EndFunc ;==>login

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

    Func serverliste()
    logs("Funktion start: serverliste()")

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

    ;~ _GUICtrlListView_BeginUpdate($vserverlistview)

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

    _GUICtrlButton_Enable($vserverstartstopbutton, False)
    _GUICtrlButton_Enable($vservereditbutton, False)
    _GUICtrlButton_Enable($vservernewbutton, False)
    _GUICtrlButton_Enable($vserverdeletebutton, False)

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

    _GUICtrlListView_DeleteAllItems($vserverlistview)

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

    _GUICtrlListView_EnableGroupView($vserverlistview)
    _GUICtrlListView_InsertGroup($vserverlistview, -1, 1, "online")
    _GUICtrlListView_InsertGroup($vserverlistview, -1, 2, "offline")

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

    $i = 0
    $vserverlist = ""
    Do
    $vserverlist = _TS3serverlist()
    logs("_TS3serverlist: " & $vserverlist)
    If StringInStr($vserverlist, "virtualserver") > 0 Then
    $i = 1
    ElseIf StringInStr($vserverlist, "insufficent client permissions") > 0 Then
    MsgBox(48,"","Kein Serveradminaccount")
    ;~ InputBox("Kein Superadminaccount", "Dieser Account ist kein Superadmin. Gib den Port des zu administrierenden Servers an.")
    ElseIf StringInStr($vserverlist, "database empty result set") > 0 Then
    _GUICtrlButton_Enable($vservernewbutton, True)
    Return
    EndIf
    Until $i = 1

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

    $vserverlist = StringSplit($vserverlist, "|", 2)
    $count = 0

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

    For $vserver In $vserverlist
    $vserverid = _StringBetween($vserver, "virtualserver_id=", " virtualserver")
    $vservername = _StringBetween($vserver, "virtualserver_name=", " virtualserver")
    $vservername = StringReplace($vservername[0], "\s", " ")
    $vserverport = _StringBetween($vserver, "virtualserver_port=", " virtualserver")
    $vserverstatus = _StringBetween($vserver, "virtualserver_status=", " virtualserver")
    If $vserverstatus[0] = "online" Then
    $vserveronlinearray = _StringBetween($vserver, "virtualserver_clientsonline=", " virtualserver")
    $vserveronline = $vserveronlinearray[0]
    $vserverclientsarray = _StringBetween($vserver, "virtualserver_maxclients=", " virtualserver")
    $vserverclients = $vserverclientsarray[0]
    $vserveruptimearray = _StringBetween($vserver, "virtualserver_uptime=", " virtualserver")

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

    $Hour = Int(($vserveruptimearray[0] / 60) / 60)
    $Mins = Int(($vserveruptimearray[0] - ($Hour * 60 * 60)) / 60)
    $Secs = $vserveruptimearray[0] - ($Mins * 60) - ($Hour * 60 * 60)

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

    $Day = Int((($vserveruptimearray[0] / 60) / 60) / 24)
    $Hour = Int((($vserveruptimearray[0] - ((($Day * 24) * 60) * 60)) / 60) / 60)
    $Mins = Int(($vserveruptimearray[0] - ((($Day * 24) * 60) * 60) - (($Hour * 60) * 60)) / 60)
    $Secs = $vserveruptimearray[0] - ((($Day * 24) * 60) * 60) - (($Hour * 60) * 60) - ($Mins * 60)

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

    $vserveruptime = StringFormat("%i Tage, %02i:%02i:%02i", $Day, $Hour, $Mins, $Secs)
    Else
    $vserveronline = "NA"
    $vserverclients = "NA"
    $vserveruptime = "NA"
    EndIf

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

    $itemid = GUICtrlCreateListViewItem($vserverid[0] & "|" & $vservername & "|" & $vserverport[0] & "|" & $vserverstatus[0] & "|" & $vserveronline & "|" & $vserverclients & "|" & $vserveruptime, $vserverlistview)

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

    If $vserverstatus[0] = "offline" Then
    _GUICtrlListView_SetItemGroupID($vserverlistview, $count, 2)
    GUICtrlSetColor($itemid, 0xCC0000)
    Else
    _GUICtrlListView_SetItemGroupID($vserverlistview, $count, 1)
    EndIf
    $count = $count + 1
    Next

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

    _GUICtrlButton_Enable($vserverstartstopbutton, True)
    _GUICtrlButton_Enable($vservereditbutton, True)
    _GUICtrlButton_Enable($vservernewbutton, True)
    _GUICtrlButton_Enable($vserverdeletebutton, True)

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

    logs("Funktion stop: serverliste()")
    EndFunc ;==>serverliste

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

    Func WM_SYSCOMMAND($hGUI, $iMsg, $wParam = 0, $lParam = 0)
    If $wParam = $SC_CLOSE Then Exit
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_SYSCOMMAND

    [/autoit]

    Zusätzlich wird noch die neue Version meiner TS3-UDF benötigt. Siehe Link in meiner Sig.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.