summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Teams/src/teams_messages.cpp2
-rw-r--r--protocols/Teams/src/teams_proto.h15
-rw-r--r--protocols/Teams/src/teams_trouter.cpp143
3 files changed, 151 insertions, 9 deletions
diff --git a/protocols/Teams/src/teams_messages.cpp b/protocols/Teams/src/teams_messages.cpp
index c660ee0c60..e55b83816c 100644
--- a/protocols/Teams/src/teams_messages.cpp
+++ b/protocols/Teams/src/teams_messages.cpp
@@ -154,7 +154,6 @@ LBL_Deleted:
return true;
}
-/*
void CTeamsProto::ProcessNewMessage(const JSONNode &node)
{
int iUserType;
@@ -200,7 +199,6 @@ void CTeamsProto::ProcessNewMessage(const JSONNode &node)
ProtoChainRecvMsg(hContact, dbei);
}
}
-*/
void CTeamsProto::OnMarkRead(MCONTACT hContact, MEVENT hDbEvent)
{
diff --git a/protocols/Teams/src/teams_proto.h b/protocols/Teams/src/teams_proto.h
index 3839e23609..c6ad876e86 100644
--- a/protocols/Teams/src/teams_proto.h
+++ b/protocols/Teams/src/teams_proto.h
@@ -180,12 +180,6 @@ public:
void OnEndpointCreated(MHttpResponse *response, AsyncHttpRequest *pRequest);
void OnEndpointDeleted(MHttpResponse *response, AsyncHttpRequest *pRequest);
- // oauth
- void OnOAuthStart(MHttpResponse *response, AsyncHttpRequest *pRequest);
- void OnOAuthConfirm(MHttpResponse* response, AsyncHttpRequest* pRequest);
- void OnOAuthAuthorize(MHttpResponse* response, AsyncHttpRequest* pRequest);
- void OnOAuthEnd(MHttpResponse *response, AsyncHttpRequest *pRequest);
-
void OnASMObjectCreated(MHttpResponse *response, AsyncHttpRequest *pRequest);
void OnASMObjectUploaded(MHttpResponse *response, AsyncHttpRequest *pRequest);
@@ -300,7 +294,7 @@ private:
void SetChatStatus(MCONTACT hContact, int iStatus);
bool ParseMessage(const JSONNode &node, DB::EventInfo &dbei);
- void ParsePollData(const char*);
+
// utils
template <typename T>
__inline static void FreeList(const LIST<T> &lst)
@@ -365,6 +359,13 @@ private:
MHttpHeaders m_connectParams;
int iCommandId;
+ void ProcessNewMessage(const JSONNode &node);
+ void ProcessUserPresence(const JSONNode &node);
+ void ProcessThreadUpdate(const JSONNode &node);
+ void ProcessServerMessage(const std::string &szName, const JSONNode &args);
+ void ProcessEndpointPresence(const JSONNode &node);
+ void ProcessConversationUpdate(const JSONNode &node);
+
void __cdecl GatewayThread(void *);
void TRouterSendJson(const char *szName, const JSONNode *node = 0);
diff --git a/protocols/Teams/src/teams_trouter.cpp b/protocols/Teams/src/teams_trouter.cpp
index b5eab27768..e602724c68 100644
--- a/protocols/Teams/src/teams_trouter.cpp
+++ b/protocols/Teams/src/teams_trouter.cpp
@@ -212,6 +212,18 @@ void WebSocket<CTeamsProto>::process(const uint8_t *buf, size_t cbLen)
p->TRouterProcess(payload);
}
+static const char* skip3colons(const char *str)
+{
+ int nColons = 3;
+ for (const char *p = str; *p; p++) {
+ if (*p == ':') {
+ if (--nColons == 0)
+ return p + 1;
+ }
+ }
+ return str;
+}
+
void CTeamsProto::TRouterProcess(const char *str)
{
switch (*str) {
@@ -220,5 +232,136 @@ void CTeamsProto::TRouterProcess(const char *str)
TRouterSendActive(true);
TRouterRegister();
break;
+
+ case '3':
+ if (auto packet = JSONNode::parse(skip3colons(str))) {
+ std::string szBody(packet["body"].as_string());
+ auto message = JSONNode::parse(szBody.c_str());
+ if (message) {
+ Netlib_Logf(m_hTrouterNetlibUser, "Got event:\n%s", message.write_formatted().c_str());
+
+ const JSONNode &resource = message["resource"];
+
+ std::string resourceType = message["resourceType"].as_string();
+ if (resourceType == "NewMessage")
+ ProcessNewMessage(resource);
+ else if (resourceType == "UserPresence")
+ ProcessUserPresence(resource);
+ else if (resourceType == "EndpointPresence")
+ ProcessEndpointPresence(resource);
+ else if (resourceType == "ConversationUpdate")
+ ProcessConversationUpdate(resource);
+ else if (resourceType == "ThreadUpdate")
+ ProcessThreadUpdate(resource);
+ }
+ }
+ break;
+
+ case '5':
+ if (auto root = JSONNode::parse(skip3colons(str))) {
+ std::string szName(root["name"].as_string());
+ ProcessServerMessage(szName, root["args"]);
+ }
+ break;
}
}
+
+void CTeamsProto::ProcessEndpointPresence(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)
+ 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());
+ }
+
+ setString(hContact, "MirVer", MirVer);
+}
+
+void CTeamsProto::ProcessUserPresence(const JSONNode &node)
+{
+ debugLogA(__FUNCTION__);
+
+ std::string selfLink = node["selfLink"].as_string();
+ std::string status = node["availability"].as_string();
+ CMStringA skypename = UrlToSkypeId(selfLink.c_str());
+
+ if (!skypename.IsEmpty()) {
+ if (IsMe(skypename)) {
+ int iNewStatus = SkypeToMirandaStatus(status.c_str());
+ if (iNewStatus == ID_STATUS_OFFLINE) return;
+ int old_status = m_iStatus;
+ m_iDesiredStatus = iNewStatus;
+ m_iStatus = iNewStatus;
+ if (old_status != iNewStatus)
+ ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, iNewStatus);
+ }
+ else {
+ MCONTACT hContact = FindContact(skypename);
+ if (hContact != NULL)
+ SetContactStatus(hContact, SkypeToMirandaStatus(status.c_str()));
+ }
+ }
+}
+
+void CTeamsProto::ProcessServerMessage(const std::string &szName, const JSONNode&)
+{
+ if (szName == "trouter.message_loss") {
+ TRouterRegister("TeamsCDLWebWorker", "TeamsCDLWebWorker_1.9", m_szTrouterSurl);
+ }
+}
+
+void CTeamsProto::ProcessConversationUpdate(const JSONNode &) {}
+void CTeamsProto::ProcessThreadUpdate(const JSONNode &) {}