Launcher. | Ein Problem.

  • Hallo DaisukeHideki,

    dein Skript ist ja noch sehr ausbauhähig. Spass bei Seite, etwas mehr Infos könnten nicht schaden.
    Sind FTP-Fnktionen möglich/nötig?
    Oder klappt es schon über INetGet.

    Bin aber kein MineCraft-Spieler. Das einfachste dürfte sein du hinterlegst eine INI auf dem Server mit den Versionsinformatinonen, der Launcher lädt es sich herunter vergleicht mit seiner INI und downloaded den Unterschied, danach updatet er seine INI so dass (ausser beim1.mal) immer nur dass nötigste herntergeladen wird.

    [Werbung]Eine Funktion zum Downloaden habe ich ihn meinen NeMP3 (MP3-Player) eingebaut, Link siehe Signatur. Ich benutze daür dieses Board. Das gleiche Schema habe ich auch bei meinem YT-Downloader der aber zur Zeit nicht funktioniert und auch nur als EXE eingestellt ist.[/Werbung]

    mfg autoBert

  • Hallo autoBert.

    Ob FTP oder HTTP ist im moment eigentlich irrelevant, da ich keinen großen Unterschied zwischen beiden Sachen, außer der Sicherheit, sehe.

    Aus einer INI würde ich es nur ungern lesen lassen, da so jeder sehen könnte was neu bzw. verändert wurde und somit eventuelle Sicherheitslücken lesen kann.
    Lieber wäre es mir, wenn ich mit einem PHP Script die neuen Dateien als z.B. eine Liste in einer Textdatei mit Verschlüsselung erstelle,
    so dass nur der Launcher sie entschlüsseln kann, wenn dies mit AutoIt überhaupt möglich ist.

    Ich schaue mir demnächst mal deine NeMP3 an.

    Danke schonmal für deine Hilfe.

  • Hallo DaisukeHideki,

    zum Thema Sicherheit beim Downloaden könnte [Tutorial] Login + Registrierung über eine MySql-DB [+ Hilfedateien] von @Jautois interssant für dich sein. In deinem Fall ist die Absicherung des Servers bzw. des darin befindlichen Downloadbereichs wichtiger, der eigentliche Download über ein AutoItscript ist dagegen ein Kinderspiel. Hoffe für dich dass sich Jautois, I2C oder Blume auch noch dazu melden (damit zweifle ich nicht die Kompetenz anderer an, also bitte trotzdem posten)

    mfg autoBert

  • Mein Server ist abgesichert, Debian 5.0.3.
    Ich besitze meinen eigenen Server, daher benötige ich keinen Server bei Funpic o.Ä.
    Eine Login und Registrierungform benötige ich ebenfalls nicht, da die Spieler lediglich ihren Namen angeben brauchen, momentan.

    Wie könnte ich den Launcher am besten schreiben, so dass er beim Start und beim "Auf Updates prüfen" auf Updates prüft und diese downloaded.
    Falls es relevant ist, der URL wäre folgender http://46.4.146.40/minecraft/updates.

    ~EDIT~

    Ich habe es soweit ich kann versucht, aber ich komme nicht weiter.

    Spoiler anzeigen
    [autoit]

    Case $GUI_UPDATE
    InetGet ( "http://46.4.146.40/minecraft/updates/update.ini", "update.ini")

    [/autoit]

    Ich habe mich noch nie mit InetGet befasst.

    2 Mal editiert, zuletzt von Kazuto (23. Februar 2011 um 20:24)

  • Kann mir keiner weiterhelfen?

    *EDIT*

    Ich sollte auch beschreiben, wo ich nicht weiter komme *facepalm*.
    Er läd die INI runter, jedoch weiß ich nicht wie er die INI's miteinander vergleicht und dann ggf. die Dateien zu erneuern.

    Zudem würde ich gerne machen, dass der Download in der Update-Bar angezeigt wird.

    Einmal editiert, zuletzt von Kazuto (26. Februar 2011 um 01:07)

  • [autoit]

    InetGet ( "http://46.4.146.40/minecraft/updates/update.ini", "update.ini")

    [/autoit]


    Der Speicherpfad sollte durch @ScriptDir angepasst werden, das dient der Fehlervermeidung.
    Der Download funktioniert bei mir, jetzt solltest du daran gehen die Ini-Datei auszulesen. Diese ist aber leider falsch struckturiert, sieh dir am besten mal

    [autoit]

    IniRead

    [/autoit]

    in der Hilfe an!

  • Die INI ist richtig strukturiert.
    Er downloaded diese nur falsch.

    So ist sie aufgebaut:

    Code
    [Update]
    Version=2.1


    gedownloaded wird sie aber so:

    Code
    [Update]Version=2.1

    B2T:
    IniRead kenne ich, jedoch weiß ich nicht, wie ich in der INI die Informationen angeben soll, welche zum download der Dateien führen.

  • Hallo DaisukeHideki,

    das könnte z.B.: so auussehen:

    Spoiler anzeigen
    [autoit]

    $ServerINI = @ScriptDir & "\Serverupdate.ini", "Update"
    $VersionLocal = IniRead(@ScriptDir & "\MCupdate.ini", "Update", "0.0")
    InetGet("http://46.4.146.40/minecraft/updates/update.ini", $ServerINI, 1, 0)
    $VersionServer = IniRead = IniRead($ServerINI), "0.0")
    If $VersionLocal <> $VersionServer Then ;wenn die Versionen nicht übereinstimmen dann
    $aFiles = IniReadSection($ServerINI, "Files")
    $bAllOk = True
    For $i = 1 To $aFiles[0][0]
    if not _download($aFiles[$i][0],$aFiles[$i][1]) then
    ;Fehler beim Download
    $bAllOk =False
    ExitLoop
    EndIf
    Next
    EndIf
    if $bAllOk Then FileCopy($ServerINI,@ScriptDir & "\MCupdate.ini",1) ;wenn alles erledigt wird ServerIni zur lokalen Ini

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

    Func _DownloadFile($sDownloadLink, $sLocalPath, $iSize, $iItem)
    Local $hDL = InetGet($sDownloadLink, $sLocalPath, 1, 1), $aDL_Info, $tStart, $iPercent
    $tStart = TimerInit()
    Do
    Sleep(250)
    $aDL_Info = InetGetInfo($hDL)
    ;hier die Infos des Arrays $aDL_Info auswerten
    ;z.B. in Labels auf Gui oder als TrayTipp oder in ProgressOn anzeigen
    Until $aDL_Info[2]
    Return $aDL_Info[3]
    EndFunc ;==>_DownloadFile

    [/autoit]
    Code
    [Update]
    Version=2.1
    [Files]
    autoit-v3-setup.exe=http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe
    autoit-v3.3.5.6-beta-setup.exe2=http://www.autoitscript.com/autoit3/files/beta/autoit/autoit-v3.3.5.6-beta-setup.exe2

    mfg autoBert

  • Danke autoBert für dein Beispiel.

    Ich werde versuchen das Beispiel zu verstehen :3

    Eines ist mir schon aufgefallen, _download ist eine undefinierte Funktion xD
    Jedoch verstehe ich folgende Variablen nicht, bzw. ich weiß nicht wie ich diese deklarieren soll.
    $sDownloadLink, $sLocalPath, $iSize, $iItem, $hDL, $tStart

    Ansonsten verstehe ich den gesamten Script.

  • Hallo DaisukeHideki,

    sorry muss _DownlodFile heissen. Hier das komplette Skript

    Spoiler anzeigen
    [autoit]

    ;#include <array.au3>
    #Include <Date.au3>

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

    Global $tStart, $tDiff, $iToDo, $iRTime, $sMSG, $iSize, $nKBPerSec

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

    $ServerINI = @ScriptDir & "\Serverupdate.ini"
    $VersionLocal = IniRead(@ScriptDir & "\MCupdate.ini", "Update", "Version", "0.0")
    ;InetGet("http://46.4.146.40/minecraft/updates/update.ini", $ServerINI, 1, 0)
    $VersionServer = IniRead($ServerINI, "Update", "Version", "0.0")
    If $VersionLocal <> $VersionServer Then ;wenn die Versionen nicht übereinstimmen dann
    $aFiles = IniReadSection($ServerINI, "Files")
    ;_ArrayDisplay($aFiles)
    $bAllOk = True
    For $i = 1 To $aFiles[0][0]
    $tStart = TimerInit()
    ConsoleWrite($aFiles[$i][1] & @CRLF)
    If Not _DownloadFile($aFiles[$i][1], $aFiles[$i][0]) Then
    Beep(800, 1000) ;Fehler beim Download
    $bAllOk = False
    ExitLoop
    EndIf
    Next
    EndIf
    If $bAllOk Then FileCopy($ServerINI, @ScriptDir & "\MCupdate.ini", 1) ;wenn alles erledigt wird ServerIni zur lokalen Ini

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

    Func _DownloadFile($sDownloadLink, $sLocalPath)
    Local $hDL = InetGet($sDownloadLink, $sLocalPath, 1, 1)
    $iSize = InetGetSize($sDownloadLink)
    Do
    Sleep(250)
    $aDL_Info = InetGetInfo($hDL)
    If $aDL_Info[0] > 0 Then
    _CalcPerformance($aDL_Info[0], $aDL_Info[2])
    TrayTip("downloading => " & $sLocalPath, $sMSG, 10, 16)
    EndIf
    Until $aDL_Info[2]
    Return $aDL_Info[3]
    EndFunc ;==>_DownloadFile

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

    Func _CalcPerformance($iRead, $bDone)
    $tDiff = TimerDiff($tStart)
    $iToDo = Round(($iSize - $iRead) / 1024, 2)
    $nKBPerSec = Round($iRead / $tDiff * 1000 / 1024, 2)
    $iPercent = Round($iRead / $iSize * 100, 2)
    if ($iSize = 0) And Not $bDone Then
    $iRTime = "unbekannt"
    Else
    $iRTime = Round($iToDo / $nKBPerSec, 0)
    EndIf
    $sMSG = Round($iRead / 1024, 0) & "/" & Round($iSize / 1024, 0) & " KB " & " = " & $iPercent & "%" & @CRLF
    $sMSG &= "durchschnittlich KB/s = " & $nKBPerSec & @CRLF ;& "aktuell: KB/s " & $nKBAct & @CRLF
    If Not $bDone Then
    $sMSG = $sMSG & "vermutlich zu Ende:" & StringLeft(StringRight(_DateAdd('s', $iRTime, _NowCalc()), 8), 5)
    ;ConsoleWrite($sMSG & @CRLF)
    Else
    $sMSG = $sMSG & "benötigte Zeit = " & Round($tDiff / 1000, 0)
    EndIf
    ;if $iSize > 0 Then $sMSG = $sMSG & " sec"
    EndFunc ;==>_CalcPerformance

    [/autoit]

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (26. Februar 2011 um 02:33)

  • Danke autoBert, aber eine solche Funktion ist mir momentan zu kompliziert.
    Ich habe gedacht, es wäre simpler eine solche Funktion zu schreiben/gestalten.

    Ich werde es wohl simpler machen und einfach eine aktualisierte Setup Exe auf meinem Webhost laden, die gedownloaded werden muss.

    Das einzige was ich jetzt noch brauche ist eine Versionsabfrage die sagt dass ein Update verfügbar ist und den Clienten ohne Update nicht starten lässt.

    Ich denke, dies sollte ich alleine hinbekommen, dank eurer Hilfe.
    Falls nicht, melde ich mich nochmal zu Wort.

  • Versionsabfrage dürfte kein Problem sein - speicher in deinem Script die Version in einer Variablen, und prüfe nach dem Download der Ini, ob die Version in der Ini gleich bzw. ungleich mit der Zahl ist, die im Script gespeichert ist. Danach kannst du dann den Download einsetzen.

  • Staywayknight, die Versionsabfrage habe ich soweit fertig.

    Quellcode:
    http://pastebin.com/2JvFXrQx

    INI:
    http://pastebin.com/fRbmKhbU

    Jedoch wird, nach der überprüfung und des schreibens die INI so gespeichert:

    Code
    [Update]Version=2.1[Client]Client=http://46.4.146.40/minecraft/test.au3

    Daher kann der Download der Datei nicht gestartet werden.
    Die test.au3 ist lediglich eine Test Datei.
    Da diese kaum Inhalt erhält und somit direkt fertig heruntergeladen sein sollte.

    Einmal editiert, zuletzt von Kazuto (26. Februar 2011 um 14:41)

  • Danke, Stayawayknight für deine Hilfe über ICQ.

    Es funktioniert nun komplett, lediglich 2 kleine Macken hat mein Script.

    Die ProgressBar füllt sich nur bis zur Hälfte und der Text, der beim Download eingeblendet wird, blinkt.

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #Region
    #AutoIt3Wrapper_Icon=Icon.ico
    #AutoIt3Wrapper_Outfile=Launcher.exe
    #EndRegion
    ; ================================;
    ; Minecraft Launcher
    ; Made by Kazu
    ; © 2011 Kingdom Sieger Networks
    ; ================================;

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

    ;====Includes====;
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    ;=====FileInstall=====;
    FileInstall("logo.jpg", "logo.jpg")
    FileInstall("localversion.ini", "localversion.ini")

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

    ;====GUI====;
    $GUI = GUICreate("Legendary-Network.eu Minecraft", 415, 186, 262, 208)
    $GUI_OPT = GUICtrlCreateMenu("&Optionen")
    $GUI_NAME = GUICtrlCreateMenuItem("Name bearbeiten", $GUI_OPT)
    $GUI_HP = GUICtrlCreateMenuItem("Homepage", $GUI_OPT)
    $GUI_EXI = GUICtrlCreateMenuItem("Beenden", $GUI_OPT)
    $GUI_UPDATE = GUICtrlCreateButton("Auf Updates prüfen", 8, 88, 125, 33, $WS_GROUP)
    $GUI_START = GUICtrlCreateButton("Spiel starten", 144, 88, 125, 33, $WS_GROUP)
    $GUI_EXIT = GUICtrlCreateButton("Beenden", 280, 88, 125, 33, $WS_GROUP)
    $GUI_UPD_BAR = GUICtrlCreateProgress(8, 128, 395, 13)
    $GUI_IMG = GUICtrlCreatePic(@ScriptDir & "\logo.jpg", 16, 8, 390, 80, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $GUI_LAB = GUICtrlCreateLabel("", 8, 148, 395, 17)
    GUISetState(@SW_SHOW)

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

    ;====Funktionen====;
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EXIT
    Exit
    Case $GUI_EXI
    Exit
    Case $GUI_NAME
    ShellExecute("namechanger.exe", "/noSound", @AppDataDir & "\.minecraft\bin\")
    Case $GUI_HP
    ShellExecute("http://46.4.146.40/minecraft/index.html")
    Case $GUI_UPDATE
    _updatecheck()
    Case $GUI_START
    ShellExecute("Minecraft.exe", "", @AppDataDir & "\.minecraft\")
    If Not @error Then Exit
    EndSwitch
    WEnd

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

    ;===Funktionen===;
    Func _updatecheck()
    $ServerINI = @ScriptDir & "\serverversion.ini"
    $LocalINI = @ScriptDir & "\localversion.ini"
    $sString = BinaryToString(InetRead('http://46.4.146.40/minecraft/updates/serverversion.ini'))
    $hFile = FileOpen($ServerINI, 2)
    FileWrite($hFile, $sString)
    FileClose($hFile)
    $Ini1 = IniRead($ServerINI, "Update", "Version", "")
    $Ini2 = IniRead($LocalINI, "Update", "Version", "")
    $url = IniRead($ServerINI, "File", "Client", "")
    $name = IniRead ($ServerINI, "File", "Name", "")
    $size = InetGetSize ($url & $name)
    If $Ini1 <> $Ini2 Then
    $iMsgBoxAnswer = MsgBox(52, "Aktualisierung gefunden!", "Es wurde eine Aktualisierung gefunden." & @CRLF & "Möchten Sie diese herunterladen?")
    Select
    Case $iMsgBoxAnswer = 6
    $download = InetGet($url & $name, $name, 1,1)
    do
    $info = InetGetInfo($download, 0)
    $percent = (100 / $size) * $info
    GUICtrlSetData ($GUI_UPD_BAR, Round(($info / 1024) / 1024, 1) & "/" & Round(($size / 1024) / 1024, 1))
    GUICtrlSetData ($GUI_LAB, "Geladen:" & Round(($info / 1024) / 1024, 1) & "/" & Round(($size / 1024) / 1024, 1) & "MB")
    until $percent >= 100
    MsgBox (0, "Erfolgreich", "Download erfolgreich")
    If Not @error Then IniWrite($LocalINI, "Update", "Version", $Ini1)
    Case $iMsgBoxAnswer = 7
    Exit
    EndSelect
    EndIf
    EndFunc ;==>_updatecheck

    [/autoit]

    Mein Quelltext.

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #Region
    #AutoIt3Wrapper_Icon=Icon.ico
    #AutoIt3Wrapper_Outfile=Launcher.exe
    #EndRegion
    ; ================================;
    ; Minecraft Launcher
    ; Made by Kazu
    ; © 2011 Kingdom Sieger Networks
    ; ================================;

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

    ;====Includes====;
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    ;=====FileInstall=====;
    FileInstall("logo.jpg", "logo.jpg")
    FileInstall("localversion.ini", "localversion.ini")

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

    ;====GUI====;
    $GUI = GUICreate("Legendary-Network.eu Minecraft", 415, 186, 262, 208)
    $GUI_OPT = GUICtrlCreateMenu("&Optionen")
    $GUI_NAME = GUICtrlCreateMenuItem("Name bearbeiten", $GUI_OPT)
    $GUI_HP = GUICtrlCreateMenuItem("Homepage", $GUI_OPT)
    $GUI_EXI = GUICtrlCreateMenuItem("Beenden", $GUI_OPT)
    $GUI_UPDATE = GUICtrlCreateButton("Auf Updates prüfen", 8, 88, 125, 33, $WS_GROUP)
    $GUI_START = GUICtrlCreateButton("Spiel starten", 144, 88, 125, 33, $WS_GROUP)
    $GUI_EXIT = GUICtrlCreateButton("Beenden", 280, 88, 125, 33, $WS_GROUP)
    $GUI_UPD_BAR = GUICtrlCreateProgress(8, 128, 395, 13)
    $GUI_IMG = GUICtrlCreatePic(@ScriptDir & "\logo.jpg", 16, 8, 390, 80, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $GUI_LAB = GUICtrlCreateLabel("", 8, 148, 395, 17)
    GUISetState(@SW_SHOW)

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

    ;====Funktionen====;
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EXIT
    Exit
    Case $GUI_EXI
    Exit
    Case $GUI_NAME
    ShellExecute("namechanger.exe", "/noSound", @AppDataDir & "\.minecraft\bin\")
    Case $GUI_HP
    ShellExecute("http://46.4.146.40/minecraft/index.html")
    Case $GUI_UPDATE
    _updatecheck()
    Case $GUI_START
    ShellExecute("Minecraft.exe", "", @AppDataDir & "\.minecraft\")
    If Not @error Then Exit
    EndSwitch
    WEnd

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

    ;===Funktionen===;
    Func _updatecheck()
    $ServerINI = @ScriptDir & "\serverversion.ini"
    $LocalINI = @ScriptDir & "\localversion.ini"
    $sString = BinaryToString(InetRead('http://46.4.146.40/minecraft/updates/serverversion.ini'))
    $hFile = FileOpen($ServerINI, 2)
    FileWrite($hFile, $sString)
    FileClose($hFile)
    $Ini1 = IniRead($ServerINI, "Update", "Version", "")
    $Ini2 = IniRead($LocalINI, "Update", "Version", "")
    $url = IniRead($ServerINI, "File", "Client", "")
    $name = IniRead ($ServerINI, "File", "Name", "")
    $size = InetGetSize ($url & $name)
    If $Ini1 <> $Ini2 Then
    $iMsgBoxAnswer = MsgBox(52, "Aktualisierung gefunden!", "Es wurde eine Aktualisierung gefunden." & @CRLF & "Möchten Sie diese herunterladen?")
    Select
    Case $iMsgBoxAnswer = 6
    $download = InetGet($url & $name, $name, 1,1)
    do
    $info = InetGetInfo($download, 0)
    $percent = (100 / $size) * $info
    GUICtrlSetData ($GUI_UPD_BAR,$percent)
    $Old = GUICtrlRead($GUI_LAB)
    $New = "Geladen:" & Round(($info / 1024) / 1024, 1) & "/" & Round(($size / 1024) / 1024, 1) & "MB"
    If $old <> $New Then GUICtrlSetData ($GUI_LAB, $New)
    until $percent >= 100
    MsgBox (0, "Erfolgreich", "Download erfolgreich")
    If Not @error Then IniWrite($LocalINI, "Update", "Version", $Ini1)
    Case $iMsgBoxAnswer = 7
    Exit
    EndSelect
    EndIf
    EndFunc ;==>_updatecheck

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

    Func _status()

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

    EndFunc

    [/autoit]
  • so sollten diese beiden Macken behoben sein. Schau dir aber noch einmal

    [autoit]

    InetGetinfo;2 und 3

    [/autoit]

    an, denn wenn eine INet-Störung ist kommst du so nie aus der Schleife,

    mfg autoBert