Skip to content

Commit

Permalink
使插件在启用前不会收到其它事件
Browse files Browse the repository at this point in the history
  • Loading branch information
super1207 committed Feb 3, 2022
1 parent f47e00c commit c96502d
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 97 deletions.
15 changes: 14 additions & 1 deletion src/MiraiCQ/MiraiCQ/center/center.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,25 @@ int Center::enable_all_plus()
return success_num;
}

static void IPC_SendEvent_T(const char* msg)
{
auto plus = MiraiPlus::get_instance()->get_all_plus();
for (auto p : plus) {
IPC_SendEvent(p.second->uuid.c_str(), msg);
}
}

int Center::del_all_plus()
{
//先禁用插件,防止插件再收到事件
auto plus = MiraiPlus::get_instance()->get_all_plus();
for (auto p : plus) {
p.second->is_enable = false;
}
// 发送主进程退出事件
Json::Value to_send;
to_send["event_type"] = "exit";
IPC_SendEvent(to_send.toStyledString().c_str());
IPC_SendEvent_T(to_send.toStyledString().c_str());
return 0;
}

Expand Down
32 changes: 21 additions & 11 deletions src/MiraiCQ/MiraiCQ/center/event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,16 @@ void Center::deal_event(MiraiNet::NetStruct evt)

}

static void IPC_SendEvent_T(const char * msg)
{
auto plus = MiraiPlus::get_instance()->get_all_plus();
for (auto p : plus) {
if (p.second->is_enable) {
IPC_SendEvent(p.second->uuid.c_str(), msg);
}
}
}

void Center::deal_type_message(Json::Value& evt)
{
// 处理message事件中的message_id
Expand Down Expand Up @@ -148,7 +158,7 @@ void Center::deal_type_notice_group_upload(Json::Value& evt)
to_send["data"]["from_group"] = group_id;
to_send["data"]["from_qq"] = user_id;
to_send["data"]["file_base64"] = file_base64;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}

void Center::deal_type_notice_group_admin(Json::Value& evt)
Expand All @@ -173,7 +183,7 @@ void Center::deal_type_notice_group_admin(Json::Value& evt)
to_send["data"]["send_time"] = time_;
to_send["data"]["from_group"] = group_id;
to_send["data"]["being_operate_qq"] = user_id;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}

void Center::deal_type_notice_group_decrease(Json::Value& evt)
Expand Down Expand Up @@ -204,7 +214,7 @@ void Center::deal_type_notice_group_decrease(Json::Value& evt)
to_send["data"]["from_group"] = group_id;
to_send["data"]["from_qq"] = operator_id;
to_send["data"]["being_operate_qq"] = user_id;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}

void Center::deal_type_notice_group_increase(Json::Value& evt)
Expand All @@ -231,7 +241,7 @@ void Center::deal_type_notice_group_increase(Json::Value& evt)
to_send["data"]["from_group"] = group_id;
to_send["data"]["from_qq"] = operator_id;
to_send["data"]["being_operate_qq"] = user_id;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}

void Center::deal_type_notice_group_ban(Json::Value& evt)
Expand Down Expand Up @@ -260,7 +270,7 @@ void Center::deal_type_notice_group_ban(Json::Value& evt)
to_send["data"]["from_qq"] = operator_id;
to_send["data"]["being_operate_qq"] = user_id;
to_send["data"]["duration"] = duration;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}

void Center::deal_type_notice_friend_add(Json::Value& evt)
Expand All @@ -273,7 +283,7 @@ void Center::deal_type_notice_friend_add(Json::Value& evt)
to_send["data"]["sub_type"] = 1;
to_send["data"]["send_time"] = time_;
to_send["data"]["from_qq"] = user_id;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}

void Center::deal_type_request_friend(Json::Value& evt)
Expand All @@ -290,7 +300,7 @@ void Center::deal_type_request_friend(Json::Value& evt)
to_send["data"]["from_qq"] = user_id;
to_send["data"]["msg"] = comment;
to_send["data"]["response_flag"] = response_flag;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}

void Center::deal_type_request_group(Json::Value& evt)
Expand Down Expand Up @@ -319,7 +329,7 @@ void Center::deal_type_request_group(Json::Value& evt)
to_send["data"]["from_qq"] = user_id;
to_send["data"]["msg"] = comment;
to_send["data"]["response_flag"] = response_flag;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}

void Center::deal_type_request(Json::Value& evt)
Expand Down Expand Up @@ -540,7 +550,7 @@ void Center::deal_type_message_private(Json::Value& evt)
to_send["data"]["from_qq"] = user_id;
to_send["data"]["msg"] = cq_str;
to_send["data"]["font"] = font;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}


Expand Down Expand Up @@ -589,7 +599,7 @@ void Center::deal_type_message_group(Json::Value& evt)
to_send["data"]["anonymous"] = from_anonymous_base64;
to_send["data"]["msg"] = cq_str;
to_send["data"]["font"] = font;
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}


Expand All @@ -598,5 +608,5 @@ void Center::deal_1207_event(Json::Value& evt)
Json::Value to_send;
to_send["event_type"] = "cq_1207_event";
to_send["data"]["msg"] = Json::FastWriter().write(evt);
IPC_SendEvent(Json::FastWriter().write(to_send).c_str());
IPC_SendEvent_T(Json::FastWriter().write(to_send).c_str());
}
1 change: 0 additions & 1 deletion src/MiraiCQ/MiraiCQ/plus/MiraiPlus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,6 @@ bool MiraiPlus::load_plus(const std::string& dll_name, std::string & err_msg)
/* 关闭不需要的句柄,MiraiCQ通过uuid与共享内存与插件进程通信,不需要句柄 */
CloseHandle(pi.hThread);
plus_def->process_handle = pi.hProcess;
IPC_AddUUID(plus_def->uuid.c_str());
Json::Value to_send;
to_send["action"] = "is_load";
bool is_load = false;
Expand Down
110 changes: 28 additions & 82 deletions src/MiraiCQ/MiraiCQ/tool/IPCTool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,16 @@ class IPCSerClass
{
return uuid;
}
void send_event(const std::string& evt)
void send_event(const std::string & uuid,const std::string& evt)
{
std::lock_guard<std::mutex> lock(mx_event_send_list);
if (event_send_list.size() > max_send_list) {
event_send_list.clear();

AutoCloseHandle ah(CreateFileA(("\\\\.\\mailslot\\EVENT" + uuid).c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));
HANDLE hMailslot = ah.get_handle();
if (INVALID_HANDLE_VALUE == hMailslot) {
return;
}
event_send_list.push_back(evt);
cv_event.notify_one();
DWORD d;
WriteFile(hMailslot, evt.data(), evt.size(), &d, NULL);
}
std::string get_api()
{
Expand All @@ -138,15 +140,6 @@ class IPCSerClass
api_recv_list.pop_front();
return ret;
}
bool add_uuid(const std::string& uuid)
{
if (uuid.size() != 36) {
return false;
}
std::unique_lock<std::shared_mutex> lock(mx_uuid_vec);
uuid_vec.push_back(uuid);
return true;
}

static bool send_api(const std::string& flag, const std::string& s)
{
Expand Down Expand Up @@ -179,80 +172,42 @@ class IPCSerClass
}
//event_flag = "EVENT" + uuid;
api_flag = "API" + uuid;

std::thread([&]() {
//ipc::route cc{ event_flag.c_str() };
AutoCloseHandle ah(CreateMailslotA(("\\\\.\\mailslot\\" + api_flag).c_str(), 0, MAILSLOT_WAIT_FOREVER, NULL));
HANDLE hMailslot = ah.get_handle();
if (INVALID_HANDLE_VALUE == hMailslot) {
MiraiLog::get_instance()->add_fatal_log("IPCSerClass", "CreateMailslotA Failed" + std::to_string(GetLastError()));
exit(-1);
}

++run_flag;
while (true) {
std::string to_send;
{
std::unique_lock<std::mutex> lock(mx_event_send_list);
cv_event.wait(lock, [&] {return event_send_list.size() > 0;});
to_send = (*event_send_list.begin());
event_send_list.pop_front();
}
if (to_send != "")
{
std::shared_lock<std::shared_mutex> lock(mx_uuid_vec);
// 发给每一个客户端
for (auto& id : uuid_vec) {
std::string t = "EVENT" + id;
AutoCloseHandle ah(CreateFileA(("\\\\.\\mailslot\\" + t).c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));
HANDLE hMailslot = ah.get_handle();
if (INVALID_HANDLE_VALUE == hMailslot) {
continue;
}
DWORD d;
WriteFile(hMailslot, to_send.data(), to_send.size(), &d, NULL);
}
std::string tt = read_sth_from_slot(hMailslot);
std::lock_guard<std::mutex> lock(mx_api_recv_list);
if (api_recv_list.size() > max_recv_list) {
api_recv_list.clear();
}
api_recv_list.push_back(tt);
cv_api.notify_all();
}
}).detach();

std::thread([&]() {
AutoCloseHandle ah(CreateMailslotA(("\\\\.\\mailslot\\" + api_flag).c_str(), 0, MAILSLOT_WAIT_FOREVER, NULL));
HANDLE hMailslot = ah.get_handle();
if (INVALID_HANDLE_VALUE == hMailslot) {
MiraiLog::get_instance()->add_fatal_log("IPCSerClass", "CreateMailslotA Failed" + std::to_string(GetLastError()));
exit(-1);
}

++run_flag;
while (true) {
std::string tt = read_sth_from_slot(hMailslot);
std::lock_guard<std::mutex> lock(mx_api_recv_list);
if (api_recv_list.size() > max_recv_list) {
api_recv_list.clear();
}
api_recv_list.push_back(tt);
cv_api.notify_all();
}
}).detach();


while (true)
{
if (run_flag == 2)break;
Sleep(10);
}
while (true)
{
if (run_flag == 1)break;
Sleep(10);
}
}
std::string uuid;
std::string event_flag;
std::string api_flag;
std::atomic_int run_flag = 0;

std::mutex mx_event_send_list;
std::list<std::string> event_send_list;
const size_t max_send_list = 1024;
std::condition_variable cv_event;

std::mutex mx_api_recv_list;
std::list<std::string> api_recv_list;
const size_t max_recv_list = 1024;
std::condition_variable cv_api;

std::vector<std::string> uuid_vec;
std::shared_mutex mx_uuid_vec;
};

#ifdef __cplusplus
Expand Down Expand Up @@ -288,12 +243,12 @@ extern "C" {
}
}

void IPC_SendEvent(const char* msg)
void IPC_SendEvent(const char * uuid,const char* msg)
{
if (!msg)
return;
try {
IPCSerClass::getInstance()->send_event(msg);
IPCSerClass::getInstance()->send_event(uuid,msg);
}
catch (const std::exception& e) {
MiraiLog::get_instance()->add_fatal_log("IPC_SendEvent", "未知异常 in IPC_SendEvent:" + std::string(e.what()));
Expand Down Expand Up @@ -342,15 +297,6 @@ extern "C" {
}
}

int IPC_AddUUID(const char* uuid)
{
if (!uuid) {
return -1;
}
bool ret = IPCSerClass::getInstance()->add_uuid(uuid);
return (ret ? 0 : -1);
}

void IPC_ApiReply(const char* sender, const char* flag, const char* msg)
{
try {
Expand Down
3 changes: 1 addition & 2 deletions src/MiraiCQ/MiraiCQ/tool/IPCTool.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ extern "C" {
const char* IPC_ApiSend(const char* remote_uuid, const char* msg, int tm);

/* mainproess发送事件 */
void IPC_SendEvent(const char* msg);
void IPC_SendEvent(const char *uuic,const char* msg);

/* plusprocess接收事件,此函数会阻塞到接收事件为止 */
const char* IPC_GetEvent(const char* flag);
Expand All @@ -33,7 +33,6 @@ extern "C" {
/* 用于mainprocess获取main_uuid,然后传给子进程*/
const char* IPC_GetFlag();

int IPC_AddUUID(const char* uuid);

#ifdef __cplusplus
}
Expand Down

0 comments on commit c96502d

Please sign in to comment.