diff options
| -rw-r--r-- | protocols/Teams/Teams.vcxproj | 5 | ||||
| -rw-r--r-- | protocols/Teams/Teams.vcxproj.filters | 20 | ||||
| -rw-r--r-- | protocols/Teams/src/requests/status.h | 32 | ||||
| -rw-r--r-- | protocols/Teams/src/stdafx.h | 2 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_endpoint.cpp | 44 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_http.cpp | 18 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_proto.cpp | 7 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_proto.h | 5 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_utils.cpp | 39 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_utils.h | 3 |
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); |
