From 1a5dc583b048727752b8f72df676ec408908041f Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 28 Nov 2021 17:34:41 +0300 Subject: user typing notification for Discord group chats --- protocols/Discord/src/dispatch.cpp | 28 +++++++++++++++++++--------- protocols/Discord/src/groupchat.cpp | 4 ++++ 2 files changed, 23 insertions(+), 9 deletions(-) (limited to 'protocols/Discord') diff --git a/protocols/Discord/src/dispatch.cpp b/protocols/Discord/src/dispatch.cpp index fee35b6c06..45fba1fb94 100644 --- a/protocols/Discord/src/dispatch.cpp +++ b/protocols/Discord/src/dispatch.cpp @@ -532,22 +532,32 @@ void CDiscordProto::OnCommandReady(const JSONNode &pRoot) void CDiscordProto::OnCommandTyping(const JSONNode &pRoot) { - SnowFlake userId = ::getId(pRoot["user_id"]); SnowFlake channelId = ::getId(pRoot["channel_id"]); - debugLogA("user typing notification: userid=%lld, channelid=%lld", userId, channelId); + debugLogA("user typing notification: channelid=%lld", channelId); - CDiscordUser *pUser = FindUser(userId); - if (pUser == nullptr) { - debugLogA("user with id=%lld is not found", userId); + CDiscordUser *pChannel = FindUserByChannel(channelId); + if (pChannel == nullptr) { + debugLogA("channel with id=%lld is not found", channelId); return; } - if (pUser->channelId == channelId) { - debugLogA("user is typing in his private channel"); - CallService(MS_PROTO_CONTACTISTYPING, pUser->hContact, 20); + // both private groupchats & guild channels are chat rooms for Miranda + if (pChannel->pGuild) { + debugLogA("user is typing in a group channel"); + + CMStringW wszUerId = pRoot["user_id"].as_mstring(); + ProcessGuildUser(pChannel->pGuild, pRoot); // never returns null + + GCEVENT gce = { m_szModuleName, 0, GC_EVENT_TYPING }; + gce.pszID.w = pChannel->wszUsername; + gce.pszUID.w = wszUerId; + gce.dwItemData = 1; + gce.time = time(0); + Chat_Event(&gce); } else { - debugLogA("user is typing in a group channel, skipped"); + debugLogA("user is typing in his private channel"); + CallService(MS_PROTO_CONTACTISTYPING, pChannel->hContact, 20); } } diff --git a/protocols/Discord/src/groupchat.cpp b/protocols/Discord/src/groupchat.cpp index 8c68d1276f..4e4c69e949 100644 --- a/protocols/Discord/src/groupchat.cpp +++ b/protocols/Discord/src/groupchat.cpp @@ -225,6 +225,10 @@ int CDiscordProto::GroupchatEventHook(WPARAM, LPARAM lParam) case GC_USER_NICKLISTMENU: Chat_ProcessNickMenu(gch); break; + + case GC_USER_TYPNOTIFY: + UserIsTyping(gch->si->hContact, (int)gch->dwData); + break; } return 1; -- cgit v1.2.3