Advertisement
Guest User

Untitled

a guest
May 13th, 2016
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 14.68 KB | None | 0 0
  1. #NoTrayIcon
  2.  
  3. ;Обновление SynWrite (портативная версия) до релиза или беты с проверкой даты/версии
  4.  
  5. Global Const $GUI_ENABLE = 64
  6. Global Const $GUI_DISABLE = 128
  7. Global Const $SS_CENTER = 0x01
  8. ;Проверяем, что скрипт рядом с Syn.exe
  9. If Not FileExists(@ScriptDir & '\Syn.exe') Then
  10.     MsgBox(48 + 4096, 'SynWrite Update', 'Не найден Syn.exe!')
  11.     Exit
  12. EndIf
  13. ;Получаем путь %Temp%
  14. $TEMP = EnvGet('TEMP')
  15. ;Ищем конфиг Syn.ini
  16. If FileExists(@ScriptDir & '\Settings\Syn.ini') Then
  17.     $sConfig = @ScriptDir & '\Settings\Syn.ini'
  18. Else
  19.     MsgBox(48 + 4096, 'SynWrite Update', 'Файл Syn.ini не найден')
  20.     Exit
  21. EndIf
  22. $SearchVer = ''
  23. ;Получаем версию SynWrite на компе (см. комментарии в __GetLocalVersion())
  24. $sVerLocal = __GetLocalVersion()
  25. ;Читаем время предыдущего обновления скриптом (хранится в Syn.ini: секция Setup, параметр lu)
  26. $sLocalTime = IniRead($sConfig, 'Setup', 'lu', 0)
  27. If $sLocalTime = 0 Then
  28.     $sLocalTime = "Первый запуск"
  29. EndIf
  30. ;Рисуем простенькое GUI
  31. GUICreate('SynWrite Update', 220, 160)
  32. $Description = GUICtrlCreateLabel('Текущая версия:', 10, 10, 100, 20)
  33. $Description2 = GUICtrlCreateLabel('Обновлено:', 10, 30, 100, 20)
  34. $lVerLocal = GUICtrlCreateLabel($sVerLocal, 110, 10, 105, 20)
  35. $lVerLocalTime = GUICtrlCreateLabel($sLocalTime, 110, 30, 105, 20)
  36. $Button1 = GUICtrlCreateButton('Release', 10, 65, 80, 22)
  37. $Button2 = GUICtrlCreateButton('Beta', 10, 95, 80, 22)
  38. $lVerNewBetaInfo = GUICtrlCreateLabel('(Beta = last modified SynWrite.rar)', 10, 120, 210, 17, 0x01)
  39. GUICtrlSetFont($lVerNewBetaInfo, 8.5, 300, 2)
  40. GUICtrlSetColor($lVerNewBetaInfo, 0x808080)
  41. $lVerCur = GUICtrlCreateLabel('', 110, 70, 105, 20)
  42. $lVerNewBeta = GUICtrlCreateLabel('', 110, 100, 105, 20)
  43. $StatusBar = GUICtrlCreateLabel('', 5, 160 - 20, 210, 17)
  44. GUISetState()
  45.  
  46. While 1
  47.     If Not $SearchVer Then __Msg() ;Запускаем функцию поиска версий
  48.     Switch GUIGetMsg()
  49.         Case $Button1
  50.             GUICtrlSetState($Button1,$GUI_DISABLE)
  51.             __DownloadUpdate(1) ;Обновляем до релиза
  52.             Exit
  53.         Case $Button2
  54.             GUICtrlSetState($Button2,$GUI_DISABLE)
  55.             __DownloadUpdate(2) ;Обновляем до текущей бета-версии
  56.             Exit
  57.         Case -3
  58.             Exit
  59.     EndSwitch
  60. WEnd
  61.  
  62. Func __Msg()
  63.     Switch MsgBox(4 + 32 + 4096, 'SynWrite Update', 'Проверить версии?')
  64.         Case 6
  65.             ;Определяем текущую версию релиза (см. комментарии в __GetCurrentVersion())
  66.             $sVerCur = __GetCurrentVersion()
  67.             ;пишем ее в GUI
  68.             GUICtrlSetData($lVerCur, $sVerCur)
  69.             ;Определяем версию беты (см. комментарии в __GetBetaVersion())
  70.             $sVerNewBeta = __GetBetaVersion()
  71.             ;пишем ее в GUI
  72.             GUICtrlSetData($lVerNewBeta, $sVerNewBeta)
  73.             $SearchVer = 1
  74.         Case 7
  75.             $SearchVer = 1
  76.     EndSwitch
  77. EndFunc ;==>__Msg()
  78.  
  79. Func __GetLocalVersion()
  80.     Local $hFile, $sGetInfo, $sVerInfo
  81.     ;Локальную версию на компе читаем из файла History.txt
  82.     $hFile = FileOpen(@ScriptDir & '\Readme\History.txt', 0)
  83.     ;Проверяет, является ли файл открытым, перед тем как использовать функции чтения/записи в файл
  84.     If $hFile = -1 Then
  85.         MsgBox(48 + 4096, 'SynWrite Update', 'Невозможно открыть файл \Readme\History.txt.')
  86.         Exit
  87.     EndIf
  88.     ;Читает построчно текст (строки с 5 по 15)
  89.     $sGetInfo = ''
  90.     For $i = 5 To 15
  91.         $sGetInfo &= FileReadLine($hFile, $i)
  92.     Next
  93.     FileClose($hFile)
  94.     ;Регулярным выражением ищем первое совпадение с цифрами, похожими на версию
  95.     $sVerInfo = StringRegExp($sGetInfo, '[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}', 1)
  96.     If @error Then
  97.         MsgBox(48 + 4096, 'SynWrite Update', 'Не найдена информация о версии')
  98.         Return 'Не доступно'
  99.     EndIf
  100.     If IsArray($sVerInfo) Then
  101.         Return $sVerInfo[0]
  102.     Else
  103.         Return 'Не доступно'
  104.     EndIf
  105. EndFunc ;==>__GetLocalVersion()
  106.  
  107. Func __GetCurrentVersion()
  108.     Local $bGetInfo, $sGetInfo, $sVerInfo
  109.     ;Версию релиза читаем из History.txt на uvviewsoft.com
  110.     $bGetInfo = InetRead('http://www.uvviewsoft.com/synwrite/History.txt', 1 + 16)
  111.     If @error Then
  112.         MsgBox(48 + 4096, 'SynWrite Update', 'Сайт www.uvviewsoft.com недоступен.')
  113.         Return 'Не доступно'
  114.     EndIf
  115.     InetClose($bGetInfo)
  116.     $sGetInfo = BinaryToString($bGetInfo)
  117.     $sVerInfo = StringRegExp($sGetInfo, '[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}', 1)
  118.     If @error Then
  119.         MsgBox(48 + 4096, 'SynWrite Update', 'Не найдена информация о версии')
  120.         Return 'Не доступно'
  121.     EndIf
  122.     If IsArray($sVerInfo) Then
  123.         Return $sVerInfo[0]
  124.     Else
  125.         Return 'Не доступно'
  126.     EndIf
  127. EndFunc ;==>__GetCurrentVersion()
  128.  
  129. Func __GetBetaVersion()
  130.     Local $bGetInfo, $sGetInfo, $sVerInfo, $sVer, $iVer
  131.     ;С бетой сложнее, поэтому сливаем страницу http://www.uvviewsoft.com/bb/ и вытаскиваем из нее дату архива SynWrite.rar
  132.     $bGetInfo = InetRead('http://www.uvviewsoft.com/bb/', 1 + 16)
  133.     If @error Then
  134.         MsgBox(48 + 4096, 'SynWrite Update', 'Сайт uvviewsoft.com недоступен.')
  135.         Return 'Не доступно'
  136.     EndIf
  137.     InetClose($bGetInfo)
  138.     $sGetInfo = BinaryToString($bGetInfo)
  139.     $sVerInfo = StringRegExp($sGetInfo, '[0-9]{1,2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}', 1)
  140.     If @error Then
  141.         MsgBox(48 + 4096, 'SynWrite Update', 'Не найдена информация о версии')
  142.         Return 'Не доступно'
  143.     EndIf
  144.     If IsArray($sVerInfo) Then
  145.         $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')
  146.         ;Приводим дату к более привычному виду yyyy-MM-dd hh:mm
  147.         Local $aArray[13]
  148.         $aArray[0] = '12'
  149.         $aArray[1] = 'Jan'
  150.         $aArray[2] = 'Feb'
  151.         $aArray[3] = 'Mar'
  152.         $aArray[4] = 'Apr'
  153.         $aArray[5] = 'May'
  154.         $aArray[6] = 'Jun'
  155.         $aArray[7] = 'Jul'
  156.         $aArray[8] = 'Aug'
  157.         $aArray[9] = 'Sep'
  158.         $aArray[10] = 'Oct'
  159.         $aArray[11] = 'Nov'
  160.         $aArray[12] = 'Dec'
  161.         For $i = 1 To $aArray[0]
  162.             $iVer = ''
  163.             If StringLen($i) = 1 Then
  164.                 $iVer = StringReplace($sVer, $aArray[$i], '0' & $i, 0, 0)
  165.                 If @extended = 1 Then ExitLoop
  166.             Else
  167.                 $iVer = StringReplace($sVer, $aArray[$i], $i, 0, 0)
  168.                 If @extended = 1 Then ExitLoop
  169.             EndIf
  170.         Next
  171.         $sVer = StringRegExpReplace($iVer, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})', '\1-\2-\3 \4:\5')
  172.         Return $sVer
  173.     Else
  174.         Return 'Не доступно'
  175.     EndIf
  176. EndFunc ;==>__GetBetaVersion()
  177.  
  178. Func __DownloadUpdate($iFlag)
  179.     Local $dRelease, $dBeta
  180.     ;Сливаем SynWrite.rar в %Temp%
  181.     GUICtrlSetData($StatusBar, 'Скачивание...')
  182.     If $iFlag = 1 Then
  183.         $dRelease = InetGet('http://iweb.dl.sourceforge.net/project/synwrite/Release/SynWrite.rar', $TEMP & '\SynWrite.rar', 1)
  184.         If @error Then
  185.             MsgBox(48 + 4096, 'SynWrite Update', 'Файл SynWrite.rar недоступен.')
  186.             InetClose($dRelease)
  187.             Exit
  188.         EndIf
  189.         InetClose($dRelease)
  190.     ElseIf $iFlag = 2 Then
  191.         $dBeta = InetGet('http://uvviewsoft.com/bb/SynWrite.rar', $TEMP & '\SynWrite.rar', 1)
  192.         If @error Then
  193.             MsgBox(48 + 4096, 'SynWrite Update', 'Файл SynWrite.rar недоступен.')
  194.             InetClose($dBeta)
  195.             Exit
  196.         EndIf
  197.         InetClose($dBeta)
  198.     Else
  199.         MsgBox(48 + 4096, 'SynWrite Update', 'Неверно указан флаг для функции __DownloadUpdate($iFlag)')
  200.     EndIf
  201.     ;Копируем UnRAR.exe в %Temp%, т.к. SynWrite.rar будет распакован с заменой всех файлов
  202.     FileCopy(@ScriptDir & '\Tools\UnRAR.exe', $TEMP & '\UnRAR.exe')
  203.     ;Проверяем существование процесса Syn.exe, если есть - ждем закрытия программы, после распаковываем
  204.     If ProcessExists('Syn.exe') Then
  205.         GUICtrlSetData($StatusBar, 'Ожидание закрытия SynWrite...')
  206.         MsgBox(48 + 4096, 'SynWrite Update', 'SynWrite запущен!'  & @CRLF & 'Сохраните файлы и закройте приложение (скрипт не завершиться, пока не будет закрыт SynWrite).')
  207.         While ProcessExists('Syn.exe')
  208.             Sleep(750)
  209.         WEnd
  210.         GUICtrlSetData($StatusBar, 'Распаковка...')
  211.         RunWait('"' & @ScriptDir & '\Tools\UnRAR.exe"  x -y "' & $TEMP & '\SynWrite.rar" *.* ' & @ScriptDir & '\', '', @SW_HIDE)
  212.     Else
  213.         GUICtrlSetData($StatusBar, 'Распаковка...')
  214.         RunWait('"' & @ScriptDir & '\Tools\UnRAR.exe"  x -y "' & $TEMP & '\SynWrite.rar" *.* ' & @ScriptDir & '\', '', @SW_HIDE)
  215.     EndIf
  216.     GUICtrlSetData($StatusBar, '')
  217.     Sleep(100)
  218.     __AddLexers() ;см. комментарии в функции
  219.     __CleanAfterUpdate() ;см. комментарии в функции
  220.     ;Пишем в Syn.ini дату и время обновления
  221.     IniWrite($sConfig, 'Setup', 'lu', @YEAR & '-' & @MON & '-' & @MDAY & ' ' & @HOUR & ':' & @MIN)
  222.     Switch MsgBox(4 + 4096, 'SynWrite Update', 'Запустить SynWrite?')
  223.         Case 6
  224.             Run('"' & @ScriptDir & '\Syn.exe"')
  225.         Case 7
  226.             Exit
  227.     EndSwitch
  228. EndFunc ;==>__DownloadUpdate()
  229.  
  230. Func __AddLexers()
  231.     Local $hTempFile, $NewLexerLib, $AddLexer
  232.     ;Держать свою библиотеку лексеров неудобно  т.к. неудобно обновлять при нужде,
  233.     ;  поэтому используется родной файл LexLib.lxl и нужные лексеры (*.lcf) лежат
  234.     ;  рядом со скриптом - этой функцией они будут дописаны в LexLib.lxl после обновления
  235.     $iEncoding = 0
  236.     $iGetEncoding = FileGetEncoding(@ScriptDir & '\LexLib.lxl')
  237.     If $iGetEncoding = '-1' Then
  238.         $iEncoding = 0
  239.     Else
  240.         $iEncoding = $iGetEncoding
  241.     EndIf
  242.     $LexLib = IniRead(@ScriptDir & '\Syn.ini', 'Setup', 'LexLib', 'LexLib.lxl')
  243.     ;объединяем все лексеры
  244.     $FileList = _FileListToArray(@ScriptDir, '*.lcf', 1)
  245.     If $FileList <> 0 Then
  246.         GUICtrlSetData($StatusBar, 'Дополнительные лексеры...')
  247.         For $i = 1 To $FileList[0]
  248.             $hTempFile = FileOpen(@ScriptDir & '\' & $FileList[$i], $iEncoding)
  249.             $AddLexer &= FileRead($hTempFile)
  250.             FileClose($hTempFile)
  251.             $hTempFile = ''
  252.         Next
  253.         ;добавляем пробел перед каждой строкой
  254.         $AddLexer = StringRegExpReplace($AddLexer, '(?m)^([^\r\n])', ' \1' , 0)
  255.         ;читаем в переменную библиотеку лексеров
  256.         $hTempFile = FileOpen(@ScriptDir & '\' & $LexLib, $iEncoding)
  257.         $DefLexer = FileRead($hTempFile)
  258.         FileClose($hTempFile)
  259.         $hTempFile = ''
  260.         ;объединяем файлы
  261.         $NewLexerLib = StringRegExpReplace($DefLexer, '(?m)^  end[\r\n]{1,2}end[\r\n]{1,2}', '', 1)
  262.         $NewLexerLib &= '  end' & $AddLexer & @CRLF & 'end' & @CRLF
  263.         ;записываем новую библиотеку лексеров ПРОВЕРИТЬ ФЛАГИ
  264.         $hTempFile = FileOpen(@ScriptDir & '\' & $LexLib, 2 + $iEncoding)
  265.         FileWrite($hTempFile, $NewLexerLib)
  266.         FileClose($hTempFile)
  267.         GUICtrlSetData($StatusBar, '')
  268.     EndIf
  269. EndFunc ;==>__AddLexers()
  270.  
  271. Func __CleanAfterUpdate()
  272.     ;Удаляем из %Temp% SynWrite.rar и UnRAR.exe.
  273.     ;Если рядом со скриптом лежит файл DeleteFiles.txt, то читаем из него список файлов
  274.     ;  для удаления (с относительными путями!) - например, лишние переводы, справка на немецком и т.д.
  275.     GUICtrlSetData($StatusBar, 'Чистка...')
  276.     Local $sArray, $aArray, $i
  277.     If FileExists(@ScriptDir & '\DeleteFiles.txt') Then
  278.         $sArray = FileRead(@ScriptDir & '\DeleteFiles.txt')
  279.         ; Проверяем конец строки (DOS/Unix/Mac), назначаем найденное разделителем
  280.         Select
  281.             Case StringInStr($sArray, @CRLF) > 0
  282.                 $sDelimiter = @CRLF
  283.             Case StringInStr($sArray, @LF) > 0
  284.                 $sDelimiter = @LF
  285.             Case Else
  286.                 $sDelimiter = @CR
  287.         EndSelect
  288.         $aArray = StringSplit($sArray, $sDelimiter, 1)
  289.         For $i = 1 To $aArray[0]
  290.             FileSetAttrib(@ScriptDir & '\' & $aArray[$i], '-RASHNOT')
  291.             FileDelete(@ScriptDir & '\' & $aArray[$i])
  292.         Next
  293.     EndIf
  294.     FileDelete($TEMP & '\SynWrite.rar')
  295.     FileDelete($TEMP & '\UnRAR.exe')
  296.     GUICtrlSetData($StatusBar, 'Готово!')
  297.     Sleep(1000)
  298. EndFunc ;==>__CleanAfterUpdate()
  299.  
  300. ;UDF
  301. Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
  302.     Local $hSearch, $sFile, $sFileList, $sDelim = "|"
  303.     $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
  304.     If Not FileExists($sPath) Then Return SetError(1, 1, "")
  305.     If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
  306.     If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
  307.     $hSearch = FileFindFirstFile($sPath & $sFilter)
  308.     If @error Then Return SetError(4, 4, "")
  309.     While 1
  310.         $sFile = FileFindNextFile($hSearch)
  311.         If @error Then ExitLoop
  312.         If ($iFlag + @extended = 2) Then ContinueLoop
  313.         $sFileList &= $sDelim & $sFile
  314.     WEnd
  315.     FileClose($hSearch)
  316.     If Not $sFileList Then Return SetError(4, 4, "")
  317.     Return StringSplit(StringTrimLeft($sFileList, 1), "|")
  318. EndFunc   ;==>_FileListToArray
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement