Unterstützung bei Script

  • Hallo Leute
    Meine Funktion sucht per StringRegExp in der Log Datei meines Game Servers nach Admin Befehle die der Admin eingibt im Spiel, in diesem Beispiel ist es "akick [PLayer Name] M(Misbahavior)"
    Ich habe eine Datei AdminDatabase.txt ( Namen und ID's werden über die Gui hinzugefügt )

    Code
    Djallo|0xDC9EE9355C18BDCF
    Blobo|0xDC9EE9355C18BD7F
    Tunaa|0x3B93DBD5A37A35DB


    und eine Datei JoinedPlayers.txt


    Nun soll als erstes überprüft werden ob der der den Admin Befehl eingegeben hat auch Admin ist und dann soll überprüft werden ob Name und ID (AdminDatabase.txt) des Admins auch mit Namen und ID In der JoinedPlayers.txt übereinstimmt dann wird überprüft ob der Spieler der gekickt werden soll auch in der in der JoinedPlayers.txt vorhanden ist, wenn alles übereinstimmt wird der Kick Befehl an den Server gesendet.
    Nach meheren Versuchen hab ich das dann so hingekriegt, war ein richtiger Murks aber es funktioniert fürs erste.

    Spoiler anzeigen
    [autoit]

    Func ReadAdminCommands()
    Local $commandkickM
    Local $aFileb = ""
    Local $aFile = ""
    _FileReadToArray(@ScriptDir & "\AdminsDatabase.txt", $aFile)
    _FileReadToArray(@ScriptDir & "\JoinedPlayers.txt", $aFileb)
    $commandkickM = StringRegExp($newReadLine, "message\:\s(.*)\s\(All\)\:\s(akick)\s(.*)\s(M)", 3)
    If IsArray($commandkickM) Then
    Local $a2D[$aFile[0]][2]
    Local $a2D2[$aFileb[0]][2]
    For $i = 1 To $aFile[0]
    $aSplit = StringSplit($aFile[$i], "|")
    $a2D[$i - 1][0] = $aSplit[1]
    $a2D[$i - 1][1] = $aSplit[2]
    If $a2D[$i - 1][0] == $commandkickM[0] Then
    _FileWriteLog($reportsFile, "Admin " & $commandkickM[0] & " message: " & $commandkickM[1] & " " & $commandkickM[2] & " " & $commandkickM[3], -1)
    For $i2 = 1 To $aFileb[0]
    $aSplit = StringSplit($aFileb[$i2], "|")
    $a2D2[$i2 - 1][0] = $aSplit[1]
    $a2D2[$i2 - 1][1] = $aSplit[2]
    If $a2D2[$i2 - 1][0] & $a2D2[$i2 - 1][1] == $a2D[$i - 1][0] & $a2D[$i - 1][1] Then
    For $i3 = 1 To $aFileb[0]
    $aSplit = StringSplit($aFileb[$i3], "|")
    $a2D2[$i3 - 1][0] = $aSplit[1]
    $a2D2[$i3 - 1][1] = $aSplit[2]
    If $a2D2[$i3 - 1][0] == $commandkickM[2] Then
    StdinWrite($fc2, "tell " & $commandkickM[2] & " You have been Kicked " & $commandkickM[2] & @CRLF)
    Sleep(2000)
    StdinWrite($fc2, "net_kickclient " & $commandkickM[2] & @CRLF)
    StdinWrite($fc2, "say " & $commandkickM[2] & " was kicked by Admin." & @CRLF)
    StdinWrite($fc2, "say " & "Reason: Misbehavior." & @CRLF)
    _FileWriteLog($reportsFile, "Admin " & $commandkickM[0] & " kicked " & $commandkickM[2] & " for Misbehavior.", -1)
    _FileWriteLog($bannedPlayersFile, "Admin " & $commandkickM[0] & " kicked " & $commandkickM[2] & " for Misbehavior.", -1)
    ;~ Else
    ;~ StdinWrite($fc2, "tell " & $commandkickM[0] & " Player Not Found" & @CRLF)
    ;~ _FileWriteLog($reportsFile, "Return message to " & $commandkickM[0] & ": Player Not Found", -1)
    EndIf
    Next
    EndIf
    Next
    EndIf
    Next
    EndIf
    EndFunc ;==>ReadAdminCommands

    [/autoit]


    Bin ich auf dem richtigen weg oder ist alles nur ein Murks?

    2 Mal editiert, zuletzt von VinceA (26. März 2014 um 21:09)

  • Und wobei brauchst du nun überhaupt Hilfe? :huh:

    Abgesehen davon, ich bin mir nicht sicher ob das unter Spiele-Automatisierung etc. fällt. Müsste ein PU/Mod/Admin was dazu sagen.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Bitte liess den Thread aufmerksam durch das hat nichts mit Spiele-Automatisierung zu tun, es ist eine Funktion von meinem Admin Tool.


    Ja, bevor du den Thread bearbeitet hattest, war nur der Text am Anfang und der Text-Ausschnitt. ;) Und abgesehen davon, ja ich weiß, ein Admin-Tool, aber trotzdem bleib ich da gerne vorsichtig.
    Also musst du mich nicht gleich für komplett dumm hinstellen.

    Aber ich bin ja nicht so, also hier mal ein alternativer Lösungsvorschlag:
    Lies doch einfach die 2 Dateien mittels FileRead ein, und überprüfe mit StringInStr ob der Admin-Name + ID in derAdminDatabase.txt & JoinedPlayers.txt vorhanden ist. Wenn ja, dann auch noch mittels StringInStr in der JoinedPlayers.txt nachschauen, ob der Spieler überhaupt am Server ist. Wenn auch ja, dann den Kick-Befehl senden. Mehr sollte das ja nicht sein.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Als ich den Thread schrieb habe ich aus Versehen auf Absenden geklickt, darum hast du warscheinlich nur den Anfang gesehen. Wollte dich keinesfalls dumm hinstellen oder sowas ähnliches ich wollte nur das es aufmerksam durchgelesen wird bevor es als Spiele-Automatisierung abgestempelt wird.

    Danke für deinen Vorschlag :) ich werds gleich ausprobieren.

  • So ich habs.
    Leider war StringInStr zu ungenau also habe ich es mit StringRegExp versucht und es funktioniert, Tip Top.

    Spoiler anzeigen
    [autoit]

    Global $adminDataFile = @ScriptDir & "\AdminsDatabase.txt" ; Pfad und Name der Datenbank-Datei
    Global $fileJoinedPlayers = @ScriptDir & "\JoinedPlayers.txt"
    Func ReadAdminCommands()
    Local $commandkickT, $String1, $String2
    $commandkickT = StringRegExp($newReadLine, "message\:\s(.*)\s\(All\)\:\s(akick)\s(.*)\s(T)", 3); Prüft, ob ein Admin-Befehl Im Server Chat eingegeben wird ( [PlayerName] akick [PlayerName] T ).
    If IsArray($commandkickT) Then ; Prüft, ob die Variable ein Array ist.
    $String1 = FileRead($adminDataFile) ; Lesen der TXT-Datei(Admin Liste)
    If StringRegExp($String1, "\b(" & $commandkickT[0] & ")\|") = True Then ; Prüft, ob der Spieler ein Admin ist.
    _FileWriteLog($reportsFile, "Admin " & $commandkickT[0] & " message: " & $commandkickT[1] & " " & $commandkickT[2] & " " & $commandkickT[3], -1) ; Schreibt einen Eintrag in die ServerLog Datei.
    $String2 = FileRead($fileJoinedPlayers) ; Lesen der TXT-Datei(Spieler die den Server betreten haben.)
    If StringRegExp($String2, "\b(" & $commandkickT[0] & ")\|(.*)", 3) == StringRegExp($String1, "\b(" & $commandkickT[0] & ")\|(.*)", 3) Then ; Prüft, ob der Name und ID des Admins in der Admin Liste Identisch ist mit dem des Admins der gerade den Kick-Befehl gab.
    If StringRegExp($String1, "\b(" & $commandkickT[2] & ")\|") = True Then ; Wenn es zutrifft dann -
    StdinWrite($fc2, "tell " & $commandkickT[2] & " You have been Kicked " & $commandkickT[2] & @CRLF) ; wird eine Nachricht an den PLayer geschickt.
    Sleep(2000) ; Pausiert damit der Player die Nachricht noch lesen kann bevor er gekickt wird
    StdinWrite($fc2, "net_kickclient " & $commandkickT[2] & @CRLF) ; Der Kick -Befehl wird an den Server gesendet.
    StdinWrite($fc2, "say " & $commandkickT[2] & " was kicked by Admin." & @CRLF) ; Die Nachricht informiert alle anderen Spieler weshalb der Player gekickt wurde.
    StdinWrite($fc2, "say " & "Reason: Team-Killing." & @CRLF)
    _FileWriteLog($reportsFile, "Admin " & $commandkickT[0] & " kicked " & $commandkickT[2] & " for Team-Killing.", -1) ; Schreibt einen Eintrag in die ServerLog Datei.
    _FileWriteLog($bannedPlayersFile, "Admin " & $commandkickT[0] & " kicked " & $commandkickT[2] & " for Team-Killing.", -1); Schreibt einen Eintrag In Die Datei der gebannt Spieler.
    Else
    StdinWrite($fc2, "tell " & $commandkickT[0] & " Player Not Found" & @CRLF) ; Sendet eine Nachricht an den Admin wenn der Spieler nicht gefunden wurde.
    _FileWriteLog($reportsFile, "Return message to " & $commandkickT[0] & ": Player Not Found", -1); Schreibt einen Eintrag in die ServerLog Datei.
    EndIf
    EndIf
    EndIf
    EndIf
    EndFunc ;==>ReadAdminCommands

    [/autoit]

    Ich hab noch eine Frage: Ist FileOpen zwingend bei FileRead?


  • Sehr gut, das das Problem nun gelöst ist. Bitte setz noch den Thread-Präfix auf "gelöst" ;)

    Und nein, FileOpen ist nicht benötigt, du kannst bei FileRead auch einfach den Dateinamen angeben. FileOpen ist aber von Vorteil, wenn du oft und wiederkehrend die Datei lesend musst, da dann nicht jedes Mal die Datei neu geöffnet werden muss. Aber wenn du die Datei nur einmal auslesen willst, dann genügt auch FileRead direkt.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski