refactor(util): extract common functions from message_sender to util

This commit is contained in:
Changhua 2025-03-05 21:10:08 +08:00
parent ccc8dcbbcd
commit 2dc1f25b75
3 changed files with 28 additions and 49 deletions

View File

@ -268,15 +268,17 @@ std::unique_ptr<WxString> new_wx_string(const wchar_t *wstr)
std::unique_ptr<WxString> new_wx_string(const std::wstring &wstr) { return std::make_unique<WxString>(wstr); }
std::vector<WxString> parse_wxids(const std::string &wxids)
AtWxidSplitResult<> parse_wxids(const std::string &atWxids)
{
std::vector<WxString> wx_members;
std::wstringstream wss(s2w(wxids));
std::wstring wstr;
while (getline(wss, wstr, L',')) {
wx_members.emplace_back(wstr);
AtWxidSplitResult<> result;
if (!atWxids.empty()) {
std::wstringstream wss(util::s2w(atWxids));
for (std::wstring wxid; std::getline(wss, wxid, L',');) {
result.wxids.push_back(wxid);
result.wxWxids.emplace_back(result.wxids.back());
}
}
return wx_members;
return result;
}
WxString *CreateWxString(const std::string &s)

View File

@ -76,14 +76,24 @@ template <typename T> static T *AllocBuffer(size_t count)
return reinterpret_cast<T *>(HeapAlloc(GetProcessHeap(), 8, sizeof(T) * count));
}
template <typename T> struct WxStringHolder {
std::wstring ws;
WxString wx;
explicit WxStringHolder(const T &str) : ws(util::s2w(str)), wx(ws) { }
};
template <typename StringT = std::wstring> struct AtWxidSplitResult {
std::vector<StringT> wxids;
std::vector<WxString> wxWxids;
};
WxString *CreateWxString(const std::string &s);
void FreeWxString(WxString *wxStr);
AtWxidSplitResult<> parse_wxids(const std::string &atWxids);
std::unique_ptr<WxString> new_wx_string(const char *str);
std::unique_ptr<WxString> new_wx_string(const wchar_t *wstr);
std::unique_ptr<WxString> new_wx_string(const std::string &str);
std::unique_ptr<WxString> new_wx_string(const std::wstring &wstr);
std::vector<WxString> parse_wxids(const std::string &wxids);
} // namespace util

View File

@ -44,45 +44,12 @@ Sender::Sender()
func_xml_buf_sign = reinterpret_cast<XmlBufSign_t>(g_WeChatWinDllAddr + OsSend::XML_BUF_SIGN);
}
std::unique_ptr<WxString> Sender::new_wx_string(const char *str)
{
return new_wx_string(str ? std::string(str) : std::string());
}
std::unique_ptr<WxString> Sender::new_wx_string(const std::string &str)
{
return std::make_unique<WxString>(util::s2w(str));
}
template <typename T> struct WxStringHolder {
std::wstring ws;
WxString wx;
explicit WxStringHolder(const T &str) : ws(util::s2w(str)), wx(ws) { }
};
template <typename StringT = std::wstring> struct AtWxidSplitResult {
std::vector<StringT> wxids;
std::vector<WxString> wxWxids;
};
AtWxidSplitResult<> parse_wxids(const std::string &atWxids)
{
AtWxidSplitResult<> result;
if (!atWxids.empty()) {
std::wstringstream wss(util::s2w(atWxids));
for (std::wstring wxid; std::getline(wss, wxid, L',');) {
result.wxids.push_back(wxid);
result.wxWxids.emplace_back(result.wxids.back());
}
}
return result;
}
void Sender::send_text(const std::string &wxid, const std::string &msg, const std::string &at_wxids)
{
WxStringHolder<std::string> holderMsg(msg);
WxStringHolder<std::string> holderWxid(wxid);
util::WxStringHolder<std::string> holderMsg(msg);
util::WxStringHolder<std::string> holderWxid(wxid);
auto wxAtWxids = parse_wxids(at_wxids).wxWxids;
auto wxAtWxids = util::parse_wxids(at_wxids).wxWxids;
QWORD pWxAtWxids = wxAtWxids.empty() ? 0 : reinterpret_cast<QWORD>(&wxAtWxids);
char buffer[1104] = { 0 };
@ -93,8 +60,8 @@ void Sender::send_text(const std::string &wxid, const std::string &msg, const st
void Sender::send_image(const std::string &wxid, const std::string &path)
{
WxStringHolder<std::string> holderWxid(wxid);
WxStringHolder<std::string> holderPath(path);
util::WxStringHolder<std::string> holderWxid(wxid);
util::WxStringHolder<std::string> holderPath(path);
char msg[1192] = { 0 };
char msgTmp[1192] = { 0 };
@ -258,8 +225,8 @@ int Sender::send_pat(const std::string &roomid, const std::string &wxid)
{
QWORD status = -1;
WxStringHolder<std::string> holderRoom(roomid);
WxStringHolder<std::string> holderWxid(wxid);
util::WxStringHolder<std::string> holderRoom(roomid);
util::WxStringHolder<std::string> holderWxid(wxid);
status = func_send_pat(&holderRoom.wx, &holderWxid.wx);