Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #NoTrayIcon
- ;Обновление SynWrite (портативная версия) до релиза или беты с проверкой даты/версии
- Global Const $GUI_ENABLE = 64
- Global Const $GUI_DISABLE = 128
- Global Const $SS_CENTER = 0x01
- ;Проверяем, что скрипт рядом с Syn.exe
- If Not FileExists(@ScriptDir & '\Syn.exe') Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Не найден Syn.exe!')
- Exit
- EndIf
- ;Получаем путь %Temp%
- $TEMP = EnvGet('TEMP')
- ;Ищем конфиг Syn.ini
- If FileExists(@ScriptDir & '\Settings\Syn.ini') Then
- $sConfig = @ScriptDir & '\Settings\Syn.ini'
- Else
- MsgBox(48 + 4096, 'SynWrite Update', 'Файл Syn.ini не найден')
- Exit
- EndIf
- $SearchVer = ''
- ;Получаем версию SynWrite на компе (см. комментарии в __GetLocalVersion())
- $sVerLocal = __GetLocalVersion()
- ;Читаем время предыдущего обновления скриптом (хранится в Syn.ini: секция Setup, параметр lu)
- $sLocalTime = IniRead($sConfig, 'Setup', 'lu', 0)
- If $sLocalTime = 0 Then
- $sLocalTime = "Первый запуск"
- EndIf
- ;Рисуем простенькое GUI
- GUICreate('SynWrite Update', 220, 160)
- $Description = GUICtrlCreateLabel('Текущая версия:', 10, 10, 100, 20)
- $Description2 = GUICtrlCreateLabel('Обновлено:', 10, 30, 100, 20)
- $lVerLocal = GUICtrlCreateLabel($sVerLocal, 110, 10, 105, 20)
- $lVerLocalTime = GUICtrlCreateLabel($sLocalTime, 110, 30, 105, 20)
- $Button1 = GUICtrlCreateButton('Release', 10, 65, 80, 22)
- $Button2 = GUICtrlCreateButton('Beta', 10, 95, 80, 22)
- $lVerNewBetaInfo = GUICtrlCreateLabel('(Beta = last modified SynWrite.rar)', 10, 120, 210, 17, 0x01)
- GUICtrlSetFont($lVerNewBetaInfo, 8.5, 300, 2)
- GUICtrlSetColor($lVerNewBetaInfo, 0x808080)
- $lVerCur = GUICtrlCreateLabel('', 110, 70, 105, 20)
- $lVerNewBeta = GUICtrlCreateLabel('', 110, 100, 105, 20)
- $StatusBar = GUICtrlCreateLabel('', 5, 160 - 20, 210, 17)
- GUISetState()
- While 1
- If Not $SearchVer Then __Msg() ;Запускаем функцию поиска версий
- Switch GUIGetMsg()
- Case $Button1
- GUICtrlSetState($Button1,$GUI_DISABLE)
- __DownloadUpdate(1) ;Обновляем до релиза
- Exit
- Case $Button2
- GUICtrlSetState($Button2,$GUI_DISABLE)
- __DownloadUpdate(2) ;Обновляем до текущей бета-версии
- Exit
- Case -3
- Exit
- EndSwitch
- WEnd
- Func __Msg()
- Switch MsgBox(4 + 32 + 4096, 'SynWrite Update', 'Проверить версии?')
- Case 6
- ;Определяем текущую версию релиза (см. комментарии в __GetCurrentVersion())
- $sVerCur = __GetCurrentVersion()
- ;пишем ее в GUI
- GUICtrlSetData($lVerCur, $sVerCur)
- ;Определяем версию беты (см. комментарии в __GetBetaVersion())
- $sVerNewBeta = __GetBetaVersion()
- ;пишем ее в GUI
- GUICtrlSetData($lVerNewBeta, $sVerNewBeta)
- $SearchVer = 1
- Case 7
- $SearchVer = 1
- EndSwitch
- EndFunc ;==>__Msg()
- Func __GetLocalVersion()
- Local $hFile, $sGetInfo, $sVerInfo
- ;Локальную версию на компе читаем из файла History.txt
- $hFile = FileOpen(@ScriptDir & '\Readme\History.txt', 0)
- ;Проверяет, является ли файл открытым, перед тем как использовать функции чтения/записи в файл
- If $hFile = -1 Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Невозможно открыть файл \Readme\History.txt.')
- Exit
- EndIf
- ;Читает построчно текст (строки с 5 по 15)
- $sGetInfo = ''
- For $i = 5 To 15
- $sGetInfo &= FileReadLine($hFile, $i)
- Next
- FileClose($hFile)
- ;Регулярным выражением ищем первое совпадение с цифрами, похожими на версию
- $sVerInfo = StringRegExp($sGetInfo, '[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}', 1)
- If @error Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Не найдена информация о версии')
- Return 'Не доступно'
- EndIf
- If IsArray($sVerInfo) Then
- Return $sVerInfo[0]
- Else
- Return 'Не доступно'
- EndIf
- EndFunc ;==>__GetLocalVersion()
- Func __GetCurrentVersion()
- Local $bGetInfo, $sGetInfo, $sVerInfo
- ;Версию релиза читаем из History.txt на uvviewsoft.com
- $bGetInfo = InetRead('http://www.uvviewsoft.com/synwrite/History.txt', 1 + 16)
- If @error Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Сайт www.uvviewsoft.com недоступен.')
- Return 'Не доступно'
- EndIf
- InetClose($bGetInfo)
- $sGetInfo = BinaryToString($bGetInfo)
- $sVerInfo = StringRegExp($sGetInfo, '[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}', 1)
- If @error Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Не найдена информация о версии')
- Return 'Не доступно'
- EndIf
- If IsArray($sVerInfo) Then
- Return $sVerInfo[0]
- Else
- Return 'Не доступно'
- EndIf
- EndFunc ;==>__GetCurrentVersion()
- Func __GetBetaVersion()
- Local $bGetInfo, $sGetInfo, $sVerInfo, $sVer, $iVer
- ;С бетой сложнее, поэтому сливаем страницу http://www.uvviewsoft.com/bb/ и вытаскиваем из нее дату архива SynWrite.rar
- $bGetInfo = InetRead('http://www.uvviewsoft.com/bb/', 1 + 16)
- If @error Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Сайт uvviewsoft.com недоступен.')
- Return 'Не доступно'
- EndIf
- InetClose($bGetInfo)
- $sGetInfo = BinaryToString($bGetInfo)
- $sVerInfo = StringRegExp($sGetInfo, '[0-9]{1,2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}', 1)
- If @error Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Не найдена информация о версии')
- Return 'Не доступно'
- EndIf
- If IsArray($sVerInfo) Then
- $sVer = StringRegExpReplace($sVerInfo[0], '([0-9]{1,2})-([A-Za-z]{3,4})-([0-9]{4}) ([0-9]{2}):([0-9]{2})', '\3\2\1\4\5')
- ;Приводим дату к более привычному виду yyyy-MM-dd hh:mm
- Local $aArray[13]
- $aArray[0] = '12'
- $aArray[1] = 'Jan'
- $aArray[2] = 'Feb'
- $aArray[3] = 'Mar'
- $aArray[4] = 'Apr'
- $aArray[5] = 'May'
- $aArray[6] = 'Jun'
- $aArray[7] = 'Jul'
- $aArray[8] = 'Aug'
- $aArray[9] = 'Sep'
- $aArray[10] = 'Oct'
- $aArray[11] = 'Nov'
- $aArray[12] = 'Dec'
- For $i = 1 To $aArray[0]
- $iVer = ''
- If StringLen($i) = 1 Then
- $iVer = StringReplace($sVer, $aArray[$i], '0' & $i, 0, 0)
- If @extended = 1 Then ExitLoop
- Else
- $iVer = StringReplace($sVer, $aArray[$i], $i, 0, 0)
- If @extended = 1 Then ExitLoop
- EndIf
- Next
- $sVer = StringRegExpReplace($iVer, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})', '\1-\2-\3 \4:\5')
- Return $sVer
- Else
- Return 'Не доступно'
- EndIf
- EndFunc ;==>__GetBetaVersion()
- Func __DownloadUpdate($iFlag)
- Local $dRelease, $dBeta
- ;Сливаем SynWrite.rar в %Temp%
- GUICtrlSetData($StatusBar, 'Скачивание...')
- If $iFlag = 1 Then
- $dRelease = InetGet('http://iweb.dl.sourceforge.net/project/synwrite/Release/SynWrite.rar', $TEMP & '\SynWrite.rar', 1)
- If @error Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Файл SynWrite.rar недоступен.')
- InetClose($dRelease)
- Exit
- EndIf
- InetClose($dRelease)
- ElseIf $iFlag = 2 Then
- $dBeta = InetGet('http://uvviewsoft.com/bb/SynWrite.rar', $TEMP & '\SynWrite.rar', 1)
- If @error Then
- MsgBox(48 + 4096, 'SynWrite Update', 'Файл SynWrite.rar недоступен.')
- InetClose($dBeta)
- Exit
- EndIf
- InetClose($dBeta)
- Else
- MsgBox(48 + 4096, 'SynWrite Update', 'Неверно указан флаг для функции __DownloadUpdate($iFlag)')
- EndIf
- ;Копируем UnRAR.exe в %Temp%, т.к. SynWrite.rar будет распакован с заменой всех файлов
- FileCopy(@ScriptDir & '\Tools\UnRAR.exe', $TEMP & '\UnRAR.exe')
- ;Проверяем существование процесса Syn.exe, если есть - ждем закрытия программы, после распаковываем
- If ProcessExists('Syn.exe') Then
- GUICtrlSetData($StatusBar, 'Ожидание закрытия SynWrite...')
- MsgBox(48 + 4096, 'SynWrite Update', 'SynWrite запущен!' & @CRLF & 'Сохраните файлы и закройте приложение (скрипт не завершиться, пока не будет закрыт SynWrite).')
- While ProcessExists('Syn.exe')
- Sleep(750)
- WEnd
- GUICtrlSetData($StatusBar, 'Распаковка...')
- RunWait('"' & @ScriptDir & '\Tools\UnRAR.exe" x -y "' & $TEMP & '\SynWrite.rar" *.* ' & @ScriptDir & '\', '', @SW_HIDE)
- Else
- GUICtrlSetData($StatusBar, 'Распаковка...')
- RunWait('"' & @ScriptDir & '\Tools\UnRAR.exe" x -y "' & $TEMP & '\SynWrite.rar" *.* ' & @ScriptDir & '\', '', @SW_HIDE)
- EndIf
- GUICtrlSetData($StatusBar, '')
- Sleep(100)
- __AddLexers() ;см. комментарии в функции
- __CleanAfterUpdate() ;см. комментарии в функции
- ;Пишем в Syn.ini дату и время обновления
- IniWrite($sConfig, 'Setup', 'lu', @YEAR & '-' & @MON & '-' & @MDAY & ' ' & @HOUR & ':' & @MIN)
- Switch MsgBox(4 + 4096, 'SynWrite Update', 'Запустить SynWrite?')
- Case 6
- Run('"' & @ScriptDir & '\Syn.exe"')
- Case 7
- Exit
- EndSwitch
- EndFunc ;==>__DownloadUpdate()
- Func __AddLexers()
- Local $hTempFile, $NewLexerLib, $AddLexer
- ;Держать свою библиотеку лексеров неудобно т.к. неудобно обновлять при нужде,
- ; поэтому используется родной файл LexLib.lxl и нужные лексеры (*.lcf) лежат
- ; рядом со скриптом - этой функцией они будут дописаны в LexLib.lxl после обновления
- $iEncoding = 0
- $iGetEncoding = FileGetEncoding(@ScriptDir & '\LexLib.lxl')
- If $iGetEncoding = '-1' Then
- $iEncoding = 0
- Else
- $iEncoding = $iGetEncoding
- EndIf
- $LexLib = IniRead(@ScriptDir & '\Syn.ini', 'Setup', 'LexLib', 'LexLib.lxl')
- ;объединяем все лексеры
- $FileList = _FileListToArray(@ScriptDir, '*.lcf', 1)
- If $FileList <> 0 Then
- GUICtrlSetData($StatusBar, 'Дополнительные лексеры...')
- For $i = 1 To $FileList[0]
- $hTempFile = FileOpen(@ScriptDir & '\' & $FileList[$i], $iEncoding)
- $AddLexer &= FileRead($hTempFile)
- FileClose($hTempFile)
- $hTempFile = ''
- Next
- ;добавляем пробел перед каждой строкой
- $AddLexer = StringRegExpReplace($AddLexer, '(?m)^([^\r\n])', ' \1' , 0)
- ;читаем в переменную библиотеку лексеров
- $hTempFile = FileOpen(@ScriptDir & '\' & $LexLib, $iEncoding)
- $DefLexer = FileRead($hTempFile)
- FileClose($hTempFile)
- $hTempFile = ''
- ;объединяем файлы
- $NewLexerLib = StringRegExpReplace($DefLexer, '(?m)^ end[\r\n]{1,2}end[\r\n]{1,2}', '', 1)
- $NewLexerLib &= ' end' & $AddLexer & @CRLF & 'end' & @CRLF
- ;записываем новую библиотеку лексеров ПРОВЕРИТЬ ФЛАГИ
- $hTempFile = FileOpen(@ScriptDir & '\' & $LexLib, 2 + $iEncoding)
- FileWrite($hTempFile, $NewLexerLib)
- FileClose($hTempFile)
- GUICtrlSetData($StatusBar, '')
- EndIf
- EndFunc ;==>__AddLexers()
- Func __CleanAfterUpdate()
- ;Удаляем из %Temp% SynWrite.rar и UnRAR.exe.
- ;Если рядом со скриптом лежит файл DeleteFiles.txt, то читаем из него список файлов
- ; для удаления (с относительными путями!) - например, лишние переводы, справка на немецком и т.д.
- GUICtrlSetData($StatusBar, 'Чистка...')
- Local $sArray, $aArray, $i
- If FileExists(@ScriptDir & '\DeleteFiles.txt') Then
- $sArray = FileRead(@ScriptDir & '\DeleteFiles.txt')
- ; Проверяем конец строки (DOS/Unix/Mac), назначаем найденное разделителем
- Select
- Case StringInStr($sArray, @CRLF) > 0
- $sDelimiter = @CRLF
- Case StringInStr($sArray, @LF) > 0
- $sDelimiter = @LF
- Case Else
- $sDelimiter = @CR
- EndSelect
- $aArray = StringSplit($sArray, $sDelimiter, 1)
- For $i = 1 To $aArray[0]
- FileSetAttrib(@ScriptDir & '\' & $aArray[$i], '-RASHNOT')
- FileDelete(@ScriptDir & '\' & $aArray[$i])
- Next
- EndIf
- FileDelete($TEMP & '\SynWrite.rar')
- FileDelete($TEMP & '\UnRAR.exe')
- GUICtrlSetData($StatusBar, 'Готово!')
- Sleep(1000)
- EndFunc ;==>__CleanAfterUpdate()
- ;UDF
- Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
- Local $hSearch, $sFile, $sFileList, $sDelim = "|"
- $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
- If Not FileExists($sPath) Then Return SetError(1, 1, "")
- If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
- If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
- $hSearch = FileFindFirstFile($sPath & $sFilter)
- If @error Then Return SetError(4, 4, "")
- While 1
- $sFile = FileFindNextFile($hSearch)
- If @error Then ExitLoop
- If ($iFlag + @extended = 2) Then ContinueLoop
- $sFileList &= $sDelim & $sFile
- WEnd
- FileClose($hSearch)
- If Not $sFileList Then Return SetError(4, 4, "")
- Return StringSplit(StringTrimLeft($sFileList, 1), "|")
- EndFunc ;==>_FileListToArray
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement