From 525ce2ac68036a5081f59ea459374f64f44b1afc Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Mon, 7 Nov 2022 20:22:31 +0800 Subject: [PATCH 01/10] Add: Auto detection of bluestacks serial for MAA --- .../module/config/i18n/zh-CN.json | 2 +- .../AlasMaaBridge/module/handler/handler.py | 103 +++++++++++++++++- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/submodule/AlasMaaBridge/module/config/i18n/zh-CN.json b/submodule/AlasMaaBridge/module/config/i18n/zh-CN.json index 852344fda..0007d2468 100644 --- a/submodule/AlasMaaBridge/module/config/i18n/zh-CN.json +++ b/submodule/AlasMaaBridge/module/config/i18n/zh-CN.json @@ -134,7 +134,7 @@ }, "Serial": { "name": "模拟器 Serial", - "help": "模拟器默认 Serial:\n- 蓝叠模拟器 127.0.0.1:5555\n- 夜神模拟器 127.0.0.1:62001\n- 夜神模拟器64位 127.0.0.1:59865\n- MuMu模拟器 127.0.0.1:7555\n- 逍遥模拟器 127.0.0.1:21503\n- 雷电模拟器 emulator-5554 或 127.0.0.1:5555\n如果你有多个模拟器,它们的 Serial 将不是默认的,可以在 console.bat 中执行 `adb devices` 查询" + "help": "模拟器默认 Serial:\n- 蓝叠模拟器 127.0.0.1:5555\n- 蓝叠模拟器4 Hyper-v版,填\"bluestacks4-hyperv\"自动连接,多开填\"bluestacks4-hyperv-2\"以此类推\n- 蓝叠模拟器5 Hyper-v版,填\"bluestacks5-hyperv\"自动连接,多开填\"bluestacks5-hyperv-1\"以此类推\n- 夜神模拟器 127.0.0.1:62001\n- 夜神模拟器64位 127.0.0.1:59865\n- MuMu模拟器 127.0.0.1:7555\n- 逍遥模拟器 127.0.0.1:21503\n- 雷电模拟器 emulator-5554 或 127.0.0.1:5555\n如果你有多个模拟器,它们的 Serial 将不是默认的,可以在 console.bat 中执行 `adb devices` 查询" }, "PackageName": { "name": "游戏服务器", diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index f7ca843f5..1ea3b224a 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -8,6 +8,8 @@ import datetime from importlib import import_module from typing import Any +from cached_property import cached_property + from deploy.config import DeployConfig from module.base.timer import Timer from module.config.utils import read_file, deep_get @@ -169,14 +171,111 @@ class AssistantHandler: else: self.task_switch_timer.reset() + def serial_check(self): + """ + serial check + """ + if self.is_bluestacks4_hyperv: + self.serial = self.find_bluestacks4_hyperv(self.serial) + if self.is_bluestacks5_hyperv: + self.serial = self.find_bluestacks5_hyperv(self.serial) + + @cached_property + def is_bluestacks4_hyperv(self): + return "bluestacks4-hyperv" in self.serial + + @cached_property + def is_bluestacks5_hyperv(self): + return "bluestacks5-hyperv" in self.serial + + @staticmethod + def find_bluestacks4_hyperv(serial): + """ + Find dynamic serial of BlueStacks4 Hyper-V Beta. + + Args: + serial (str): 'bluestacks4-hyperv', 'bluestacks4-hyperv-2' for multi instance, and so on. + + Returns: + str: 127.0.0.1:{port} + """ + from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx + + logger.info("Use BlueStacks4 Hyper-V Beta") + logger.info("Reading Realtime adb port") + + if serial == "bluestacks4-hyperv": + folder_name = "Android" + else: + folder_name = f"Android_{serial[19:]}" + + try: + with OpenKey(HKEY_LOCAL_MACHINE, + rf"SOFTWARE\BlueStacks_bgp64_hyperv\Guests\{folder_name}\Config") as key: + port = QueryValueEx(key, "BstAdbPort")[0] + except FileNotFoundError: + logger.error(rf'Unable to find registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_bgp64_hyperv\Guests\{folder_name}\Config') + logger.error('Please confirm that your are using BlueStack 4 hyper-v and not regular BlueStacks 4') + logger.error(r'Please check if there is any other emulator instances under ' + r'registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_bgp64_hyperv\Guests') + raise RequestHumanTakeover + logger.info(f"New adb port: {port}") + return f"127.0.0.1:{port}" + + @staticmethod + def find_bluestacks5_hyperv(serial): + """ + Find dynamic serial of BlueStacks5 Hyper-V. + + Args: + serial (str): 'bluestacks5-hyperv', 'bluestacks5-hyperv-1' for multi instance, and so on. + + Returns: + str: 127.0.0.1:{port} + """ + from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx + + logger.info("Use BlueStacks5 Hyper-V") + logger.info("Reading Realtime adb port") + + if serial == "bluestacks5-hyperv": + parameter_name = r"bst\.instance\.Nougat64\.status\.adb_port" + else: + parameter_name = rf"bst\.instance\.Nougat64_{serial[19:]}\.status.adb_port" + + try: + with OpenKey(HKEY_LOCAL_MACHINE, r"SOFTWARE\BlueStacks_nxt") as key: + directory = QueryValueEx(key, 'UserDefinedDir')[0] + except FileNotFoundError: + try: + with OpenKey(HKEY_LOCAL_MACHINE, r"SOFTWARE\BlueStacks_nxt_cn") as key: + directory = QueryValueEx(key, 'UserDefinedDir')[0] + except FileNotFoundError: + logger.error('Unable to find registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_nxt ' + 'or HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_nxt_cn') + logger.error('Please confirm that you are using BlueStacks 5 hyper-v and not regular BlueStacks 5') + raise RequestHumanTakeover + logger.info(f"Configuration file directory: {directory}") + + with open(os.path.join(directory, 'bluestacks.conf'), encoding='utf-8') as f: + content = f.read() + port = re.search(rf'{parameter_name}="(\d+)"', content) + if port is None: + logger.warning(f"Did not match the result: {serial}.") + raise RequestHumanTakeover + port = port.group(1) + logger.info(f"Match to dynamic port: {port}") + return f"127.0.0.1:{port}" + def connect(self): adb = os.path.abspath(DeployConfig().AdbExecutable) - serial = self.config.MaaEmulator_Serial + self.serial = self.config.MaaEmulator_Serial + self.serial_check() old_callback_list = self.callback_list self.callback_list = [] - if not self.asst.connect(adb, serial): + if not self.asst.connect(adb, self.serial): raise RequestHumanTakeover self.callback_list = old_callback_list From 0ad88950b019ebc216f3669e761ac06e353ac12f Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Mon, 7 Nov 2022 20:28:08 +0800 Subject: [PATCH 02/10] Opt: Delay infrast task to next day if possible --- submodule/AlasMaaBridge/module/handler/handler.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index 1ea3b224a..0605b58a1 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -400,7 +400,7 @@ class AssistantHandler: if periods is None: logger.critical('无法找到配置文件中的排班周期,请检查文件是否有效') raise RequestHumanTakeover - for period in periods: + for j, period in enumerate(periods): start_time = datetime.datetime.combine( datetime.date.today(), datetime.datetime.strptime(period[0], '%H:%M').time() @@ -412,6 +412,13 @@ class AssistantHandler: now_time = datetime.datetime.now() if start_time <= now_time < end_time: args['plan_index'] = i + # 处理跨天的情形 + # 如:"period": [["22:00", "23:59"], ["00:00","06:00"]] + if j != len(periods) - 1 and period[1] == '23:59' and periods[j + 1][0] == '00:00': + end_time = datetime.datetime.combine( + datetime.date.today() + datetime.timedelta(days=1), + datetime.datetime.strptime(periods[j + 1][1], '%H:%M').time() + ) break if 'plan_index' in args: break From 85a752ff1b8db8cdcd43af44a9c4e5694138db75 Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Mon, 7 Nov 2022 21:16:34 +0800 Subject: [PATCH 03/10] Refactor: Use static method of ConnectionAttr --- .../AlasMaaBridge/module/handler/handler.py | 84 +------------------ 1 file changed, 3 insertions(+), 81 deletions(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index 0605b58a1..40b4d9113 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -13,6 +13,7 @@ from cached_property import cached_property from deploy.config import DeployConfig from module.base.timer import Timer from module.config.utils import read_file, deep_get +from module.device.connection_attr import ConnectionAttr from module.exception import RequestHumanTakeover from module.logger import logger @@ -176,9 +177,9 @@ class AssistantHandler: serial check """ if self.is_bluestacks4_hyperv: - self.serial = self.find_bluestacks4_hyperv(self.serial) + self.serial = ConnectionAttr.find_bluestacks4_hyperv(self.serial) if self.is_bluestacks5_hyperv: - self.serial = self.find_bluestacks5_hyperv(self.serial) + self.serial = ConnectionAttr.find_bluestacks5_hyperv(self.serial) @cached_property def is_bluestacks4_hyperv(self): @@ -188,85 +189,6 @@ class AssistantHandler: def is_bluestacks5_hyperv(self): return "bluestacks5-hyperv" in self.serial - @staticmethod - def find_bluestacks4_hyperv(serial): - """ - Find dynamic serial of BlueStacks4 Hyper-V Beta. - - Args: - serial (str): 'bluestacks4-hyperv', 'bluestacks4-hyperv-2' for multi instance, and so on. - - Returns: - str: 127.0.0.1:{port} - """ - from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx - - logger.info("Use BlueStacks4 Hyper-V Beta") - logger.info("Reading Realtime adb port") - - if serial == "bluestacks4-hyperv": - folder_name = "Android" - else: - folder_name = f"Android_{serial[19:]}" - - try: - with OpenKey(HKEY_LOCAL_MACHINE, - rf"SOFTWARE\BlueStacks_bgp64_hyperv\Guests\{folder_name}\Config") as key: - port = QueryValueEx(key, "BstAdbPort")[0] - except FileNotFoundError: - logger.error(rf'Unable to find registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_bgp64_hyperv\Guests\{folder_name}\Config') - logger.error('Please confirm that your are using BlueStack 4 hyper-v and not regular BlueStacks 4') - logger.error(r'Please check if there is any other emulator instances under ' - r'registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_bgp64_hyperv\Guests') - raise RequestHumanTakeover - logger.info(f"New adb port: {port}") - return f"127.0.0.1:{port}" - - @staticmethod - def find_bluestacks5_hyperv(serial): - """ - Find dynamic serial of BlueStacks5 Hyper-V. - - Args: - serial (str): 'bluestacks5-hyperv', 'bluestacks5-hyperv-1' for multi instance, and so on. - - Returns: - str: 127.0.0.1:{port} - """ - from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx - - logger.info("Use BlueStacks5 Hyper-V") - logger.info("Reading Realtime adb port") - - if serial == "bluestacks5-hyperv": - parameter_name = r"bst\.instance\.Nougat64\.status\.adb_port" - else: - parameter_name = rf"bst\.instance\.Nougat64_{serial[19:]}\.status.adb_port" - - try: - with OpenKey(HKEY_LOCAL_MACHINE, r"SOFTWARE\BlueStacks_nxt") as key: - directory = QueryValueEx(key, 'UserDefinedDir')[0] - except FileNotFoundError: - try: - with OpenKey(HKEY_LOCAL_MACHINE, r"SOFTWARE\BlueStacks_nxt_cn") as key: - directory = QueryValueEx(key, 'UserDefinedDir')[0] - except FileNotFoundError: - logger.error('Unable to find registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_nxt ' - 'or HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_nxt_cn') - logger.error('Please confirm that you are using BlueStacks 5 hyper-v and not regular BlueStacks 5') - raise RequestHumanTakeover - logger.info(f"Configuration file directory: {directory}") - - with open(os.path.join(directory, 'bluestacks.conf'), encoding='utf-8') as f: - content = f.read() - port = re.search(rf'{parameter_name}="(\d+)"', content) - if port is None: - logger.warning(f"Did not match the result: {serial}.") - raise RequestHumanTakeover - port = port.group(1) - logger.info(f"Match to dynamic port: {port}") - return f"127.0.0.1:{port}" - def connect(self): adb = os.path.abspath(DeployConfig().AdbExecutable) self.serial = self.config.MaaEmulator_Serial From 40b3e6f40e100e0e1bacacf473b68fe9bf735b9c Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Tue, 8 Nov 2022 15:36:32 +0800 Subject: [PATCH 04/10] Opt: Parse custom infrast periods more delicately - Deal with periods crossing different dates, like [20:00, 7:00] - Delay infrast task as long as possible --- .../AlasMaaBridge/module/handler/handler.py | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index 40b4d9113..227e7cf93 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -11,7 +11,7 @@ from typing import Any from cached_property import cached_property from deploy.config import DeployConfig -from module.base.timer import Timer +from module.base.timer import Timer, future_time from module.config.utils import read_file, deep_get from module.device.connection_attr import ConnectionAttr from module.exception import RequestHumanTakeover @@ -322,27 +322,35 @@ class AssistantHandler: if periods is None: logger.critical('无法找到配置文件中的排班周期,请检查文件是否有效') raise RequestHumanTakeover - for j, period in enumerate(periods): - start_time = datetime.datetime.combine( - datetime.date.today(), - datetime.datetime.strptime(period[0], '%H:%M').time() - ) - end_time = datetime.datetime.combine( - datetime.date.today(), - datetime.datetime.strptime(period[1], '%H:%M').time() - ) - now_time = datetime.datetime.now() - if start_time <= now_time < end_time: + period_index = None + now_time = datetime.datetime.now().time() + periods_sorted = sorted([ + tuple(datetime.time.fromisoformat(x) for x in p) + for p in periods + ]) + for j, period in enumerate(periods_sorted): + # 分别对应三种情况: + # [05:00, 07:00], now_time=06:00 + # [20:00, 07:00], now_time=06:00 + # [20:00, 07:00], now_time=21:00 + if (period[0] <= now_time < period[1] or + now_time < period[1] < period[0] or + period[1] < period[0] <= now_time): + period_index = j args['plan_index'] = i - # 处理跨天的情形 - # 如:"period": [["22:00", "23:59"], ["00:00","06:00"]] - if j != len(periods) - 1 and period[1] == '23:59' and periods[j + 1][0] == '00:00': - end_time = datetime.datetime.combine( - datetime.date.today() + datetime.timedelta(days=1), - datetime.datetime.strptime(periods[j + 1][1], '%H:%M').time() - ) break if 'plan_index' in args: + periods_sorted = periods_sorted[period_index:] + periods_sorted[:period_index] + future_time_ = lambda x: future_time(x.isoformat(timespec='minutes')) + # 找到下次换班时间,时间差不大于1分钟视为连续时段 + # 如[[22:00, 06:59], [05:00, 08:59], [09:00, 10:59], [13:00, 17:59]] + # 现在是22:00,下次在10:59之后换班即可,中间的06:59和08:59不必换班 + end_time = future_time_(periods_sorted[0][1]) + for period in periods_sorted[1:]: + start_time = future_time_(period[0]) + if start_time - end_time > datetime.timedelta(minutes=1): + break + end_time = max(end_time, future_time_(period[1])) break self.maa_start('Infrast', args) From ac10a8b4fbd947d545f59bf81e9bd2a4c2ba9080 Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Tue, 8 Nov 2022 19:01:58 +0800 Subject: [PATCH 05/10] Opt: Revert back and set now_time <= end_time --- .../AlasMaaBridge/module/handler/handler.py | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index 227e7cf93..dd3168a31 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -322,35 +322,27 @@ class AssistantHandler: if periods is None: logger.critical('无法找到配置文件中的排班周期,请检查文件是否有效') raise RequestHumanTakeover - period_index = None - now_time = datetime.datetime.now().time() - periods_sorted = sorted([ - tuple(datetime.time.fromisoformat(x) for x in p) - for p in periods - ]) - for j, period in enumerate(periods_sorted): - # 分别对应三种情况: - # [05:00, 07:00], now_time=06:00 - # [20:00, 07:00], now_time=06:00 - # [20:00, 07:00], now_time=21:00 - if (period[0] <= now_time < period[1] or - now_time < period[1] < period[0] or - period[1] < period[0] <= now_time): - period_index = j + for j, period in enumerate(periods): + start_time = datetime.datetime.combine( + datetime.date.today(), + datetime.datetime.strptime(period[0], '%H:%M').time() + ) + end_time = datetime.datetime.combine( + datetime.date.today(), + datetime.datetime.strptime(period[1], '%H:%M').time() + ) + now_time = datetime.datetime.now() + if start_time <= now_time <= end_time: args['plan_index'] = i + # 处理跨天的情形 + # 如:"period": [["22:00", "23:59"], ["00:00","06:00"]] + if j != len(periods) - 1 and period[1] == '23:59' and periods[j + 1][0] == '00:00': + end_time = datetime.datetime.combine( + datetime.date.today() + datetime.timedelta(days=1), + datetime.datetime.strptime(periods[j + 1][1], '%H:%M').time() + ) break if 'plan_index' in args: - periods_sorted = periods_sorted[period_index:] + periods_sorted[:period_index] - future_time_ = lambda x: future_time(x.isoformat(timespec='minutes')) - # 找到下次换班时间,时间差不大于1分钟视为连续时段 - # 如[[22:00, 06:59], [05:00, 08:59], [09:00, 10:59], [13:00, 17:59]] - # 现在是22:00,下次在10:59之后换班即可,中间的06:59和08:59不必换班 - end_time = future_time_(periods_sorted[0][1]) - for period in periods_sorted[1:]: - start_time = future_time_(period[0]) - if start_time - end_time > datetime.timedelta(minutes=1): - break - end_time = max(end_time, future_time_(period[1])) break self.maa_start('Infrast', args) From 98f4533268fdd2b2d66c1f7d7eb8e78317a095db Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Tue, 8 Nov 2022 19:05:32 +0800 Subject: [PATCH 06/10] Refactor: Remove unused import --- submodule/AlasMaaBridge/module/handler/handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index dd3168a31..7993a93c8 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -11,7 +11,7 @@ from typing import Any from cached_property import cached_property from deploy.config import DeployConfig -from module.base.timer import Timer, future_time +from module.base.timer import Timer from module.config.utils import read_file, deep_get from module.device.connection_attr import ConnectionAttr from module.exception import RequestHumanTakeover From 870f2f2fbe72aeb7f732dbecbdd5ff54085a0667 Mon Sep 17 00:00:00 2001 From: SarContDeli <48789988+SaiCateDoan@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:16:49 +0800 Subject: [PATCH 07/10] Fix: InvalidChar missing in gui.yaml --- module/config/argument/args.json | 4 ++-- module/config/argument/gui.yaml | 1 + module/config/i18n/en-US.json | 2 +- module/config/i18n/ja-JP.json | 2 +- module/config/i18n/zh-CN.json | 2 +- module/config/i18n/zh-TW.json | 4 ++-- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 74fc07930..115a8f446 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3278,7 +3278,7 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20210121_cn", + "tw": "event_20211111_cn", "cn": "event_20220915_cn", "en": "event_20220915_cn", "jp": "event_20220915_cn" @@ -7974,4 +7974,4 @@ } } } -} +} \ No newline at end of file diff --git a/module/config/argument/gui.yaml b/module/config/argument/gui.yaml index 7017808ea..19f3eceab 100644 --- a/module/config/argument/gui.yaml +++ b/module/config/argument/gui.yaml @@ -57,6 +57,7 @@ AddAlas: CopyFrom: Confirm: FileExist: + InvalidChar: Update: UpToDate: diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index d1bdf09ac..ea20724ae 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -585,6 +585,7 @@ "name": "Event Name", "help": "Automatically selects to the latest event", "campaign_main": "campaign_main", + "event_20211111_cn": "The Flame-Touched Dagger", "raid_20221027": "Fight On Royal Maids!(Part 3)", "event_20210121_cn": "Empyreal Tragicomedy Rerun", "event_20220915_cn": "Violet Tempest Blooming Lycoris", @@ -616,7 +617,6 @@ "event_20201229_cn": "Inverted Orthant", "event_20211229_cn": "Tower of Transcendence", "event_20211125_cn": "World-spanning Arclight", - "event_20211111_cn": "The Flame-Touched Dagger", "event_20211028_tw": "復刻光與影的鳶尾之華", "event_20210722_cn": "Azur Anthem", "event_20210819_cn": "Microlayer Medley Rerun", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index ca1889b84..50032d7eb 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -585,6 +585,7 @@ "name": "Campaign.Event.name", "help": "Campaign.Event.help", "campaign_main": "campaign_main", + "event_20211111_cn": "燈火のシニエ", "raid_20221027": "戦え!ロイヤルメイド隊3rd", "event_20210121_cn": "悲歎せし焔海の詩(復刻)", "event_20220915_cn": "赫の涙月 菫の暁風", @@ -616,7 +617,6 @@ "event_20201229_cn": "虚畳なりし限象", "event_20211229_cn": "遡望せし虹彩の塔", "event_20211125_cn": "弧光は交わる世界にて", - "event_20211111_cn": "燈火のシニエ", "event_20211028_tw": "復刻光與影的鳶尾之華", "event_20210722_cn": "海に響くアイドルの歌", "event_20210819_cn": "闇靄払う銀翼(復刻)", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index bb3c2c77f..52a275e54 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -585,6 +585,7 @@ "name": "活动名称", "help": "自动选择至最新的活动", "campaign_main": "主线图", + "event_20211111_cn": "杰诺瓦的焰火", "raid_20221027": "战斗!皇家女仆队3rd", "event_20210121_cn": "复刻神圣的悲喜剧", "event_20220915_cn": "紫绛槿岚", @@ -616,7 +617,6 @@ "event_20201229_cn": "负象限作战", "event_20211229_cn": "逆转彩虹之塔", "event_20211125_cn": "交汇世界的弧光", - "event_20211111_cn": "杰诺瓦的焰火", "event_20211028_tw": "復刻光與影的鳶尾之華", "event_20210722_cn": "响彻碧海的偶像歌", "event_20210819_cn": "复刻微层混合", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 4f1a264da..ca3ebef2d 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -585,8 +585,8 @@ "name": "活動名稱", "help": "自動選擇至最新的活動圖", "campaign_main": "主線圖", - "raid_20221027": "Fight On Royal Maids!(Part 3)", "event_20211111_cn": "杰諾瓦的焰火", + "raid_20221027": "Fight On Royal Maids!(Part 3)", "event_20210121_cn": "復刻神聖的悲喜劇", "event_20220915_cn": "Violet Tempest Blooming Lycoris", "event_20210916_cn": "碧海光粼", @@ -2290,4 +2290,4 @@ "InvalidFeedBack": "格式錯誤。 示例:{0}" } } -} +} \ No newline at end of file From 8c4d6c770f2ce3a90f9e35bc7c926939c21837b9 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 9 Nov 2022 22:38:10 +0800 Subject: [PATCH 08/10] Fix: Retirement failed to confirm ships after being used by GemsFarming --- module/retire/retirement.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/module/retire/retirement.py b/module/retire/retirement.py index b90f3f606..1d107df4e 100644 --- a/module/retire/retirement.py +++ b/module/retire/retirement.py @@ -77,6 +77,7 @@ class Retirement(Enhancement, QuickRetireSettingHandler): backup, self._popup_offset = self._popup_offset, (20, 50) for button in [SHIP_CONFIRM, SHIP_CONFIRM_2, EQUIP_CONFIRM, EQUIP_CONFIRM_2, GET_ITEMS_1, SR_SSR_CONFIRM]: self.interval_clear(button) + timeout = Timer(10, count=10).start() while 1: if skip_first_screenshot: skip_first_screenshot = False @@ -84,9 +85,18 @@ class Retirement(Enhancement, QuickRetireSettingHandler): self.device.screenshot() # End - if executed and self.appear(IN_RETIREMENT_CHECK): - self.handle_info_bar() + if timeout.reached(): + # Ships being used by GemsFarming have no equipment to disassemble + # So `executed` is never set to True, causing infinite loop + # Handled with dirty timeout, a better fix is required + logger.warning('Wait _retirement_confirm timeout, assume finished') break + if self.appear(IN_RETIREMENT_CHECK): + if executed: + self.handle_info_bar() + break + else: + timeout.reset() # Click if self.appear(SHIP_CONFIRM, offset=(30, 30), interval=2) \ @@ -108,7 +118,6 @@ class Retirement(Enhancement, QuickRetireSettingHandler): if self.appear(GET_ITEMS_1, offset=(30, 30), interval=2): self.device.click(GET_ITEMS_1_RETIREMENT_SAVE) self.interval_reset(SHIP_CONFIRM) - executed = True continue if self._unable_to_enhance \ or self.config.Retirement_OldRetireSR \ From 6af9383cd40ab95ed8465e86209b61df7e9dc137 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 9 Nov 2022 22:58:11 +0800 Subject: [PATCH 09/10] Fix: Dont log empty check on LevelOcr --- module/combat/level.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/module/combat/level.py b/module/combat/level.py index f25f64d84..342e216fe 100644 --- a/module/combat/level.py +++ b/module/combat/level.py @@ -131,3 +131,12 @@ class LevelOcr(Digit): if first_digit + 3 < 46: # LV_GRID_MAIN.button_shape[0] = 46 return image[:, first_digit:] return np.array([[255]], dtype=np.uint8) + + def after_process(self, result): + result = result.replace('I', '1').replace('D', '0').replace('S', '5') + + # No correction log, cause levels are usually empty + # Like: [23, 0, 0, 100, 0, 0] + result = int(result) if result else 0 + + return result From 9cfc4d098f05d12956dd9a45cdcd40c6a8b52f3e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 9 Nov 2022 23:23:32 +0800 Subject: [PATCH 10/10] Fix: Handle empty mail list --- assets/cn/freebies/MAIL_EMPTY.png | Bin 0 -> 4276 bytes module/freebies/assets.py | 1 + module/freebies/mail.py | 16 +++++++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 assets/cn/freebies/MAIL_EMPTY.png diff --git a/assets/cn/freebies/MAIL_EMPTY.png b/assets/cn/freebies/MAIL_EMPTY.png new file mode 100644 index 0000000000000000000000000000000000000000..08c8a7ac634cdb8462739e4c36efd55d0af56f7e GIT binary patch literal 4276 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