summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Teams/Teams.vcxproj5
-rw-r--r--protocols/Teams/Teams.vcxproj.filters20
-rw-r--r--protocols/Teams/src/requests/status.h32
-rw-r--r--protocols/Teams/src/stdafx.h2
-rw-r--r--protocols/Teams/src/teams_endpoint.cpp44
-rw-r--r--protocols/Teams/src/teams_http.cpp18
-rw-r--r--protocols/Teams/src/teams_proto.cpp7
-rw-r--r--protocols/Teams/src/teams_proto.h5
-rw-r--r--protocols/Teams/src/teams_utils.cpp39
-rw-r--r--protocols/Teams/src/teams_utils.h3
10 files changed, 85 insertions, 90 deletions
diff --git a/protocols/Teams/Teams.vcxproj b/protocols/Teams/Teams.vcxproj
index 436f8c746d..de27425cff 100644
--- a/protocols/Teams/Teams.vcxproj
+++ b/protocols/Teams/Teams.vcxproj
@@ -48,6 +48,11 @@
<ClCompile Include="src\teams_search.cpp" />
<ClCompile Include="src\teams_trouter.cpp" />
<ClCompile Include="src\teams_utils.cpp" />
+ <ClInclude Include="src\requests\chatrooms.h" />
+ <ClInclude Include="src\requests\history.h" />
+ <ClInclude Include="src\requests\profile.h" />
+ <ClInclude Include="src\requests\search.h" />
+ <ClInclude Include="src\requests\subscriptions.h" />
<ClInclude Include="src\resource.h" />
<ClInclude Include="src\stdafx.h" />
<ClInclude Include="src\teams_menus.h" />
diff --git a/protocols/Teams/Teams.vcxproj.filters b/protocols/Teams/Teams.vcxproj.filters
index c15ff6085c..458a991e68 100644
--- a/protocols/Teams/Teams.vcxproj.filters
+++ b/protocols/Teams/Teams.vcxproj.filters
@@ -81,6 +81,21 @@
<ClInclude Include="src\teams_proto.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="src\requests\chatrooms.h">
+ <Filter>Header Files\Requests</Filter>
+ </ClInclude>
+ <ClInclude Include="src\requests\history.h">
+ <Filter>Header Files\Requests</Filter>
+ </ClInclude>
+ <ClInclude Include="src\requests\profile.h">
+ <Filter>Header Files\Requests</Filter>
+ </ClInclude>
+ <ClInclude Include="src\requests\search.h">
+ <Filter>Header Files\Requests</Filter>
+ </ClInclude>
+ <ClInclude Include="src\requests\subscriptions.h">
+ <Filter>Header Files\Requests</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="res\Resource.rc">
@@ -95,5 +110,10 @@
<Filter>Resource Files</Filter>
</Image>
</ItemGroup>
+ <ItemGroup>
+ <Filter Include="Header Files\Requests">
+ <UniqueIdentifier>{8564ba51-686a-4e09-bfe0-b1926a5a640d}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
<Import Project="$(ProjectDir)..\..\build\vc.common\common.filters" />
</Project> \ No newline at end of file
diff --git a/protocols/Teams/src/requests/status.h b/protocols/Teams/src/requests/status.h
deleted file mode 100644
index 375b32dc25..0000000000
--- a/protocols/Teams/src/requests/status.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-Copyright (c) 2015-25 Miranda NG team (https://miranda-ng.org)
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation version 2
-of the License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _SKYPE_REQUEST_STATUS_H_
-#define _SKYPE_REQUEST_STATUS_H_
-
-struct SetStatusRequest : public AsyncHttpRequest
-{
- SetStatusRequest(const char *status) :
- AsyncHttpRequest(REQUEST_PUT, HOST_DEFAULT, "/users/ME/presenceDocs/messagingService", &CTeamsProto::OnStatusChanged)
- {
- JSONNode node(JSON_NODE);
- node << CHAR_PARAM("status", status);
- m_szParam = node.write().c_str();
- }
-};
-
-#endif //_SKYPE_REQUEST_STATUS_H_
diff --git a/protocols/Teams/src/stdafx.h b/protocols/Teams/src/stdafx.h
index 7cbbec2676..f5c0ba8236 100644
--- a/protocols/Teams/src/stdafx.h
+++ b/protocols/Teams/src/stdafx.h
@@ -72,6 +72,7 @@ enum SkypeHost
HOST_LOGIN,
HOST_PEOPLE,
HOST_TEAMS,
+ HOST_PRESENCE,
HOST_OTHER
};
@@ -92,7 +93,6 @@ struct AsyncHttpRequest : public MTHttpRequest<CTeamsProto>
#include "requests/history.h"
#include "requests/profile.h"
#include "requests/search.h"
-#include "requests/status.h"
#include "requests/subscriptions.h"
#endif //_COMMON_H_
diff --git a/protocols/Teams/src/teams_endpoint.cpp b/protocols/Teams/src/teams_endpoint.cpp
index 733008ee75..1b19cf4de5 100644
--- a/protocols/Teams/src/teams_endpoint.cpp
+++ b/protocols/Teams/src/teams_endpoint.cpp
@@ -73,11 +73,15 @@ void CTeamsProto::OnEndpointCreated(MHttpResponse *response, AsyncHttpRequest*)
if (name == "registrationToken")
m_szToken = val.Detach();
- else if (name == "endpointId")
+ else if (name == "endpointId") {
+ val.Replace("{", "");
+ val.Replace("}", "");
m_szEndpoint = val.Detach();
+ }
}
}
+ SetServerStatus(m_iDesiredStatus);
StartTrouter();
PushRequest(new CreateSubscriptionsRequest());
}
@@ -110,8 +114,6 @@ void CTeamsProto::OnCapabilitiesSended(MHttpResponse *response, AsyncHttpRequest
return;
}
- PushRequest(new SetStatusRequest(MirandaToSkypeStatus(m_iDesiredStatus)));
-
LIST<char> skypenames(1);
for (auto &hContact : AccContacts())
if (!isChatRoom(hContact))
@@ -166,36 +168,26 @@ void CTeamsProto::SendPresence()
void CTeamsProto::OnStatusChanged(MHttpResponse *response, AsyncHttpRequest*)
{
- if (response == nullptr || response->body.IsEmpty()) {
+ if (response == nullptr || response->resultCode != 201) {
debugLogA(__FUNCTION__ ": failed to change status");
ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, 1001);
SetStatus(ID_STATUS_OFFLINE);
return;
}
- JSONNode json = JSONNode::parse(response->body);
- if (!json) {
- debugLogA(__FUNCTION__ ": failed to change status");
- ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, 1001);
- SetStatus(ID_STATUS_OFFLINE);
- return;
- }
+ int oldStatus = m_iStatus;
+ m_iStatus = m_iDesiredStatus;
+ ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus);
+}
- const JSONNode &nStatus = json["status"];
- if (!nStatus) {
- debugLogA(__FUNCTION__ ": result contains no valid status to switch to");
- return;
- }
+void CTeamsProto::SetServerStatus(int iStatus)
+{
+ auto *pReq = new AsyncHttpRequest(REQUEST_PUT, HOST_PRESENCE, "/me/endpoints", &CTeamsProto::OnStatusChanged);
- int iNewStatus = SkypeToMirandaStatus(nStatus.as_string().c_str());
- if (iNewStatus == ID_STATUS_OFFLINE) {
- debugLogA(__FUNCTION__ ": failed to change status");
- ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, 1001);
- SetStatus(ID_STATUS_OFFLINE);
- return;
- }
+ JSONNode node(JSON_NODE);
+ node << CHAR_PARAM("id", m_szEndpoint) << CHAR_PARAM("availability", MirandaToSkypeStatus(iStatus))
+ << CHAR_PARAM("activity", "Available") << CHAR_PARAM("activityReporting", "Transport") << CHAR_PARAM("deviceType", "Desktop");
+ pReq->m_szParam = node.write().c_str();
- int oldStatus = m_iStatus;
- m_iStatus = m_iDesiredStatus = iNewStatus;
- ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus);
+ PushRequest(pReq);
}
diff --git a/protocols/Teams/src/teams_http.cpp b/protocols/Teams/src/teams_http.cpp
index a24b44bfbc..66043ed5ad 100644
--- a/protocols/Teams/src/teams_http.cpp
+++ b/protocols/Teams/src/teams_http.cpp
@@ -26,11 +26,12 @@ AsyncHttpRequest::AsyncHttpRequest(int type, SkypeHost host, LPCSTR url, MTHttpR
case HOST_CONTACTS: m_szUrl = "contacts.skype.com/contacts/v2"; break;
case HOST_GRAPH: m_szUrl = "skypegraph.skype.com"; break;
case HOST_LOGIN: m_szUrl = "login.microsoftonline.com"; break;
- case HOST_TEAMS: m_szUrl = "teams.live.com"; break;
+ case HOST_TEAMS: m_szUrl = TEAMS_BASE_HOST; break;
+ case HOST_PRESENCE: m_szUrl = "presence." TEAMS_BASE_HOST "/v1"; break;
case HOST_DEFAULT:
AddHeader("MS-IC3-Product", "Sfl");
- m_szUrl = "msgapi.teams.live.com/v1";
+ m_szUrl = "msgapi." TEAMS_BASE_HOST "/v1";
break;
}
@@ -111,6 +112,8 @@ MHttpResponse* CTeamsProto::DoSend(AsyncHttpRequest *pReq)
}
}
+ pReq->AddHeader("X-MS-Client-Consumer-Type", "teams4life");
+
switch (pReq->m_host) {
case HOST_API:
case HOST_PEOPLE:
@@ -129,6 +132,17 @@ MHttpResponse* CTeamsProto::DoSend(AsyncHttpRequest *pReq)
pReq->AddHeader("Accept", "application/json");
break;
+ case HOST_PRESENCE:
+ if (m_szSkypeToken)
+ pReq->AddHeader("X-Skypetoken", m_szSkypeToken);
+
+ pReq->AddHeader("Accept", "application/json");
+ pReq->AddHeader("x-ms-client-user-agent", "Teams-V2-Desktop");
+ pReq->AddHeader("x-ms-correlation-id", "1");
+ pReq->AddHeader("x-ms-client-version", TEAMS_CLIENTINFO_VERSION);
+ pReq->AddHeader("x-ms-endpoint-id", m_szEndpoint);
+ break;
+
case HOST_LOGIN:
#ifndef _DEBUG
pReq->flags |= NLHRF_NODUMP;
diff --git a/protocols/Teams/src/teams_proto.cpp b/protocols/Teams/src/teams_proto.cpp
index 9999e41c2e..77d5e252b2 100644
--- a/protocols/Teams/src/teams_proto.cpp
+++ b/protocols/Teams/src/teams_proto.cpp
@@ -116,9 +116,9 @@ INT_PTR CTeamsProto::GetCaps(int type, MCONTACT)
case PFLAGNUM_1:
return PF1_IM | PF1_AUTHREQ | PF1_CHAT | PF1_BASICSEARCH | PF1_MODEMSG | PF1_FILE | PF1_SERVERCLIST;
case PFLAGNUM_2:
- return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_HEAVYDND;
+ return PF2_ONLINE;
case PFLAGNUM_3:
- return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_HEAVYDND;
+ return PF2_ONLINE;
case PFLAGNUM_4:
return PF4_NOAUTHDENYREASON | PF4_SUPPORTTYPING | PF4_AVATARS | PF4_IMSENDOFFLINE | PF4_OFFLINEFILES | PF4_SERVERMSGID | PF4_SERVERFORMATTING;
case PFLAG_UNIQUEIDTEXT:
@@ -248,7 +248,8 @@ int CTeamsProto::SetStatus(int iNewStatus)
if (m_iStatus == ID_STATUS_OFFLINE)
Login();
else
- PushRequest(new SetStatusRequest(MirandaToSkypeStatus(m_iDesiredStatus)));
+ SetServerStatus(m_iDesiredStatus);
+
return 0;
}
diff --git a/protocols/Teams/src/teams_proto.h b/protocols/Teams/src/teams_proto.h
index 2cff3431e3..c14892a0c1 100644
--- a/protocols/Teams/src/teams_proto.h
+++ b/protocols/Teams/src/teams_proto.h
@@ -2,6 +2,8 @@
#define TEAMS_CLIENTINFO_NAME "skypeteams"
#define TEAMS_CLIENTINFO_VERSION "49/24062722442"
+#define TEAMS_BASE_HOST "teams.live.com"
+
#define TEAMS_USER_AGENT "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0 Teams/24165.1410.2974.6689/49"
#define DBKEY_ID "id"
@@ -317,8 +319,7 @@ private:
static time_t IsoToUnixTime(const std::string &stamp);
- static int SkypeToMirandaStatus(const char *status);
- static const char *MirandaToSkypeStatus(int status);
+ void SetServerStatus(int iStatus);
void ShowNotification(const wchar_t *message, MCONTACT hContact = NULL);
void ShowNotification(const wchar_t *caption, const wchar_t *message, MCONTACT hContact = NULL, int type = 0);
diff --git a/protocols/Teams/src/teams_utils.cpp b/protocols/Teams/src/teams_utils.cpp
index 3d23351468..f83264875f 100644
--- a/protocols/Teams/src/teams_utils.cpp
+++ b/protocols/Teams/src/teams_utils.cpp
@@ -593,38 +593,29 @@ uint32_t Utf16toUtf32(const wchar_t *str)
//////////////////////////////////////////////////////////////////////////////////////////
-const char* CTeamsProto::MirandaToSkypeStatus(int status)
+const char* MirandaToSkypeStatus(int status)
{
switch (status) {
- case ID_STATUS_AWAY:
- return "Away";
-
- case ID_STATUS_DND:
- return "Busy";
-
- case ID_STATUS_IDLE:
- return "Idle";
-
- case ID_STATUS_INVISIBLE:
- return "Hidden";
+ case ID_STATUS_OFFLINE: return "Offline";
+ case ID_STATUS_AWAY: return "Away";
+ case ID_STATUS_NA: return "BeRightBack";
+ case ID_STATUS_DND: return "DoNotDisturb";
+ case ID_STATUS_IDLE: return "AvailableIdle";
}
- return "Online";
+ return "Available";
}
-int CTeamsProto::SkypeToMirandaStatus(const char *status)
+int SkypeToMirandaStatus(const char *status)
{
- if (!mir_strcmpi(status, "Online"))
+ if (!mir_strcmpi(status, "Available"))
return ID_STATUS_ONLINE;
- else if (!mir_strcmpi(status, "Hidden"))
- return ID_STATUS_INVISIBLE;
- else if (!mir_strcmpi(status, "Away"))
- return ID_STATUS_AWAY;
- else if (!mir_strcmpi(status, "Idle"))
- return ID_STATUS_AWAY;
- else if (!mir_strcmpi(status, "Busy"))
+ if (!mir_strcmpi(status, "BeRightBack"))
+ return ID_STATUS_NA;
+ if (!mir_strcmpi(status, "AvailableIdle"))
+ return ID_STATUS_IDLE;
+ if (!mir_strcmpi(status, "DoNotDisturb"))
return ID_STATUS_DND;
- else
- return ID_STATUS_OFFLINE;
+ return ID_STATUS_OFFLINE;
}
//////////////////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/Teams/src/teams_utils.h b/protocols/Teams/src/teams_utils.h
index 58255e53c1..dc79d1e2b5 100644
--- a/protocols/Teams/src/teams_utils.h
+++ b/protocols/Teams/src/teams_utils.h
@@ -26,6 +26,9 @@ const wchar_t* GetSkypeNick(const wchar_t *szSkypeId);
CMStringA ParseUrl(const char *url, const char *token);
+int SkypeToMirandaStatus(const char *status);
+const char *MirandaToSkypeStatus(int status);
+
bool AddBbcodes(CMStringA &str);
bool IsPossibleUserType(const char *pszUserId);