From 58870833b1e1ddb8699b7c470839dc6aaa4b749f Mon Sep 17 00:00:00 2001 From: xianii Date: Mon, 1 Nov 2021 00:43:44 +0800 Subject: [PATCH] V99 (#6) * merge and update readme * v0.99 prerelease --- DoMiSo.ahk | 3 + Gui.ahk | 6 +- README.md | 208 ++++++++++++++++++++++++++++-------- README_en.md | 151 -------------------------- assets/screenshot.png | Bin 8139 -> 36916 bytes assets/setting.png | Bin 0 -> 5381 bytes dist.ahk | 61 +++++++++++ domiso_pink.ico => icon.ico | Bin meta.ahk | 10 ++ update.ahk | 54 ++++++---- updater.ahk | 10 ++ 11 files changed, 283 insertions(+), 220 deletions(-) delete mode 100644 README_en.md create mode 100644 assets/setting.png create mode 100644 dist.ahk rename domiso_pink.ico => icon.ico (100%) create mode 100644 meta.ahk create mode 100644 updater.ahk diff --git a/DoMiSo.ahk b/DoMiSo.ahk index 634f7de..c4a1af7 100644 --- a/DoMiSo.ahk +++ b/DoMiSo.ahk @@ -9,6 +9,8 @@ SetKeyDelay, 1, 1 SendMode event FileEncoding, UTF-8 +#include meta.ahk + outputVersion() if A_IsCompiled debug:=0 @@ -54,6 +56,7 @@ DllCall("QueryPerformanceFrequency", "Int64P", freq) baseOffset := [0,2,4,5,7,9,11] +; TODO: 添加midi音色选择 ; TODO: add no midi mode Notes := new NotePlayer() diff --git a/Gui.ahk b/Gui.ahk index f2230a2..cc8976e 100644 --- a/Gui.ahk +++ b/Gui.ahk @@ -45,10 +45,8 @@ Discord: https://discord.gg/5PCebykNaC =============== 1=C -bpm=150 -+3/// +5/// +7// ++1/ ++3/ ++5/ +++1 -rollback=9999 --1/ -3 -5/ 1/ +bpm=180 +1/ 3/ 5/ +1/// +5/// ++1/ ) sample_sheet .= _temp_txt diff --git a/README.md b/README.md index b6470df..f00144b 100644 --- a/README.md +++ b/README.md @@ -1,150 +1,270 @@ ![](logo.png) -### [English Document](README_en.md) +- github:https://github.com/Nigh/DoMiSo -### [中文文档](README.md) +> This document has been mostly translated by `deepl.com` -- github托管:https://github.com/Nigh/DoMiSo -- gitee托管:https://gitee.com/xianii/domiso +## Glossary of Terms(名词对照) +`numbered musical notation`:`简谱` -特别版规约 +Special Edition Statute(特别版规约) ------------------ +Any derivative works created using this version of the software (the Genshin Impact Special Edition) need to be credited in the work. +The source of the software should be properly acknowledged in the text description section. + +Any infringement of third parties caused by the use of this software is the sole responsibility of the user. + 任何使用本版本软件(原神特别版)创作的衍生作品均需要在作品中注明。 并在文字描述部分恰当的注明软件来源。 任何由于使用本软件对第三方所造成的侵害均由使用者本人负责。 -## 社群 +## Communities(社群) +- Discord: https://discord.gg/5PCebykNaC - 开黑啦: https://kaihei.co/IWXRLp -## 界面 +## Screenshot(截图) ![](assets/screenshot.png) -使用说明 +Instructions(使用说明) ------------------ + +- Paste a valid sheet into the input box or use the `File` button to select a `txt` or `dms` sheet +- Click on `listen` to listen to the sheet in midi +- When `Genshin Impact` has started and you are in the music playing UI, click `Play` to play the sheet automatically in the game. +- Press the `F8` shortcut key to stop the automatic playing in the game +- Press the `F9` shortcut to start playing automatically in the game +- When there is a dividing line consisting of a row of equal signs `=` such as `========`, the part above the dividing line is considered a commentary and will not be played +- When there is a comment section in the sheet, use the `Encrypt` button to publish an encrypted sheet. The encrypted sheet will only show the comment section. + + + - 在输入框中粘贴有效的简谱或使用`File`按钮选择`txt`或`dms`谱 -- 点击`Try`可以使用midi试听谱面 +- 点击`listen`可以使用midi试听谱面 - 在`原神`游戏已经启动,并且在演奏界面时,点击`Play`可以自动在游戏中演奏谱面 - 按下`F8`快捷键可以停止游戏中的自动演奏 - 按下`F9`快捷键可以开始游戏中的自动演奏 - 当谱面中存在由一排等于号`=`如`========`构成的分割线时,分割线以上部分视为注释部分,不会演奏 -- 当谱面中存在注释部分时,使用`Publish`按钮可以发布加密谱。加密谱面只会显示注释部分,不会显示演奏谱面 +- 当谱面中存在注释部分时,使用`Encrypt`按钮可以发布加密谱。加密谱面只会显示注释部分,不会显示演奏谱面 -由于`原神`游戏以管理员权限启动,所以本软件需要管理员权限才能与游戏本体交互。 +> As the `Genshin Impact` game is launched with administrator privileges, this software requires administrator privileges to interact with the game proper +> 由于`原神`游戏以管理员权限启动,所以本软件需要管理员权限才能与游戏本体交互。 -## AHK版本 +## AHK version `1.1.33.7 Unicode 32bit` -[更新日志](changes.md) +[Update Log(更新日志)](changes.md) ------------------ -简介 +Introduction(简介) ------------------ -DoMiSo 是一个轻量级的简谱解释器,它能够将格式化的简谱转换成midi音乐并播放出来。 +DoMiSo is a lightweight numbered musical notation interpreter that can convert formatted numbered musical notation into midi music and play it back. +There are several example sheets in the same directory as this document. You can copy them to DoMiSo and play them back. + +DoMiSo 是一个轻量级的简谱解释器,它能够将格式化的简谱转换成midi音乐并播放出来。 在本说明文档的同目录下将会有几个示例简谱。用户可以将它们拷贝到DoMiSo中播放出来。 -语法 +Grammar(语法) ------------------ -DoMiSo的简谱格式包含控制命令与音符标记。 +DoMiSo's numbered musical notation format includes `control commands` and `note markers`. +The control commands include `key control`, `tempo control` and `rollback control`. + +DoMiSo的简谱格式包含控制命令与音符标记。 其中控制命令包括调性控制,速度控制和回滚控制。 -### 控制命令 ### +### Control commands(控制命令) ### + +#### !!!Attention(注意)!!! -#### !!!注意!!! -简谱解释器原神特别版由于游戏本身限制,音域受限。 -~~所以在此特别版中,调性命令将自动失效,固定调性为`1=C`~~ +Due to restrictions in the game itself, it is not possible to play chromatic tones, so in this special edition, unplayable tones will be automatically ignored when played. -由于游戏本身限制,无法演奏半音,所以在此特别版中,无法演奏的音将会在~~试听和播放~~演奏时自动忽略。 +由于游戏本身限制,无法演奏半音,所以在此特别版中,无法演奏的音将会在演奏时自动忽略。 -##### 调性控制命令格式如下: +##### key control(调性控制) `1=F#` +When no scale number is added, the default is the 5th scale. I.e. the above command is equivalent to + 当不加音阶序号时,默认是第5个音阶。即上面的命令等价于: `1=F5#` +Default `1=C` when no tonality is specified + 没有规定调性时,默认`1=C` -##### 速度控制命令格式如下: +##### tempo control(速度控制) `bpm=120` +Valid bpm ranges from `1` to `480`, values outside this range are considered invalid and will reset bpm to the initial value of `80`. + +When no tempo is specified, the default is `bpm=80`. + 有效的bpm范围为1~480,超出此范围的数值视为无效,将会把bpm重置为初始值80。 没有规定速度时,默认`bpm=80` -##### 回滚控制命令格式如下: +##### rollback control(回滚控制) `rollback=12.5` +The function of the Rollback command is to move the writing position of a note forward by `N` full note lengths at the current tempo. `N` can be a decimal number. + 回滚命令的作用是将音符的书写位置前移N个当前速度下的全音符长度。N可以为小数。 +When there are multiple parts, this command can be used to write multiple parts separately. Its use will be described later. + 当存在多个声部时,可利用此命令来将多个声部分开书写。其用法将在后面介绍。 +All control commands are case-insensitive and can be placed on the same line as the note. The command will be executed before the note is parsed, regardless of its position on the line. + 所有控制命令不分大小写,而且可以与音符放在同一行。且不论命令在行中的什么位置,都将先执行命令,再解析音符。 -### 音符标记 ### +### note(音符) ### -##### 音符示例: ##### +##### Examples(示例) ##### `++3b//` `-1#-/-` `5..` `( 1 3 5 )` +Each note is separated by a space and notes that do not meet the format are simply ignored. + 每个音符之间由空格隔开,不符合格式的音符将会被直接忽略。 -##### 音高相关: ##### +##### Pitch(音高) ##### + +The notes are marked from `0 to 7`, with the same meaning as in numbered musical notation. 音符标记从`0~7`,意义与普通简谱一致。 +The notes preceded by `+` and `-` indicate that the note is raised or lowered by N steps, N being the number of `+` or `-`. + 音符前面的`+`和`-`,表示将音符升高或降低N个音阶。N即为+或-的数量。 +The `#` and `b` after the note indicate that the note is raised or lowered by half tone. + 音符后面的`#`和`b`,表示将音符升高或降低半个全音。 -##### 长度相关: ##### +##### Time(时值) ##### + +The time-related markers are `/` `-` `. ` -与长度有关的标记有`/` `-` `.` +与时值有关的标记有`/` `-` `.` + +`/` means that the time of the preceding mark is reduced by half. The meaning is the same as the underscore in numbered musical notation. `/` 表示将前面标记的音长减少一半。意义与普通简谱中的下划线一致。 -`-` 表示一个全音符的长度。意义与普通简谱中一致。且可以与 / 组合使用。 +`-` indicates the time of a whole note. The meaning is the same as in numbered musical notation. Can be used in combination with `/`. + +`-` 表示一个全音符的时值。意义与普通简谱中一致。且可以与 / 组合使用。 + +`.` extends the time of the preceding note by half. + +`.` 表示将前面音符的时值延长一半。 + +For example, `5..` has a note time of `1+0.5+0.25` beats. + +比如 `5..` 的音符时值即为 1+0.5+0.25 拍。 -`.` 表示将前面音符的长度延长一半。 +`++3b//` has a note time of `0.25` beats. -比如 `5..` 的音符长度即为 1+0.5+0.25 拍。 +`++3b//` 的音符时值即为 0.25 拍。 -`++3b//` 的音符长度即为 0.25 拍。 +`-1#-/-` has a note time of `1+0.5+1` beats. -`-1#-/-` 的音符长度即为 1+0.5+1 拍。 +`-1#-/-` 的音符时值即为 1+0.5+1 拍。 -`( 1 3- 5 )` 的音符长度为 2 拍。这是一个和弦。和弦的用法将在下面详述。 +`( 1 3- 5 )` has a note time of `2` beats. This is a chord. The use of the chord is described below. + +`( 1 3- 5 )` 的音符时值为 2 拍。这是一个和弦。和弦的用法将在下面详述。 + +##### Chord(和弦) ##### +Notes enclosed in brackets will be treated as chords. In this case, the brackets need to be separated from the notes by a space. Otherwise they will be ignored as invalid notes. -##### 和弦: ##### 用括号括起来的音符将被视作和弦。其中,括号与音符之间需要用空格隔开。否则会被当作无效音符而忽略。 -和弦中的每个音符将在同时被演奏,整个和弦的长度由和弦中最长的音符决定。 +Each note in the chord will be played at the same time and the length of the whole chord is determined by the longest note in the chord. -RollBack示例 +和弦中的每个音符将在同时被演奏,整个和弦的时值由和弦中最长的音符决定。 + +RollBack ------------------ +This is a RollBack usage example to demonstrate the basic usage of the RollBack command. + 这是一个RollBack用法示例,用以演示RollBack命令的基本用法。 +This is written using the chord: 这是使用和弦的写法: +``` ( 1 -1 ) ( 2 -2 ) ( 3 -3 ) ( 4 -4 ) ( 5 -5 ) ( 6 -6 ) ( 7 -7 ) +``` +This is written using rollback command: 这是使用rollback的写法: - 1 2 3 4 5 6 7 ;高音声部 - rollback=7 ;回滚7拍 - -1 -2 -3 -4 -5 -6 -7 ;低音声部 +``` + 1 2 3 4 5 6 7 + rollback=7 + -1 -2 -3 -4 -5 -6 -7 +``` +Rollback command animation demonstration: rollback命令动画演示: ![](assets/rollback.gif) +The effect is the same for both ways of writing. More usage can be found in the sample sketches in the `example_sheets` directory. 这两种写法的效果是一样的。更多用法可以参见`example_sheets`目录下的示例简谱。 -捐助 +Donate(捐助) ------------------ -![](assets/alipay.jpg) + +- Ko-fi: https://ko-fi.com/xianii +- Paypal: https://paypal.me/xianii + +- Alipay: ![](assets/alipay.jpg) + +## Advanced Function(进阶功能) + +### Setting.ini + +![](assets/setting.png) + +After successfully running the software for the first time, a configuration file `setting.ini` will be generated in the same directory. + +在第一次成功运行软件后,会在同目录下生成`setting.ini`的配置文件。 + +Automatic updates are turned on by default, specify `autoupdate=0` to turn them off. + +软件的自动更新是默认开启的,指定`autoupdate=0`可以关闭自动更新。 + +Specify `startupmusic=0` to disable the opening music when the software is opened. + +软件打开时会播放开场音乐,指定`startupmusic=0`可以关闭开场音乐。 + +Specify `clean_start=1` to clear the preset content in the edit box when the software is opened. + +指定`clean_start=1`可以在软件打开后清除编辑框中的预置内容。 + +Specify `nonAdminMode=1` to open the software in non-admin mode, where it **cannot** play music in the game, but you can drag `txt` or `dms` files directly into the edit box. + +指定`nonAdminMode=1`可以以非管理员模式打开软件,此时,软件**无法**在游戏中演奏音乐,但是可以直接拖放`txt`或`dms`文件至编辑框中。 + +Specify `log=0`,`log=1`,`log=2` to enable different levels of logging. The higher the number, the more detailed the log. + +指定`log=0`,`log=1`,`log=2`启用不同等级的日志。数字越大,日志越详细。 + +Specify `mirror=0` to change the update source to `github.com`, the default update source for the software is `fastgit.org`. Mainland China users can try specifying `mirror=cnpmjs` to change the update source when updates fail frequently. + +指定`mirror=0`可以将升级源更改为`github.com`,软件默认更新源是`fastgit.org`。中国大陆用户在升级频繁失败时,可以尝试指定 `mirror=cnpmjs` 更换升级源。 + +### Note statistics(音符统计) + +The status bar now shows statistics on the number of notes and the number of notes that can be played in the game. + +状态栏现在可以显示音符数量与能在游戏中演奏的音符数量的统计信息。 diff --git a/README_en.md b/README_en.md deleted file mode 100644 index 7ce92d9..0000000 --- a/README_en.md +++ /dev/null @@ -1,151 +0,0 @@ -![](logo.png) - -### [English Document](README_en.md) - -### [中文文档](README.md) - -- github:https://github.com/Nigh/DoMiSo -- gitee:https://gitee.com/xianii/domiso - -> This document has been mostly translated by `deepl.com/translator` and has been lightly proofread by hand. - -Special Edition Statute ------------------- -Any derivative works created using this version of the software (the Genshin Impact Special Edition) need to be credited in the work. -The source of the software should be properly acknowledged in the text description section. - -Any infringement of third parties caused by the use of this software is the sole responsibility of the user. - -## Communities -- Discord: https://discord.gg/5PCebykNaC - -## Screenshot - -![](assets/screenshot.png) - -Instructions for use ------------------- -- Right click to launched the software with `administrator` privileges -- Paste a valid score in the input box -- Click on `Try` to listen to the score in midi -- When `Genshin Impact` has started and you are in the music playing UI, click `Play` to play the score automatically in the game. -- Press the `F8` shortcut key to stop the automatic playing in the game -- Press the `F9` shortcut to start playing automatically in the game - -As the `Genshin Impact` game is launched with administrator privileges, this software requires administrator privileges to interact with the game proper. - -## AHK version - -`1.1.33.7 Unicode 32bit` - -[Update Log](changes.md) ------------------- - -Introduction ------------------- -DoMiSo is a lightweight numbered musical notation interpreter that can convert formatted numbered musical notation into midi music and play it back. -There are several example scores in the same directory as this document. You can copy them to DoMiSo and play them back. - -Grammar ------------------- -DoMiSo's numbered musical notation format includes `control commands` and `note markers`. -The control commands include `key control`, `tempo control` and `rollback control`. - -### Control commands ### - -#### !!!Attention!!! -Due to restrictions in the game itself, it is not possible to play chromatic tones, so in this special edition, unplayable tones will be automatically ignored when played. - -##### key control: - -`1=F#` - -When no scale number is added, the default is the 5th scale. I.e. the above command is equivalent to - -`1=F5#` - -Default `1=C` when no tonality is specified - -##### tempo control: - -`bpm=120` - -Valid bpm ranges from `1` to `480`, values outside this range are considered invalid and will reset bpm to the initial value of `80`. - -When no tempo is specified, the default is `bpm=80`. - -##### rollback control: - -`rollback=12.5` - -The function of the Rollback command is to move the writing position of a note forward by `N` full note lengths at the current tempo. `N` can be a decimal number. - -When there are multiple parts, this command can be used to write multiple parts separately. Its use will be described later. - -All control commands are case-insensitive and can be placed on the same line as the note. The command will be executed before the note is parsed, regardless of its position on the line. - -### note marker ### - -##### Examples: ##### - -`++3b//` `-1#-/-` `5..` `( 1 3 5 )` - -Each note is separated by a space and notes that do not meet the format are simply ignored. - -##### Pitch: ##### - -The notes are marked from `0 to 7`, with the same meaning as in numbered musical notation. - -The notes preceded by `+` and `-` indicate that the note is raised or lowered by N steps, N being the number of `+` or `-`. - -The `#` and `b` after the note indicate that the note is raised or lowered by half tone. - -##### Length: ##### - -The length-related markers are `/` `-` `. ` - -`/` means that the length of the preceding mark is reduced by half. The meaning is the same as the underscore in numbered musical notation. - -`-` indicates the length of a whole note. The meaning is the same as in numbered musical notation. Can be used in combination with `/`. - -`.` extends the length of the preceding note by half. - -For example, `5..` has a note length of `1+0.5+0.25` beats. - -`++3b//` has a note length of `0.25` beats. - -`-1#-/-` has a note length of `1+0.5+1` beats. - -`( 1 3- 5 )` has a note length of `2` beats. This is a chord. The use of the chord is described below. - -##### Chord: ##### -Notes enclosed in brackets will be treated as chords. In this case, the brackets need to be separated from the notes by a space. Otherwise they will be ignored as invalid notes. - -Each note in the chord will be played at the same time and the length of the whole chord is determined by the longest note in the chord. - -RollBack Example ------------------- -This is a RollBack usage example to demonstrate the basic usage of the RollBack command. - -This is written using the chord: - - ( 1 -1 ) ( 2 -2 ) ( 3 -3 ) ( 4 -4 ) ( 5 -5 ) ( 6 -6 ) ( 7 -7 ) - -This is written using rollback command: - - 1 2 3 4 5 6 7 - rollback=7 - -1 -2 -3 -4 -5 -6 -7 - -The effect is the same for both ways of writing. More usage can be found in the sample sketches in the `example_sheets` directory. - - -Rollback command animation demonstration: - -![](assets/rollback.gif) - - -Donate ------------------- -- Ko-fi: https://ko-fi.com/xianii -- Paypal: https://paypal.me/xianii diff --git a/assets/screenshot.png b/assets/screenshot.png index c37f04701d270e7f17ddce7e4a60e2c76fea3fa3..3bb4dc51399fc41cb4c4144a1b9a7b83ca4f4f5b 100644 GIT binary patch literal 36916 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 P00000NkvXXu0mjfrTb{( literal 8139 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%0AB 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 literal 0 HcmV?d00001 diff --git a/dist.ahk b/dist.ahk new file mode 100644 index 0000000..b4504b7 --- /dev/null +++ b/dist.ahk @@ -0,0 +1,61 @@ +; # dependency: +; # autohotkey in PATH +; # ahk2exe in PATH +; # mpress in ahk2exe path + +#SingleInstance, Force +SetWorkingDir, %A_ScriptDir% + +#include meta.ahk + +if FileExist(binaryFilename) +{ + FileDelete, %binaryFilename% +} + +if FileExist(versionFilename) +{ + FileDelete, %versionFilename% +} + +if InStr(FileExist("dist"), "D") +{ + FileRemoveDir, dist, 1 + If (ErrorLevel) + { + MsgBox, % "removing dist`nERROR CODE=" ErrorLevel + ExitApp + } +} + +FileCreateDir, dist + +RunWait, ahk2exe.exe /in updater.ahk /out updater.exe /compress 1 +If (ErrorLevel) +{ + MsgBox, % "updater.ahk`nERROR CODE=" ErrorLevel + ExitApp +} +RunWait, ahk2exe.exe /in %ahkFilename% /out %binaryFilename% /icon icon.ico /compress 1 +If (ErrorLevel) +{ + MsgBox, % ahkFilename "`nERROR CODE=" ErrorLevel + ExitApp +} +RunWait, autohotkey.exe .\%ahkFilename% --out=version +If (ErrorLevel) +{ + MsgBox, % "get version`nERROR CODE=" ErrorLevel + ExitApp +} +RunWait, powershell -command "Compress-Archive -Path .\%binaryFilename% -DestinationPath %downloadFilename%",, Hide +If (ErrorLevel) +{ + MsgBox, % "compress`nERROR CODE=" ErrorLevel + ExitApp +} +FileDelete, %binaryFilename% +FileDelete, updater.exe +FileMove, %downloadFilename%, dist\%downloadFilename%, 1 +FileMove, %versionFilename%, dist\%versionFilename%, 1 +MsgBox, Build Finished diff --git a/domiso_pink.ico b/icon.ico similarity index 100% rename from domiso_pink.ico rename to icon.ico diff --git a/meta.ahk b/meta.ahk new file mode 100644 index 0000000..05e5d2f --- /dev/null +++ b/meta.ahk @@ -0,0 +1,10 @@ + +FileEncoding, UTF-8 +name_en:="Domiso Automata" +name_zh:="原神自动弹琴人偶" +version:="0.99.0" +versionFilename:="version.txt" +ahkFilename:="DoMiSo.ahk" +binaryFilename:="Domiso-Genshin.exe" +downloadFilename:="DomisoGenshin.zip" +downloadUrl:="/Nigh/DoMiSo-genshin/releases/latest/download/" diff --git a/update.ahk b/update.ahk index 6ad85a8..88fe8cb 100644 --- a/update.ahk +++ b/update.ahk @@ -1,8 +1,13 @@  +#include meta.ahk + +IfExist, updater.exe +{ + FileDelete, updater.exe +} outputVersion(){ global - version:="0.99.0" if A_Args.Length() > 0 { for n, param in A_Args @@ -18,25 +23,21 @@ outputVersion(){ } } - -downloadUrlBase:="https://download.fastgit.org/Nigh/DoMiSo-genshin/releases/latest/download/" -versionFilename:="version.txt" -binaryFilename:="DomisoGenshin.zip" - IniRead, logLevel, setting.ini, update, log, 0 IniRead, lastUpdate, setting.ini, update, last, 0 IniRead, autoUpdate, setting.ini, update, autoupdate, 1 -IniRead, debugmode, setting.ini, update, debug, 0 +IniRead, updateMirror, setting.ini, update, mirror, fastgit +IniWrite, % updateMirror, setting.ini, update, mirror IniRead, version_str, setting.ini, update, ver, "0" log_write("Start at " A_YYYY "-" A_MM "-" A_DD, 0) today:=A_MM . A_DD if(autoUpdate) { if(lastUpdate!=today) { log_write("Getting Update",0) - MsgBox,,Update,Getting Update`n获取最新版本,2 + ; MsgBox,,Update,Getting Update`n获取最新版本,2 get_latest_version() } else { - ttm("Domiso automata Start`nv" version "`n原神弹琴人偶启动") + ttm(name_en " Start`nv" version "`n" name_zh "启动") } } else { log_write("Update Skiped",0) @@ -46,12 +47,19 @@ if(autoUpdate) { } } +updateSite:="" + get_latest_version(){ global req := ComObjCreate("MSXML2.ServerXMLHTTP") - ; https://download.fastgit.org/Nigh/Genshin-fishing/releases/latest/download/version.txt - ; https://github.com/Nigh/Genshin-fishing/releases/latest/download/version.txt - req.open("GET", downloadUrlBase versionFilename, true) + if(updateMirror=="fastgit") { + updateSite:="https://download.fastgit.org" + } else if(updateMirror=="cnpmjs") { + updateSite:="https://github.com.cnpmjs.org" + } else { + updateSite:="https://github.com" + } + req.open("GET", updateSite downloadUrl versionFilename, true) req.onreadystatechange := Func("updateReady") req.send() } @@ -59,13 +67,13 @@ get_latest_version(){ ; with MSXML2.ServerXMLHTTP method, there would be multiple callback called updateReqDone:=0 updateReady(){ - global req, version, updateReqDone + global req, version, updateReqDone, updateSite, downloadUrl, downloadFilename log_write("update req.readyState=" req.readyState, 1) if (req.readyState != 4){ ; Not done yet. return } if(updateReqDone){ - log_write("state already changed", 1) + ; log_write("state already changed", 1) Return } updateReqDone := 1 @@ -74,21 +82,25 @@ updateReady(){ ; MsgBox % "Latest version: " req.responseText RegExMatch(version, "(\d+)\.(\d+)\.(\d+)", verNow) RegExMatch(req.responseText, "(\d+)\.(\d+)\.(\d+)", verNew) - if(verNow1*10000+verNow2*100+verNow3verNow1) + || (verNew1==verNow1 && ((verNew2>verNow2) + || (verNew2==verNow2 && verNew3>verNow3)))){ MsgBox, 0x24, Download, % "Found new version " req.responseText ", download?`n`n发现新版本 " req.responseText " 是否下载?" IfMsgBox Yes { - UrlDownloadToFile, % downloadUrlBase binaryFilename, % "./" binaryFilename - if(ErrorLevel) { - MsgBox, 16,, % "Download failed`n下载失败" - } else { - MsgBox, ,, % "File saved as " binaryFilename "`n更新下载完成 " binaryFilename "`n`nProgram will exit now`n软件即将退出", 2 + try { + UrlDownloadToFile, % updateSite downloadUrl downloadFilename, % "./" downloadFilename + MsgBox, ,, % "Download finished`n更新下载完成`n`nProgram will restart now`n软件即将重启", 3 IniWrite, % A_MM A_DD, setting.ini, update, last + FileInstall, updater.exe, updater.exe, 1 + Run, updater.exe ExitApp + } catch e { + MsgBox, 16,, % "Upgrade failed`nAn exception was thrown!`nSpecifically: " e } } } else { - MsgBox, ,, % "Current version: v" version "`n`nIt is the latest version`n`n软件已是最新版本", 2 + ; MsgBox, ,, % "Current version: v" version "`n`nIt is the latest version`n`n软件已是最新版本", 2 IniWrite, % A_MM A_DD, setting.ini, update, last } } else { diff --git a/updater.ahk b/updater.ahk new file mode 100644 index 0000000..6751758 --- /dev/null +++ b/updater.ahk @@ -0,0 +1,10 @@ +#SingleInstance, ignore +SetWorkingDir, %A_ScriptDir% + +#include meta.ahk + +RunWait, powershell -command "Expand-Archive -Force %downloadFilename% .",, Hide +FileDelete, % downloadFilename +Run, %binaryFilename% + +ExitApp