From dca63426a6bcfefd8bed9b294095fd41c85ddc19 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sat, 14 May 2022 01:19:54 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BF=A1=E7=94=A8=E5=95=86=E5=BA=97=E4=BC=98=E5=85=88=E8=B4=AD?= =?UTF-8?q?=E4=B9=B0=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/集成文档.md | 11 ++++--- resource/tasks.json | 12 ++++--- src/MeoAssistant/CreditShopImageAnalyzer.cpp | 20 +++++++++--- src/MeoAssistant/CreditShopImageAnalyzer.h | 2 +- src/MeoAssistant/MallTask.cpp | 32 +++++++++++++------ src/MeoAssistant/MallTask.h | 1 + src/MeoAsstGui/Helper/AsstProxy.cs | 6 ++-- .../UserControl/MallSettingsUserControl.xaml | 10 +++--- .../ViewModels/SettingsViewModel.cs | 32 +++++++------------ .../ViewModels/TaskQueueViewModel.cs | 5 +-- src/Python/sample.py | 4 +-- src/Python/timed_start/timed_sample.py | 4 +-- 12 files changed, 81 insertions(+), 58 deletions(-) diff --git a/docs/集成文档.md b/docs/集成文档.md index a2d03269cf..5f847c0da9 100644 --- a/docs/集成文档.md +++ b/docs/集成文档.md @@ -97,17 +97,20 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p 不支持设置参数 - `Mall` - 领取信用及商店购物 + 领取信用及商店购物。 + 会先有序的按 `buy_first` 购买一遍,再从左到右并避开 `blacklist` 购买第二遍 ```jsonc // 对应的任务参数 { "shopping": bool, // 是否购物,可选,默认 false。不支持运行中设置 - "shopping_list": [ // 购物列表,当 shopping 为 true 时必选。不支持运行中设置 + "buy_first": [ // 优先购买列表,可选。不支持运行中设置 + string, // 商品名,如 "招聘许可"、"龙门币" 等 + ], + "blacklist": [ // 黑名单列表,可选。不支持运行中设置 string, // 商品名,如 "加急许可"、"家具零件" 等 ... - ], - "is_black_list": bool // 购物列表是否是黑名单模式,可选,默认 false。不支持运行中设置 + ] } ``` diff --git a/resource/tasks.json b/resource/tasks.json index 08c2e67a2d..74271e08c8 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -2533,12 +2533,14 @@ 110 ] }, - "CreditShop-NotToBuy": { + "CreditShop-ProductName": { "algorithm": "OcrDetect", - "Doc": "这里的text,是子串搜索,即商品名中只要含有任一text,就不买", - "text": [ - "碳", - "家具" + "text": [], + "ocrReplace": [ + [ + "龙门.+", + "龙门币" + ] ], "roi": [ 0, diff --git a/src/MeoAssistant/CreditShopImageAnalyzer.cpp b/src/MeoAssistant/CreditShopImageAnalyzer.cpp index 4d161d5fbc..9bb93c5d83 100644 --- a/src/MeoAssistant/CreditShopImageAnalyzer.cpp +++ b/src/MeoAssistant/CreditShopImageAnalyzer.cpp @@ -59,16 +59,17 @@ bool asst::CreditShopImageAnalyzer::commoditys_analyze() bool asst::CreditShopImageAnalyzer::whether_to_buy_analyze() { - const auto not_to_buy_task_ptr = std::dynamic_pointer_cast( - Task.get("CreditShop-NotToBuy")); + const auto product_name_task_ptr = std::dynamic_pointer_cast( + Task.get("CreditShop-ProductName")); for (const Rect& commodity : m_commoditys) { // 商品名的区域 - Rect name_roi = not_to_buy_task_ptr->roi; + Rect name_roi = product_name_task_ptr->roi; name_roi.x += commodity.x; name_roi.y += commodity.y; OcrImageAnalyzer ocr_analyzer(m_image, name_roi); + ocr_analyzer.set_replace(product_name_task_ptr->replace_map); ocr_analyzer.set_required(m_shopping_list); if (ocr_analyzer.analyze()) { // 黑名单模式,有识别结果说明这个商品不买,直接跳过 @@ -84,8 +85,17 @@ bool asst::CreditShopImageAnalyzer::whether_to_buy_analyze() #ifdef ASST_DEBUG cv::rectangle(m_image_draw, utils::make_rect(commodity), cv::Scalar(0, 0, 255), 2); #endif - m_need_to_buy.emplace_back(commodity); + m_need_to_buy.emplace_back(commodity, ocr_analyzer.get_result().empty() ? std::string() : ocr_analyzer.get_result().front().text); } + + if (m_is_white_list) { + std::sort(m_need_to_buy.begin(), m_need_to_buy.end(), [&]( + const auto& lhs, const auto& rhs) -> bool { + return std::find(m_shopping_list.cbegin(), m_shopping_list.cend(), lhs.second) + < std::find(m_shopping_list.cbegin(), m_shopping_list.cend(), rhs.second); + }); + } + return !m_need_to_buy.empty(); } @@ -95,7 +105,7 @@ bool asst::CreditShopImageAnalyzer::sold_out_analyze() MatchImageAnalyzer sold_out_analyzer(m_image); sold_out_analyzer.set_task_info("CreditShop-SoldOut"); - for (const Rect& commodity : m_need_to_buy) { + for (const auto& [commodity, _] : m_need_to_buy) { sold_out_analyzer.set_roi(commodity); if (sold_out_analyzer.analyze()) { #ifdef ASST_DEBUG diff --git a/src/MeoAssistant/CreditShopImageAnalyzer.h b/src/MeoAssistant/CreditShopImageAnalyzer.h index 93e6f78f44..c18000bde7 100644 --- a/src/MeoAssistant/CreditShopImageAnalyzer.h +++ b/src/MeoAssistant/CreditShopImageAnalyzer.h @@ -34,7 +34,7 @@ namespace asst bool sold_out_analyze(); std::vector m_commoditys; - std::vector m_need_to_buy; + std::vector> m_need_to_buy; std::vector m_result; std::vector m_shopping_list; diff --git a/src/MeoAssistant/MallTask.cpp b/src/MeoAssistant/MallTask.cpp index 70b43531c6..19c9614d2d 100644 --- a/src/MeoAssistant/MallTask.cpp +++ b/src/MeoAssistant/MallTask.cpp @@ -6,12 +6,15 @@ asst::MallTask::MallTask(AsstCallback callback, void* callback_arg) : PackageTask(callback, callback_arg, TaskType), m_mall_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_shopping_first_task_ptr(std::make_shared(callback, callback_arg, TaskType)), m_shopping_task_ptr(std::make_shared(callback, callback_arg, TaskType)) { m_mall_task_ptr->set_tasks({ "MallBegin" }); - m_shopping_task_ptr->set_enable(false); + m_shopping_first_task_ptr->set_enable(false).set_retry_times(1); + m_shopping_task_ptr->set_enable(false).set_retry_times(1); m_subtasks.emplace_back(m_mall_task_ptr); + m_subtasks.emplace_back(m_shopping_first_task_ptr); m_subtasks.emplace_back(m_shopping_task_ptr); } @@ -20,24 +23,35 @@ bool asst::MallTask::set_params(const json::value& params) bool shopping = params.get("shopping", true); if (shopping) { - if (params.contains("shopping_list") && params.at("shopping_list").is_array()) { - std::vector shopping_list; - for (auto& name : params.at("shopping_list").as_array()) { - shopping_list.emplace_back(name.as_string()); + if (params.contains("buy_first") && params.at("buy_first").is_array()) { + std::vector buy_first; + for (auto& name : params.at("buy_first").as_array()) { + buy_first.emplace_back(name.as_string()); } - if (params.get("is_black_list", false) == true) { - m_shopping_task_ptr->set_black_list(std::move(shopping_list)); + if (!buy_first.empty()) { + m_shopping_first_task_ptr->set_white_list(std::move(buy_first)); + m_shopping_first_task_ptr->set_enable(true); } else { - m_shopping_task_ptr->set_white_list(std::move(shopping_list)); + m_shopping_first_task_ptr->set_enable(false); } } else { - return false; + m_shopping_first_task_ptr->set_enable(false); } + + if (params.contains("blacklist") && params.at("blacklist").is_array()) { + std::vector shopping_list; + for (auto& name : params.at("blacklist").as_array()) { + shopping_list.emplace_back(name.as_string()); + } + m_shopping_task_ptr->set_black_list(std::move(shopping_list)); + } + m_shopping_task_ptr->set_enable(true); } else { + m_shopping_first_task_ptr->set_enable(false); m_shopping_task_ptr->set_enable(false); } return true; diff --git a/src/MeoAssistant/MallTask.h b/src/MeoAssistant/MallTask.h index 71380a716d..1d36f5f333 100644 --- a/src/MeoAssistant/MallTask.h +++ b/src/MeoAssistant/MallTask.h @@ -17,6 +17,7 @@ namespace asst static constexpr const char* TaskType = "Mall"; private: std::shared_ptr m_mall_task_ptr = nullptr; + std::shared_ptr m_shopping_first_task_ptr = nullptr; std::shared_ptr m_shopping_task_ptr = nullptr; }; } diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index 2639a39e7c..dc6c321355 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -601,12 +601,12 @@ namespace MeoAsstGui return AsstAppendTaskWithEncoding("Visit"); } - public bool AsstAppendMall(bool with_shopping, bool blackMode, string[] shoppingList) + public bool AsstAppendMall(bool with_shopping, string[] firstlist, string[] blacklist) { var task_params = new JObject(); task_params["shopping"] = with_shopping; - task_params["shopping_list"] = new JArray { shoppingList }; - task_params["is_black_list"] = blackMode; + task_params["buy_first"] = new JArray { firstlist }; + task_params["blacklist"] = new JArray { blacklist }; return AsstAppendTaskWithEncoding("Mall", task_params); } diff --git a/src/MeoAsstGui/UserControl/MallSettingsUserControl.xaml b/src/MeoAsstGui/UserControl/MallSettingsUserControl.xaml index 10f4ee37f3..d52648ce08 100644 --- a/src/MeoAsstGui/UserControl/MallSettingsUserControl.xaml +++ b/src/MeoAsstGui/UserControl/MallSettingsUserControl.xaml @@ -16,13 +16,15 @@ - + + + + - + \ No newline at end of file diff --git a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs index d0835fecf9..20ab942de5 100644 --- a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs +++ b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs @@ -339,37 +339,27 @@ namespace MeoAsstGui } } - private bool _creditBlackMode = Convert.ToBoolean(ViewStatusStorage.Get("Mall.CreditBlackMode", bool.TrueString)); + private string _creditFirstList = ViewStatusStorage.Get("Mall.CreditFirstList", "招聘许可 龙门币"); - public bool CreditBlackMode + public string CreditFirstList { - get { return _creditBlackMode; } + get { return _creditFirstList; } set { - SetAndNotify(ref _creditBlackMode, value); - ViewStatusStorage.Set("Mall.CreditBlackMode", value.ToString()); + SetAndNotify(ref _creditFirstList, value); + ViewStatusStorage.Set("Mall.CreditFirstList", value.ToString()); } } - public static string Utf16ToUtf8(string utf16String) + private string _creditBlackList = ViewStatusStorage.Get("Mall.CreditBlackList", "碳 家具"); + + public string CreditBlackList { - // Get UTF16 bytes and convert UTF16 bytes to UTF8 bytes - byte[] utf16Bytes = Encoding.Unicode.GetBytes(utf16String); - byte[] utf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16Bytes); - - // Return UTF8 bytes as ANSI string - return Encoding.Default.GetString(utf8Bytes); - } - - private string _creditShoppingList = ViewStatusStorage.Get("Mall.CreditShoppingList", "碳 家具"); - - public string CreditShoppingList - { - get { return _creditShoppingList; } + get { return _creditBlackList; } set { - SetAndNotify(ref _creditShoppingList, value); - ViewStatusStorage.Set("Mall.CreditShoppingList", value.ToString()); + SetAndNotify(ref _creditBlackList, value); + ViewStatusStorage.Set("Mall.CreditBlackList", value.ToString()); } } diff --git a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs index ca5ef1e5b7..fb65017a7f 100644 --- a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs +++ b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs @@ -306,8 +306,9 @@ namespace MeoAsstGui { var settings = _container.Get(); var asstProxy = _container.Get(); - var shopping_list = settings.CreditShoppingList.Split(' '); - return asstProxy.AsstAppendMall(settings.CreditShopping, settings.CreditBlackMode, shopping_list); + var buy_first = settings.CreditFirstList.Split(' '); + var black_list = settings.CreditBlackList.Split(' '); + return asstProxy.AsstAppendMall(settings.CreditShopping, buy_first, black_list); } private bool appendRecruit() diff --git a/src/Python/sample.py b/src/Python/sample.py index ece7a5d820..c00b38c5e6 100644 --- a/src/Python/sample.py +++ b/src/Python/sample.py @@ -52,8 +52,8 @@ if __name__ == "__main__": asst.append_task('Visit') asst.append_task('Mall', { 'shopping': True, - 'shopping_list': ['家具', '碳'], - 'is_black_list': True + 'buy_first': ['招聘许可', '龙门币'], + 'blacklist': ['家具', '碳'], }) asst.append_task('Award') # asst.append_task('Copilot', { diff --git a/src/Python/timed_start/timed_sample.py b/src/Python/timed_start/timed_sample.py index 1bd65b1fd7..090411a605 100644 --- a/src/Python/timed_start/timed_sample.py +++ b/src/Python/timed_start/timed_sample.py @@ -48,8 +48,8 @@ def job(): asst.append_task('Visit') asst.append_task('Mall', { 'shopping': True, - 'shopping_list': ['家具', '碳'], - 'is_black_list': True + 'buy_first': ['招聘许可', '龙门币'], + 'blacklist': ['家具', '碳'], }) asst.append_task('Award')