Что нового

Пре-лаунчер

Myp21

Безысходность
Сообщения
8
Репутация
0
Доброго времени суток.
Версия AutoIt: 3.3.8.0
Описание:
1. Есть один конфиг (Launcher.ini). Например, если скрипт лежит в папке Game, то путь к конфигу Game/Launcher/Launcher.ini.
2. В конфиге есть одна строка (PatchNum), которую нужно сравнивать со строкой из такого же конфига на сервере (site.com/launcher/Launcher.ini).
Выглядит следующим образом:
[Launcher]
PatchNum = 7
(где 7 это номер патча), т.е. если это число меньше актуального, то нужно скачать актуальный конфиг и заменить старый, а если равно, то ничего не делать.
3. После проверки нужно запустить лаунчер (launcher.exe), который находится в том же каталоге, что и скрипт, а потом закрыть скрипт.
При этом никакого визуального отображения скрипта не нужно.
Вот вроде бы и всё.
Буду очень благодарен, если найдется душа, которая подскажет мне, как это реализовать)

Примечания: Нету
 

Examp

Новичок
Сообщения
7
Репутация
3
Myp21
  • Июль 29, 2013, 12:14 - Скрипт полностью переписан. Теперь работает.
  • Июль 29, 2013, 13:40 - Добавил функцию InetClose т. к. "Дескрипторы InetGet() должны быть закрыты, иначе это может привести к утечке ресурсов."

Код:
$Path1 = @ScriptDir & "\Launcher"
$Path2 = "http://autoit-script.ru/autoit_rv_ua/files/Other/launcher.ini"

$InetGet1 = InetGet($Path2, $Path1 & "\launcher2.ini", 1+2)

If $InetGet1 = 0 Then
   Switch MsgBox(21, "Пре-лаунчер", "Произошла ошибка при загрузке" & @CRLF & $Path2)
      Case 4
         InetClose($InetGet1)
         _Restart()
      Case 2
         InetClose($InetGet1)
         Exit
   EndSwitch
EndIf

$Config1 = IniRead($Path1 & "\launcher.ini", "Launcher", "PatchNum", "")
$Config2 = IniRead($Path1 & "\launcher2.ini", "Launcher", "PatchNum", "")

If $Config1 < $Config2 Then
   _FO_FileDirReName($Path1 & "\launcher2.ini", "launcher.ini", 1, 1, 0)
   InetClose($InetGet1)
   Run(@ScriptDir & "\launcher.exe")
EndIf


Func _FO_FileDirReName($sSource, $sNewName, $iFlag = 0, $DelAttrib = 0, $iDir = -1)
    Local $i, $n, $sName, $sPath, $sTmpPath
    If Not $sNewName Then Return SetError(2, 0, 0)
    If StringRegExp($sNewName, '[\\/:*?"<>|]') Then Return SetError(5, 0, 0) ; (???) Индикатором служит FileMove/DirMove, но если отключить то FileMove будет поддерживать маски
    If Not FileExists($sSource) Then Return SetError(3, 0, 0)
    $n = StringInStr($sSource, '\', 0, -1)
    $sPath = StringLeft($sSource, $n)
    $sName = StringTrimLeft($sSource, $n)
    If $iDir = -1 Then $iDir = StringInStr(FileGetAttrib($sSource), 'D')
    $n = 0
    If $sName = $sNewName Then
        If $sName == $sNewName Then Return SetError(4, 0, 0)

        $i = 0
        Do
            $i += 1
            $sTmpPath = $sPath & '$#@_' & $i & '.tmp'
        Until Not FileExists($sTmpPath)

        If $iDir Then
            If DirMove($sSource, $sTmpPath) Then $n = DirMove($sTmpPath, $sPath & $sNewName)
        Else
            If FileMove($sSource, $sTmpPath) Then $n = FileMove($sTmpPath, $sPath & $sNewName)
        EndIf
    Else
        If $iDir Then
            If FileExists($sPath & $sNewName) Then
                If $iFlag Then
                    If $DelAttrib Then FileSetAttrib($sPath & $sNewName, "-RST", 1)
                    If StringInStr(FileGetAttrib($sPath & $sNewName), 'D') Then
                        If DirRemove($sPath & $sNewName, 1) Then $n = DirMove($sSource, $sPath & $sNewName)
                    Else
                        If FileDelete($sPath & $sNewName) Then $n = DirMove($sSource, $sPath & $sNewName)
                    EndIf
                EndIf
            Else
                $n = DirMove($sSource, $sPath & $sNewName)
            EndIf
        Else
            If FileExists($sPath & $sNewName) Then
                If $iFlag Then
                    If $DelAttrib Then FileSetAttrib($sPath & $sNewName, "-RST", 1)
                    If StringInStr(FileGetAttrib($sPath & $sNewName), 'D') Then
                        If DirRemove($sPath & $sNewName, 1) Then $n = FileMove($sSource, $sPath & $sNewName)
                    Else
                        $n = FileMove($sSource, $sPath & $sNewName, $iFlag)
                    EndIf
                EndIf
            Else
                $n = FileMove($sSource, $sPath & $sNewName)
            EndIf
        EndIf
    EndIf
    SetError(Not $n, 0, $n)
EndFunc   ;==>_FO_FileDirReName

; http://autoit-script.ru/index.php/topic,309.msg2812.html#msg2812
; CreatoR
Func _Restart()
    Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
    Local $sRunLine, $sScript_Content, $hFile

    $sRunLine = @ScriptFullPath
    If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
    If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw

    $sScript_Content &= '#NoTrayIcon' & @CRLF & _
            'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
            '   Sleep(10)' & @CRLF & _
            'WEnd' & @CRLF & _
            'Run("' & $sRunLine & '")' & @CRLF & _
            'FileDelete(@ScriptFullPath)' & @CRLF

    $hFile = FileOpen($sAutoIt_File, 2)
    FileWrite($hFile, $sScript_Content)
    FileClose($hFile)

    Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
    Sleep(1000)
    Exit
EndFunc
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
Global $_sPath1 = @ScriptDir & 'Game\Launcher\Launcher.ini'
Global $_sPath2 = @TempDir & 'Launcher.ini'

Global $_iValue1 = IniRead( $_sPath1, 'SECTION', 'PatchNum', 0 )
;Global $_aValue1 = StringRegExp( FileRead( $_sPath1 ), '^PatchNum=([0-9]+)$', 3 )
;Global $_iValue1 = $_aValue[0]

InetGet( 'site.com/launcher/Launcher.ini', $_sPath2, 2 )
If @Error Then 
    MsgBox( 64, '', 'Не удалось загрузить конфиг с сервера' )
    Exit
EndIf

Global $_iValue2 = IniRead( $_sPath2, 'SECTION', 'PatchNum', 0 )
;Global $_aValue2 = StringRegExp( FileRead( $_sPath2 ), '^PatchNum=([0-9]+)$', 3 )
;Global $_iValue2 = $_aValue[0]

If Int($_iValue1 ) < Int($_iValue2) Then _
    FileCopy( $_sPath2, $_sPath1, 1)

FileDelete( $_sPath2 )

Run( @ScriptDir & '\launcher.exe' )
 
Автор
Myp21

Myp21

Безысходность
Сообщения
8
Репутация
0
Эм... Первый вариант не подает никаких признаков жизни, а второй постоянно кричит, что не удалось загрузить конфиг. :(
А можно сделать так, чтобы проверка шла такая (примерно):
Скрипт запоминает значение строки PatchNum (в группе [Launcher]) в локальном конфиге (@ScriptDir & "\Launcher\Launcher.ini"), потом сравнивает со значением строки PatchNum серверного конфига ("http://site.com/launcher/Launcher.ini"), и, если локальное значение меньше, то он идет в файл "http://site.com/launcher/patchinfo.txt" (если .txt нельзя, то .ini) и ищет группу [patch_x], где x - это значение локального конфига, а потом считывает значение из строки from и записывает его в локальный конфиг, в строку (в той же группе [Launcher]) LocalGame (например, LocalGame = 1.0.0.0 на LocalGame = 1.0.2.0), ну и в конце запускает сам лаунчер.
Версия без скачивания.
 

Examp

Новичок
Сообщения
7
Репутация
3
Извиняюсь за многочисленные ошибки в моем скрипте. Исправляю.
OffTopic:
http://autoit-script.ru/autoit_rv_ua/files/Other/launcher.ini



Добавлено:
Сообщение автоматически объединено:

Myp21
Скрипт полностью переписан. Теперь работает. См. ответ #1.
 
Автор
Myp21

Myp21

Безысходность
Сообщения
8
Репутация
0
Examp, Благодарю, всё прекрасно работает. Хотелось бы версию без скачивания реализовать, чтобы обновление было полностью автономным, а то у людей разные версии могут быть. Извините, если слишком многого прошу.

MnM, Я прекрасно вижу, что там за ссылка, я все ссылки и пути менял на свои, так что проблема, должно быть, в скрипте.
 

Examp

Новичок
Сообщения
7
Репутация
3
У firex в скрипте ссылка указана неверно. Забыл - "http://".
 
Автор
Myp21

Myp21

Безысходность
Сообщения
8
Репутация
0
Examp
Я ставил там полную ссылку, вместе с http://
 

Examp

Новичок
Сообщения
7
Репутация
3
Значит все из за макроса @error.

Myp21, изменения в скрипте. См. ответ #1.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Examp [?]
Дескрипторы InetGet() должны быть закрыты, иначе это может привести к утечке ресурсов.
После завершения работы AutoIt все свои дескрипторы автоматически закрывает. Это лишнее.

В моем скрипте указана не верно ссылка, да и макрос @Error можно(скорее нужно) удалить.
Я думал вы сами догадаетесь про первое.
 

Examp

Новичок
Сообщения
7
Репутация
3
Myp21 [?]
А можно сделать так

Код:
$Path1 = @ScriptDir & "\Launcher"
$Path2 = "http://site.com/launcher/Launcher.ini"
$Path3 = "http://site.com/launcher/patchinfo.txt"

$InetGet1 = InetGet($Path2, $Path1 & "\Launcher2.ini", 1+2)

If $InetGet1 = 0 Then
   Switch MsgBox(21, "Пре-лаунчер", "Произошла ошибка при загрузке" & @CRLF & $Path2)
      Case 4
         _Restart()
      Case 2
         Exit
   EndSwitch
EndIf

$Config1 = IniRead($Path1 & "\Launcher.ini", "Launcher", "PatchNum", "")
$Config2 = IniRead($Path1 & "\Launcher2.ini", "Launcher", "PatchNum", "")

If $Config1 < $Config2 Then
   $InetGet2 = InetGet($Path3, $Path1 & "\patchinfo.txt", 1+2)
   
   If $InetGet2 = 0 Then
      Switch MsgBox(21, "Пре-лаунчер", "Произошла ошибка при загрузке" & @CRLF & $Path3)
         Case 4
            _Restart()
         Case 2
            Exit
      EndSwitch
   EndIf
   
   $Config3 = IniRead($Path1 & "\patchinfo.txt", "patch_" & $Config1, "from", "")
   IniWrite($Path1 & "\Launcher.ini", "Launcher", "LocalGame", $Config3)
   
   ;_FO_FileDirReName($Path1 & "\Launcher2.ini", "Launcher.ini", 1, 1, 0)
   Run(@ScriptDir & "\launcher.exe")
EndIf


Func _FO_FileDirReName($sSource, $sNewName, $iFlag = 0, $DelAttrib = 0, $iDir = -1)
    Local $i, $n, $sName, $sPath, $sTmpPath
    If Not $sNewName Then Return SetError(2, 0, 0)
    If StringRegExp($sNewName, '[\\/:*?"<>|]') Then Return SetError(5, 0, 0) ; (???) Индикатором служит FileMove/DirMove, но если отключить то FileMove будет поддерживать маски
    If Not FileExists($sSource) Then Return SetError(3, 0, 0)
    $n = StringInStr($sSource, '\', 0, -1)
    $sPath = StringLeft($sSource, $n)
    $sName = StringTrimLeft($sSource, $n)
    If $iDir = -1 Then $iDir = StringInStr(FileGetAttrib($sSource), 'D')
    $n = 0
    If $sName = $sNewName Then
        If $sName == $sNewName Then Return SetError(4, 0, 0)

        $i = 0
        Do
            $i += 1
            $sTmpPath = $sPath & '$#@_' & $i & '.tmp'
        Until Not FileExists($sTmpPath)

        If $iDir Then
            If DirMove($sSource, $sTmpPath) Then $n = DirMove($sTmpPath, $sPath & $sNewName)
        Else
            If FileMove($sSource, $sTmpPath) Then $n = FileMove($sTmpPath, $sPath & $sNewName)
        EndIf
    Else
        If $iDir Then
            If FileExists($sPath & $sNewName) Then
                If $iFlag Then
                    If $DelAttrib Then FileSetAttrib($sPath & $sNewName, "-RST", 1)
                    If StringInStr(FileGetAttrib($sPath & $sNewName), 'D') Then
                        If DirRemove($sPath & $sNewName, 1) Then $n = DirMove($sSource, $sPath & $sNewName)
                    Else
                        If FileDelete($sPath & $sNewName) Then $n = DirMove($sSource, $sPath & $sNewName)
                    EndIf
                EndIf
            Else
                $n = DirMove($sSource, $sPath & $sNewName)
            EndIf
        Else
            If FileExists($sPath & $sNewName) Then
                If $iFlag Then
                    If $DelAttrib Then FileSetAttrib($sPath & $sNewName, "-RST", 1)
                    If StringInStr(FileGetAttrib($sPath & $sNewName), 'D') Then
                        If DirRemove($sPath & $sNewName, 1) Then $n = FileMove($sSource, $sPath & $sNewName)
                    Else
                        $n = FileMove($sSource, $sPath & $sNewName, $iFlag)
                    EndIf
                EndIf
            Else
                $n = FileMove($sSource, $sPath & $sNewName)
            EndIf
        EndIf
    EndIf
    SetError(Not $n, 0, $n)
EndFunc   ;==>_FO_FileDirReName

; http://autoit-script.ru/index.php/topic,309.msg2812.html#msg2812
; CreatoR
Func _Restart()
    Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
    Local $sRunLine, $sScript_Content, $hFile

    $sRunLine = @ScriptFullPath
    If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
    If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw

    $sScript_Content &= '#NoTrayIcon' & @CRLF & _
            'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
            '   Sleep(10)' & @CRLF & _
            'WEnd' & @CRLF & _
            'Run("' & $sRunLine & '")' & @CRLF & _
            'FileDelete(@ScriptFullPath)' & @CRLF

    $hFile = FileOpen($sAutoIt_File, 2)
    FileWrite($hFile, $sScript_Content)
    FileClose($hFile)

    Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
    Sleep(1000)
    Exit
EndFunc
 
Автор
Myp21

Myp21

Безысходность
Сообщения
8
Репутация
0
Examp
Спасибо огромное, а какие строки добавить в код, чтобы скачанные файлы потом удалялись?
 
Автор
Myp21

Myp21

Безысходность
Сообщения
8
Репутация
0
Ещё раз добрый вечер.
Не знаю почему, но вчера скрипт вдруг перестал работать...
Скрипт не менял, ссылок не менял, да и вообще всё осталось так, как при рабочем скрипте.
Он запускается, запускает лаунчер, но версию не меняет, и, вроде как, даже не загружает конфиги, тем самым не читая их.
Может вы знаете в чем проблема?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Может быть на сервере или где там хранится файл, не меняется версия?
 
Верх