diff options
author | George Hazan <ghazan@miranda.im> | 2017-01-11 15:28:56 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2017-01-11 15:29:06 +0300 |
commit | 499aee4b2b43b2835a4fb13410cd195fb5a4311a (patch) | |
tree | 2bb70f2b64a96b31ebbb32cec1d37e4b4465bc5c /protocols/Discord/src/proto.cpp | |
parent | 16fe45e4297e335f76719fcade05999a45a85349 (diff) |
message acks: read confirmations
Diffstat (limited to 'protocols/Discord/src/proto.cpp')
-rw-r--r-- | protocols/Discord/src/proto.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/protocols/Discord/src/proto.cpp b/protocols/Discord/src/proto.cpp index e8ac7c269c..ea3975a983 100644 --- a/protocols/Discord/src/proto.cpp +++ b/protocols/Discord/src/proto.cpp @@ -33,6 +33,7 @@ CDiscordProto::CDiscordProto(const char *proto_name, const wchar_t *username) : m_evRequestsQueue(CreateEvent(NULL, FALSE, FALSE, NULL)), m_wszDefaultGroup(this, DB_KEY_GROUP, DB_KEYVAL_GROUP), m_wszEmail(this, DB_KEY_EMAIL, L""), + arMarkReadQueue(1, compareUsers), arUsers(50, compareUsers) { // Services @@ -46,6 +47,7 @@ CDiscordProto::CDiscordProto(const char *proto_name, const wchar_t *username) : // Events HookProtoEvent(ME_OPT_INITIALISE, &CDiscordProto::OnOptionsInit); + HookProtoEvent(ME_DB_EVENT_MARKED_READ, &CDiscordProto::OnDbEventRead); // database db_set_resident(m_szModuleName, "XStatusMsg"); @@ -305,7 +307,7 @@ int CDiscordProto::SendMsg(MCONTACT hContact, int /*flags*/, const char *pszSrc) CMStringA szUrl(FORMAT, "/channels/%lld/messages", pUser->channelId); JSONNode body; body << WCHAR_PARAM("content", wszText); - AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_POST, szUrl, &CDiscordProto::OnReceiveMessageAck, &body); + AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_POST, szUrl, &CDiscordProto::OnReceiveMessage, &body); pReq->pUserInfo = (void*)hContact; Push(pReq); return pReq->m_iReqNum; @@ -313,6 +315,48 @@ int CDiscordProto::SendMsg(MCONTACT hContact, int /*flags*/, const char *pszSrc) ///////////////////////////////////////////////////////////////////////////////////////// +void CDiscordProto::MarkReadTimerProc(HWND hwnd, UINT, UINT_PTR id, DWORD) +{ + CDiscordProto *ppro = (CDiscordProto*)(id - 1); + + JSONNode root; root.push_back(JSONNode("token", NULL)); + + mir_cslock lck(ppro->csMarkReadQueue); + while (ppro->arMarkReadQueue.getCount()) { + CDiscordUser *pUser = ppro->arMarkReadQueue[0]; + CMStringA szUrl(FORMAT, "/channels/%lld/messages/%lld/ack", pUser->channelId, pUser->lastMessageId); + ppro->Push(new AsyncHttpRequest(ppro, REQUEST_POST, szUrl, &CDiscordProto::OnReceiveMessageAck)); + ppro->arMarkReadQueue.remove(0); + } + KillTimer(hwnd, id); +} + +int CDiscordProto::OnDbEventRead(WPARAM, LPARAM hDbEvent) +{ + MCONTACT hContact = db_event_getContact(hDbEvent); + if (!hContact) + return 0; + + // filter out only events of my protocol + const char *szProto = GetContactProto(hContact); + if (mir_strcmp(szProto, m_szModuleName)) + return 0; + + if (m_bOnline) { + SetTimer(g_hwndHeartbeat, UINT_PTR(this) + 1, 200, &CDiscordProto::MarkReadTimerProc); + + CDiscordUser *pUser = FindUser(getId(hContact, DB_KEY_ID)); + if (pUser != NULL) { + mir_cslock lck(csMarkReadQueue); + if (arMarkReadQueue.indexOf(pUser) == -1) + arMarkReadQueue.insert(pUser); + } + } + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + int CDiscordProto::OnModulesLoaded(WPARAM, LPARAM) { return 0; |