From e1ce8dafa01406edc8b2e3540c3f7a4ae3bdfadd Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 19 Dec 2024 19:50:20 +0300 Subject: Steam: fix for user typing notification --- protocols/Steam/src/steam_messages.cpp | 45 ++++++++++++++++++---------------- protocols/Steam/src/steam_proto.cpp | 5 ++-- protocols/Steam/src/steam_proto.h | 2 +- 3 files changed, 28 insertions(+), 24 deletions(-) (limited to 'protocols') diff --git a/protocols/Steam/src/steam_messages.cpp b/protocols/Steam/src/steam_messages.cpp index b6a4ee7bc3..f41ec3b84f 100644 --- a/protocols/Steam/src/steam_messages.cpp +++ b/protocols/Steam/src/steam_messages.cpp @@ -1,17 +1,13 @@ #include "stdafx.h" -void CSteamProto::SendFriendMessage(uint32_t msgId, int64_t steamId, const char *pszMessage) +int64_t CSteamProto::SendFriendMessage(EChatEntryType entry_type, int64_t steamId, const char *pszMessage) { CFriendMessagesSendMessageRequest request; - request.chat_entry_type = (int)EChatEntryType::ChatMsg; request.has_chat_entry_type = true; + request.chat_entry_type = (int)entry_type; request.has_chat_entry_type = true; request.contains_bbcode = request.has_contains_bbcode = true; request.steamid = steamId; request.has_steamid = true; request.message = (char *)pszMessage; - - auto iSourceId = WSSendService(FriendSendMessage, request); - mir_cslock lck(m_csOwnMessages); - if (COwnMessage *pOwn = m_arOwnMessages.find((COwnMessage *)&msgId)) - pOwn->iSourceId = iSourceId; + return WSSendService(FriendSendMessage, request); } void CSteamProto::OnMessageSent(const CFriendMessagesSendMessageResponse &reply, const CMsgProtoBufHeader &hdr) @@ -48,20 +44,30 @@ void CSteamProto::OnMessageSent(const CFriendMessagesSendMessageResponse &reply, void CSteamProto::OnGotIncomingMessage(const CFriendMessagesIncomingMessageNotification &reply, const CMsgProtoBufHeader &) { - MCONTACT hContact = GetContact(AccountIdToSteamId(reply.steamid_friend)); + MCONTACT hContact = GetContact(reply.steamid_friend); if (!hContact) { debugLogA("message from unknown account %lld ignored", reply.steamid_friend); return; } - DB::EventInfo dbei; - dbei.flags = DBEF_UTF; - if (reply.has_local_echo && reply.local_echo) - dbei.flags |= DBEF_SENT; - dbei.cbBlob = (int)mir_strlen(reply.message); - dbei.pBlob = reply.message; - dbei.timestamp = reply.has_rtime32_server_timestamp ? reply.rtime32_server_timestamp : time(0); - ProtoChainRecvMsg(hContact, dbei); + switch (EChatEntryType(reply.chat_entry_type)) { + case EChatEntryType::ChatMsg: + { + DB::EventInfo dbei; + dbei.flags = DBEF_UTF; + if (reply.has_local_echo && reply.local_echo) + dbei.flags |= DBEF_SENT; + dbei.cbBlob = (int)mir_strlen(reply.message); + dbei.pBlob = reply.message; + dbei.timestamp = reply.has_rtime32_server_timestamp ? reply.rtime32_server_timestamp : time(0); + ProtoChainRecvMsg(hContact, dbei); + } + break; + + case EChatEntryType::Typing: + CallService(MS_PROTO_CONTACTISTYPING, hContact, 10); + break; + } } ///////////////////////////////////////////////////////////////////////////////////////// @@ -69,10 +75,7 @@ void CSteamProto::OnGotIncomingMessage(const CFriendMessagesIncomingMessageNotif int CSteamProto::UserIsTyping(MCONTACT hContact, int type) { // NOTE: Steam doesn't support sending "user stopped typing" so we're sending only positive info - if (type == PROTOTYPE_SELFTYPING_OFF) - return 0; - - ptrA steamId(getStringA(hContact, DBKEY_STEAM_ID)); - //SendRequest(new SendTypingRequest(m_szAccessToken, m_szUmqId, steamId)); + if (type == PROTOTYPE_SELFTYPING_ON) + SendFriendMessage(EChatEntryType::Typing, GetId(hContact, DBKEY_STEAM_ID), ""); return 0; } diff --git a/protocols/Steam/src/steam_proto.cpp b/protocols/Steam/src/steam_proto.cpp index c61ba628cd..2fcbfb72f3 100644 --- a/protocols/Steam/src/steam_proto.cpp +++ b/protocols/Steam/src/steam_proto.cpp @@ -213,12 +213,13 @@ int CSteamProto::SendMsg(MCONTACT hContact, MEVENT, const char *message) return -1; UINT hMessage = InterlockedIncrement(&hMessageProcess); + auto *pOwn = new COwnMessage(hContact, hMessage); { mir_cslock lck(m_csOwnMessages); - m_arOwnMessages.insert(new COwnMessage(hContact, hMessage)); + m_arOwnMessages.insert(pOwn); } - SendFriendMessage(hMessage, GetId(hContact, DBKEY_STEAM_ID), message); + pOwn->iSourceId = SendFriendMessage(EChatEntryType::ChatMsg, GetId(hContact, DBKEY_STEAM_ID), message); return hMessage; } diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h index 17d62c3a75..02a613c617 100644 --- a/protocols/Steam/src/steam_proto.h +++ b/protocols/Steam/src/steam_proto.h @@ -253,7 +253,7 @@ class CSteamProto : public PROTO mir_cs m_csOwnMessages; OBJLIST m_arOwnMessages; - void SendFriendMessage(uint32_t msgId, int64_t steamId, const char *pszMessage); + int64_t SendFriendMessage(EChatEntryType, int64_t steamId, const char *pszMessage); void OnGotIncomingMessage(const CFriendMessagesIncomingMessageNotification &reply, const CMsgProtoBufHeader &hdr); void OnMessageSent(const CFriendMessagesSendMessageResponse &reply, const CMsgProtoBufHeader &hdr); int __cdecl OnPreCreateMessage(WPARAM, LPARAM lParam); -- cgit v1.2.3