diff options
| -rw-r--r-- | protocols/Teams/src/teams_history.cpp | 2 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_http.cpp | 7 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_proto.h | 2 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_trouter.cpp | 88 |
4 files changed, 26 insertions, 73 deletions
diff --git a/protocols/Teams/src/teams_history.cpp b/protocols/Teams/src/teams_history.cpp index 4e16c4261d..94a5a0c0a6 100644 --- a/protocols/Teams/src/teams_history.cpp +++ b/protocols/Teams/src/teams_history.cpp @@ -87,7 +87,7 @@ void CTeamsProto::OnSyncConversations(MHttpResponse *response, AsyncHttpRequest void CTeamsProto::RefreshConversations() { auto *pReq = new AsyncHttpRequest(REQUEST_GET, HOST_CHATS, "/users/ME/conversations", &CTeamsProto::OnSyncConversations); - pReq << INT64_PARAM("startTime", 0) << INT_PARAM("pageSize", 100) + pReq << INT64_PARAM("startTime", getLastTime(0)) << INT_PARAM("pageSize", 100) << CHAR_PARAM("view", "msnp24Equivalent") << CHAR_PARAM("targetType", "Passport|Skype|Lync|Thread|PSTN|Agent"); PushRequest(pReq); diff --git a/protocols/Teams/src/teams_http.cpp b/protocols/Teams/src/teams_http.cpp index 9f90bebe71..298789295b 100644 --- a/protocols/Teams/src/teams_http.cpp +++ b/protocols/Teams/src/teams_http.cpp @@ -98,6 +98,7 @@ MHttpResponse* CTeamsProto::DoSend(AsyncHttpRequest *pReq) pReq->AddHeader("X-MS-Client-Consumer-Type", "teams4life"); switch (pReq->m_host) { + case HOST_CHATS: case HOST_CONTACTS: pReq->AddAuthentication(this); pReq->AddHeader("Accept", "application/json"); @@ -125,12 +126,6 @@ MHttpResponse* CTeamsProto::DoSend(AsyncHttpRequest *pReq) pReq->AddHeader("ms-ic3-additional-product", "Sfl"); break; - case HOST_CHATS: - pReq->AddAuthentication(this); - pReq->AddHeader("MS-IC3-Product", "Sfl"); - pReq->AddHeader("Accept", "application/json"); - break; - case HOST_API: if (m_szSkypeToken) pReq->AddHeader("X-Skypetoken", m_szSkypeToken); diff --git a/protocols/Teams/src/teams_proto.h b/protocols/Teams/src/teams_proto.h index 775152e973..921a8e1ef1 100644 --- a/protocols/Teams/src/teams_proto.h +++ b/protocols/Teams/src/teams_proto.h @@ -351,11 +351,11 @@ private: MHttpHeaders m_connectParams; int iCommandId; + void ProcessEvent(const JSONNode &node); void ProcessNewMessage(const JSONNode &node); void ProcessUserPresence(const JSONNode &node); void ProcessThreadUpdate(const JSONNode &node); void ProcessServerMessage(const std::string &szName, int packetId, const JSONNode &args); - void ProcessEndpointPresence(const JSONNode &node); void ProcessConversationUpdate(const JSONNode &node); void __cdecl GatewayThread(void *); diff --git a/protocols/Teams/src/teams_trouter.cpp b/protocols/Teams/src/teams_trouter.cpp index 2de4c6d653..0e54b8edb6 100644 --- a/protocols/Teams/src/teams_trouter.cpp +++ b/protocols/Teams/src/teams_trouter.cpp @@ -251,13 +251,7 @@ void CTeamsProto::TRouterProcess(const char *str) auto message = JSONNode::parse(szBody.c_str()); if (message) { Netlib_Logf(m_hTrouterNetlibUser, "Got event:\n%s", message.write_formatted().c_str()); - - for (auto &pkt : message) { - if (!mir_strcmp(pkt.name(), "presence")) { - for (auto &it : pkt) - ProcessUserPresence(it); - } - } + ProcessEvent(message); } JSONNode reply, &old = packet["headers"], headers; headers.set_name("headers"); @@ -277,68 +271,23 @@ void CTeamsProto::TRouterProcess(const char *str) } } -void CTeamsProto::ProcessEndpointPresence(const JSONNode &node) +void CTeamsProto::ProcessEvent(const JSONNode &node) { - debugLogA(__FUNCTION__); - std::string selfLink = node["selfLink"].as_string(); - CMStringA skypename(UrlToSkypeId(selfLink.c_str())); - - MCONTACT hContact = FindContact(skypename); - if (hContact == NULL) + if (auto &presence = node["presence"]) { + for (auto &it : presence) + ProcessUserPresence(it); return; - - const JSONNode &publicInfo = node["publicInfo"]; - const JSONNode &privateInfo = node["privateInfo"]; - CMStringA MirVer; - if (publicInfo) { - std::string skypeNameVersion = publicInfo["skypeNameVersion"].as_string(); - std::string version = publicInfo["version"].as_string(); - std::string typ = publicInfo["typ"].as_string(); - int iTyp = atoi(typ.c_str()); - switch (iTyp) { - case 0: - case 1: - MirVer.Append("Skype (Web) " + ParseUrl(version.c_str(), "/")); - break; - case 10: - MirVer.Append("Skype (XBOX) " + ParseUrl(skypeNameVersion.c_str(), "/")); - break; - case 17: - MirVer.Append("Skype (Android) " + ParseUrl(skypeNameVersion.c_str(), "/")); - break; - case 16: - MirVer.Append("Skype (iOS) " + ParseUrl(skypeNameVersion.c_str(), "/")); - break; - case 12: - MirVer.Append("Skype (WinRT) " + ParseUrl(skypeNameVersion.c_str(), "/")); - break; - case 15: - MirVer.Append("Skype (WP) " + ParseUrl(skypeNameVersion.c_str(), "/")); - break; - case 13: - MirVer.Append("Skype (OSX) " + ParseUrl(skypeNameVersion.c_str(), "/")); - break; - case 11: - MirVer.Append("Skype (Windows) " + ParseUrl(skypeNameVersion.c_str(), "/")); - break; - case 14: - MirVer.Append("Skype (Linux) " + ParseUrl(skypeNameVersion.c_str(), "/")); - break; - case 125: - MirVer.AppendFormat("Miranda NG Skype %s", version.c_str()); - break; - default: - MirVer.Append("Skype (Unknown)"); - } } - if (privateInfo != NULL) { - std::string epname = privateInfo["epname"].as_string(); - if (!epname.empty()) - MirVer.AppendFormat(" [%s]", epname.c_str()); + auto szType = node["type"].as_string(); + if (szType == "EventMessage") { + auto &resource = node["resource"]; + auto szResourceType = node["resourceType"]; + if (szResourceType == "ConversationUpdate") + ProcessConversationUpdate(resource); + else if (szResourceType == "NewMessage") + ProcessNewMessage(resource); } - - setString(hContact, "MirVer", MirVer); } void CTeamsProto::ProcessUserPresence(const JSONNode &node) @@ -380,5 +329,14 @@ void CTeamsProto::ProcessServerMessage(const std::string &szName, int packetId, TRouterSendActive(true, packetId); } -void CTeamsProto::ProcessConversationUpdate(const JSONNode &) {} +void CTeamsProto::ProcessConversationUpdate(const JSONNode &node) +{ + if (auto &properties = node["threadProperties"]) { + CMStringW wszId(node["id"].as_mstring()); + if (auto *si = Chat_Find(wszId, m_szModuleName)) + if (getMStringW(si->hContact, "Version") != properties["version"].as_mstring()) + GetChatInfo(wszId); + } +} + void CTeamsProto::ProcessThreadUpdate(const JSONNode &) {} |
