summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Teams/src/teams_history.cpp2
-rw-r--r--protocols/Teams/src/teams_http.cpp7
-rw-r--r--protocols/Teams/src/teams_proto.h2
-rw-r--r--protocols/Teams/src/teams_trouter.cpp88
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 &) {}