初步完成公开招募的任务框架

This commit is contained in:
MistEO
2021-08-02 00:12:15 +08:00
parent 8685a60d00
commit 6d33bbcb86
6 changed files with 149 additions and 15 deletions

View File

@@ -24,7 +24,7 @@ namespace asst {
class AbstractTask;
enum class TaskMsg;
class Assistance
class MEOAPI_PORT Assistance
{
public:
Assistance();
@@ -33,6 +33,7 @@ namespace asst {
std::optional<std::string> catch_emulator(const std::string& emulator_name = std::string());
void start(const std::string& task);
void start_open_recruit(const std::vector<int>& required_level, bool set_time = true);
void stop(bool block = true);
@@ -41,6 +42,7 @@ namespace asst {
bool print_window(const std::string& filename, bool block = true);
// for debug
// 计算公开招募需要当前处在选择公招Tag的页面
// 参数:
// required_level需要的等级最优组合的最低等级在required_level中才会进行点击
@@ -49,6 +51,7 @@ namespace asst {
// std::vector< std::pair < Tags名vector这个Tags组合可能出的干员组合 > >
std::optional<std::vector<std::pair<std::vector<std::string>, OperCombs>>>
open_recruit(const std::vector<int>& required_level, bool set_time = true);
private:
static void working_proc(Assistance* pThis);
static void task_callback(TaskMsg msg, const json::value& detail, void* custom_arg);

View File

@@ -11,7 +11,7 @@
#include "Version.h"
namespace asst {
class Logger {
class MEOAPI_PORT Logger {
public:
~Logger() = default;

View File

@@ -9,6 +9,7 @@
#include <ostream>
#include "AsstDef.h"
#include "AsstAux.h"
namespace cv
{
@@ -24,6 +25,7 @@ namespace asst {
class WinMacro;
class Identify;
class Configer;
class RecruitConfiger;
enum class TaskMsg {
/* Error Msg */
@@ -36,9 +38,11 @@ namespace asst {
ReadyToSleep,
AppendTask,
TaskCompleted,
MissionStop
/* Trace Msg */
// Todo
MissionStop,
/* Open Recruit Msg */
DetectText,
DetectTags,
RecruitCombs
};
static std::ostream& operator<<(std::ostream& os, const TaskMsg& type)
{
@@ -51,8 +55,10 @@ namespace asst {
{TaskMsg::ReadyToSleep, "ReadyToSleep"},
{TaskMsg::AppendTask, "AppendTask"},
{TaskMsg::TaskCompleted, "TaskCompleted"},
{TaskMsg::MissionStop, "MissionStop"}
{TaskMsg::MissionStop, "MissionStop"},
{TaskMsg::DetectText, "DetectText"},
{TaskMsg::DetectTags, "DetectTags"},
{TaskMsg::RecruitCombs, "RecruitCombs"}
};
return os << _type_name.at(type);
}
@@ -109,4 +115,49 @@ namespace asst {
Configer* m_configer_ptr = NULL;
std::vector<std::string> m_cur_tasks_name;
};
class OcrAbstractTask : public AbstractTask
{
public:
OcrAbstractTask(TaskCallback callback, void* callback_arg);
virtual bool run() override = 0 ;
protected:
std::vector<TextArea> ocr_detect();
template<typename FilterArray, typename ReplaceMap>
std::vector<TextArea> text_filter(const std::vector<TextArea>& src,
const FilterArray& filter_array, const ReplaceMap& replace_map)
{
std::vector<TextArea> dst;
for (const TextArea& text_area : src) {
TextArea temp = text_area;
for (const auto& [old_str, new_str] : replace_map) {
temp.text = StringReplaceAll(temp.text, old_str, new_str);
}
for (const auto& text : filter_array) {
if (temp.text == text) {
dst.emplace_back(std::move(temp));
}
}
}
return dst;
}
};
class OpenRecruitTask : public OcrAbstractTask
{
public:
OpenRecruitTask(TaskCallback callback, void* callback_arg,
Configer * configer_ptr, RecruitConfiger * recruit_configer_ptr);
virtual bool run() override;
virtual void set_param(std::vector<int> required_level, bool set_time = true);
protected:
std::vector<int> m_required_level;
bool m_set_time = false;
Configer* m_configer_ptr = NULL;
RecruitConfiger* m_recruit_configer_ptr = NULL;
};
}

View File

@@ -113,6 +113,23 @@ void Assistance::start(const std::string& task)
m_condvar.notify_one();
}
void asst::Assistance::start_open_recruit(const std::vector<int>& required_level, bool set_time)
{
DebugTraceFunction;
if (!m_thread_idle || !m_inited) {
return;
}
std::unique_lock<std::mutex> lock(m_mutex);
auto task_ptr = std::make_shared<OpenRecruitTask>(task_callback, (void*)this, &m_configer, &m_recruit_configer);
task_ptr->set_param(required_level, set_time);
m_tasks_queue.emplace(task_ptr);
m_thread_idle = false;
m_condvar.notify_one();
}
void Assistance::stop(bool block)
{
DebugTraceFunction;
@@ -391,6 +408,7 @@ void Assistance::working_proc(Assistance* pThis)
[&]() -> bool { return pThis->m_thread_idle; });
}
else {
pThis->m_thread_idle = true;
pThis->m_condvar.wait(lock);
}
}

View File

@@ -5,6 +5,7 @@
#include "Configer.h"
#include "RecruitConfiger.h"
#include "json.h"
#include "AsstAux.h"
#include <chrono>
#include <thread>
@@ -225,4 +226,71 @@ void MatchTask::exec_click_task(TaskInfo& task, const asst::Rect& matched_rect)
}
m_control_ptr->click(matched_rect);
}
}
OcrAbstractTask::OcrAbstractTask(TaskCallback callback, void* callback_arg)
: AbstractTask(callback, callback_arg)
{
;
}
std::vector<TextArea> OcrAbstractTask::ocr_detect()
{
const cv::Mat& image = get_format_image();
return m_identify_ptr->ocr_detect(image);
}
OpenRecruitTask::OpenRecruitTask(TaskCallback callback, void* callback_arg,
Configer* configer_ptr, RecruitConfiger* recruit_configer_ptr)
: OcrAbstractTask(callback, callback_arg),
m_configer_ptr(configer_ptr),
m_recruit_configer_ptr(recruit_configer_ptr)
{
;
}
bool OpenRecruitTask::run()
{
if (m_view_ptr == NULL
|| m_control_ptr == NULL
|| m_identify_ptr == NULL
|| m_control_ptr == NULL
|| m_recruit_configer_ptr == NULL)
{
m_callback(TaskMsg::PtrIsNull, json::value(), m_callback_arg);
return false;
}
/* Find all text */
std::vector<TextArea> all_text_area = ocr_detect();
std::vector<json::value> all_text_json_vector;
for (const TextArea& text_area : all_text_area) {
all_text_json_vector.emplace_back(Utf8ToGbk(text_area.text));
}
json::value all_text_json;
all_text_json["text"] = json::array(all_text_json_vector);
m_callback(TaskMsg::DetectText, all_text_json, m_callback_arg);
/* Filter out all tags from all text */
std::vector<TextArea> all_tags = text_filter(all_text_area, m_recruit_configer_ptr->m_all_tags, m_configer_ptr->m_ocr_replace);
std::vector<json::value> all_tags_json_vector;
for (const TextArea& text_area : all_tags) {
all_tags_json_vector.emplace_back(Utf8ToGbk(text_area.text));
}
json::value all_tags_json;
all_tags_json["tags"] = json::array(all_tags_json_vector);
m_callback(TaskMsg::DetectText, all_tags_json, m_callback_arg);
return true;
}
void OpenRecruitTask::set_param(std::vector<int> required_level, bool set_time)
{
m_required_level = std::move(required_level);
m_set_time = set_time;
}

View File

@@ -37,13 +37,7 @@ void asst_ocr_test()
}
char c = 0;
while (c != 'q') {
std::ifstream ifs(GetCurrentDir() + "name.txt");
std::string person_name;
ifs >> person_name;
asst.open_recruit({ 4, 5 });
asst.start_open_recruit({ 3, 4, 5 });
c = getchar();
}
}