#RequireAdmin
#Region
#AutoIt3Wrapper_UseX64=y
#EndRegion

#include <FTPEx.au3>

#cs
	// SCUM LogGrabber
	- Author/Creator: Paracodeycal
	- Usage: SCUM Simple Server FTP Log-Verwaltung
	- Enwickelt in Autoit

	- Tool-Beschreibung:
		Dieses Tool lädt automatisch die neuesten Log-Dateien eines SCUM-Servers herunter – basierend auf den Log-Typen, die in der INI-Datei definiert sind.
		Es eignet sich besonders für Admins, die regelmäßig bestimmte Logtypen wie z. B. admin, gameplay, vehicle, etc. benötigen, um Aktivitäten oder Fehler zu analysieren.
		Dieser Code ist ausschließlich für Administratoren gedacht, die tiefer in die „Log-Welten“ eintauchen möchten.
		Dieser Code dient als Vorlage, um eigene Lösungen zu entwickeln oder den Code weiter anzupassen und zu erweitern – oder aber auch um unverändert verwendet zu werden für eigene Projekte.

		//HowTo?
		Trage deine FTP-Daten und Server-Verzeichnisse in der Config.ini ein und passe unter „LogTypes“ die gewünschten Logs an (z. B. Admin, Kills, Gameplay, Economy).
		Nur die aktuellsten Logs gemäß deiner Definition werden auch heruntergeladen.

		WICHTIG: Achte darauf, dass die Verzeichnisse und FTP-Login-Daten korrekt sind und das die Config.ini existiert (Einmal Code Ausführen).

		Eine download.txt wird automatisch im Programmverzeichniss erstellt, um dir zu zeigen, was das Tool gerade gemacht hat oder ob es Fehler gab.


		//Info
		Die Weiterentwicklung dieser Funktionen wird von meiner Seite aus nicht mehr stattfinden.


	- Kontakt:
		Discord: discord.gg/ku4v7xjacR
		Twitch: https://www.twitch.tv/paracodeycal
		Youtube: https://www.youtube.com/@Paracodeycal
#ce

; + Alle Login-Daten, Verzeichnisse etc. aus der Config.ini laden
Global $_iniFile = "config.ini"

; + Prüfen ob die Config existiert
CreateNewConfigINI()

Global $ftpServer = IniRead($_iniFile, "ftp.login", "Server", "")
Global $ftpPort = IniRead($_iniFile, "ftp.login", "Port", 21)
Global $ftpUsername = IniRead($_iniFile, "ftp.login", "Username", "")
Global $ftpPassword = IniRead($_iniFile, "ftp.login", "Passwort", "")
Global $remoteDirectory = IniRead($_iniFile, "ftp.login", "Verzeichnis", "/")
Global $localSubDir = IniRead($_iniFile, "ftp.login", "LocalDirection", "Logs")

Global $localDownloadDir = @ScriptDir & "\" & $localSubDir & "\"
Global $ftpConn = ""

LogMsg("Einstellungen aus INI geladen:")
LogMsg("* Server: " & $ftpServer)
LogMsg("* Port: " & $ftpPort)
LogMsg("* Benutzer: " & $ftpUsername)
LogMsg("* Remote Pfad: " & $remoteDirectory)
LogMsg("* Lokales Verzeichnis: " & $localDownloadDir)

LogMsg("Verbinde mit dem Server...")

$ftpConn = GameServer_InitializeFTPConnection($ftpServer, $ftpUsername, $ftpPassword)
If $ftpConn = "" Then
	LogMsg("FEHLER: FTP-Verbindung konnte nicht hergestellt werden.")
	Exit
Else
	LogMsg("FTP-Verbindung erfolgreich.")
EndIf

; + Verzeichnis für die Logs erstellen
DirCreate($localDownloadDir)
LogMsg("Download-Verzeichnis überprüft: " & $localDownloadDir)

; + Lese alle Log-Typen aus der Config.ini
Local $logTypesString = IniRead("config.ini", "Log.Download", "LogTypes", "")
LogMsg("LogTypes aus INI geladen: " & $logTypesString)

If $logTypesString = "" Then
	MsgBox(16, "Fehler", "Keine LogTypen in Config.ini definiert, bitte trage diese ein.")
	LogMsg("Keine LogTypen in Config.ini definiert, bitte trage diese ein.")
EndIf

Local $ftpLoginString = IniRead("config.ini", "FTP.Login", "Server", "")
LogMsg("Prüfe FTP-Login-Daten: " & $ftpLoginString)

If StringInStr($ftpLoginString, "Host/IP") > 0 Then
	MsgBox(16, "Fehler", "Du musst deine IP/den Host und die FTP-Login-Daten deines Servers in der Config.ini angeben.")
	LogMsg("Du musst deine IP/den Host und die FTP-Login-Daten deines Servers in der Config.ini angeben.")
EndIf

; + Automatisch alle Logs, die in der INI definiert wurden, splitten, suchen und ins angegebene Verzeichnis herunterladen
Local $logTypes = StringSplit($logTypesString, ",", 2)
If IsArray($logTypes) And UBound($logTypes) > 0 Then
	For $i = 0 To UBound($logTypes) - 1
		Local $logType = StringStripWS($logTypes[$i], 3)
		LogMsg("Suche nach letztem Log vom Typ: " & $logType)

		Local $latestFilePath = GameServer_GetLatestLogByType($logType)

		If $latestFilePath <> "" Then
			Local $fileName = StringTrimLeft($latestFilePath, StringLen($remoteDirectory))
			Local $localPath = $localDownloadDir & $fileName

			LogMsg("Letzte Datei gefunden: " & $fileName)
			LogMsg("Download-Pfad lokal: " & $localPath)

			Local $downloadSuccess = _FTP_FileGet($ftpConn, $latestFilePath, $localPath, False, 0, $INTERNET_FLAG_RELOAD)
			If $downloadSuccess Then
				LogMsg("Download erfolgreich: " & $fileName)
				;TrayTip("SCUM Log-Logger","Download erfolgreich: " & $fileName,1)
			Else
				LogMsg("FEHLER beim Download von: " & $fileName & " | Fehlercode: " & @error)
			EndIf
		Else
			LogMsg("Keine Datei für Typ '" & $logType & "' gefunden.")
		EndIf
	Next
EndIf

; + Info: Alle Logs wurden heruntergeladen
LogMsg("Die neuesten Logs des Servers wurden erfolgreich heruntergeladen!")

; + FTP-Verbindung beenden
If $ftpConn <> "" Then
	LogMsg("Schließe FTP-Verbindung...")
	_FTP_Close($ftpConn)
	LogMsg("FTP-Verbindung geschlossen.")
	Exit
EndIf

; + Funktion zur Prüfung, ob die Config.ini existiert.
Func CreateNewConfigINI()
    If Not FileExists($_iniFile) Then
        ; + Standardwerte in die ini-Datei schreiben
        IniWrite($_iniFile, "Log.Download", "LogTypes", "admin,chat,vehicle_destruction,violations,loot,raid_protection,login,kill,gameplay,famepoints,event_kill,economy,chest_ownership,vehicle_destruction")
        IniWrite($_iniFile, "FTP.Login", "Server", "Server-Host/IP")
        IniWrite($_iniFile, "FTP.Login", "Port", "Server-Port")
        IniWrite($_iniFile, "FTP.Login", "Username", "FTP Username")
        IniWrite($_iniFile, "FTP.Login", "Passwort", "FTP Passwort")
        IniWrite($_iniFile, "FTP.Login", "Verzeichnis", "/SCUM/Saved/SaveFiles/Logs/")
        IniWrite($_iniFile, "FTP.Login", "LocalDirection", "Logs")

        Local $sMessage = "[Hinweis] Bitte passen Sie die Config.ini an, indem Sie Ihre FTP-Login-Daten und die gewünschten Log-Typen eintragen."

        MsgBox(64, "config.ini erstellt", $sMessage)

    EndIf
EndFunc	  ;==>CreateNewConfigINI


; + Neuste Log vom FTP herunterladen je nach definiertem Prefix aus der Config.ini
Func GameServer_GetLatestLogByType($logPrefix)
	LogMsg("Durchsuche FTP nach Dateien mit Prefix: " & $logPrefix)

	If Not GameServer_EnsureFTPConnection() Then
		LogMsg("FEHLER: Verbindung zu FTP nicht vorhanden.")
		Return ""
	EndIf

	Local $handle, $latestFile = "", $latestTimestamp = 0
	Local $searchPattern = $remoteDirectory & $logPrefix & "_*.log"

	LogMsg("Verwende Suchmuster: " & $searchPattern)

	Local $aFile = _FTP_FindFileFirst($ftpConn, $searchPattern, $handle)
	If @error Then
		LogMsg("Keine Dateien gefunden für " & $logPrefix & " (Fehler " & @error & ")")
		Return ""
	EndIf

	While 1
		Local $aFileDetails = _FTP_FindFileNext($handle)
		If @error Then ExitLoop

		Local $fileName = $aFileDetails[10]
		LogMsg("Gefundene Datei: " & $fileName)

		If StringInStr($fileName, $logPrefix & "_") > 0 Then
			Local $timestamp = StringMid($fileName, StringLen($logPrefix) + 2, 14)
			LogMsg("Extrahierter Timestamp: " & $timestamp)

			If StringIsDigit($timestamp) Then
				Local $fileTimestamp = Number($timestamp)
				If $fileTimestamp > $latestTimestamp Then
					LogMsg("Neue aktuellste Datei erkannt: " & $fileName)
					$latestTimestamp = $fileTimestamp
					$latestFile = $fileName
				EndIf
			Else
				LogMsg("Ungültiger Timestamp in Datei: " & $fileName)
			EndIf
		EndIf
	WEnd

	_FTP_FindFileClose($handle)

	If $latestFile <> "" Then
		LogMsg("Letzte Datei für Typ '" & $logPrefix & "': " & $latestFile)
		Return $remoteDirectory & $latestFile
	Else
		Return ""
	EndIf
EndFunc   ;==>GameServer_GetLatestLogByType

; + Simple Debug
Func LogMsg($msg)
	Local $timestamp = "[" & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & "]"
	Local $logLine = $timestamp & " [LOG] " & $msg & @CRLF
	ConsoleWrite($logLine)
	FileWriteLine("download.txt", $logLine)
EndFunc   ;==>LogMsg

; + Automatischer reconnect wenn Verbindungsfehler auftritt
Func GameServer_EnsureFTPConnection()
	If $ftpConn = "" Then
		LogMsg("Erneuter Verbindungsaufbau zum FTP...")
		$ftpConn = GameServer_InitializeFTPConnection($ftpServer, $ftpUsername, $ftpPassword)
		If $ftpConn = "" Then
			LogMsg("FEHLER: Verbindungsaufbau gescheitert.")
			Return ""
		EndIf
	EndIf
	Return True
EndFunc   ;==>GameServer_EnsureFTPConnection

; + Verbindung herstellen mit dem FTP Server
Func GameServer_InitializeFTPConnection($server, $user, $pass)
	LogMsg("Initialisiere FTP-Verbindung zu " & $server)
	Local $conn = _FTP_Open("FTPConn")
	Local $session = _FTP_Connect($conn, $server, $user, $pass, 1, $ftpPort, 1)
	If @error Then
		LogMsg("FEHLER bei _FTP_Connect: " & @error)
		Return ""
	EndIf
	Return $session
EndFunc   ;==>GameServer_InitializeFTPConnection