From 0f77335cd29dff59fc7587e62e5f94a04936e664 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 1 Dec 2023 21:34:08 +0300 Subject: =?UTF-8?q?fixes=20#4004=20(Telegram:=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=BA=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocols/Telegram/res/resource.rc | 29 +++++++- protocols/Telegram/src/options.cpp | 142 +++++++++++++++++++++++++++++++++++++ protocols/Telegram/src/proto.h | 3 + protocols/Telegram/src/resource.h | 8 ++- protocols/Telegram/src/stdafx.h | 1 + 5 files changed, 179 insertions(+), 4 deletions(-) diff --git a/protocols/Telegram/res/resource.rc b/protocols/Telegram/res/resource.rc index 6bab6b5e1b..3b90bb61f7 100644 --- a/protocols/Telegram/res/resource.rc +++ b/protocols/Telegram/res/resource.rc @@ -112,6 +112,18 @@ BEGIN COMBOBOX IDC_STATUS2,221,61,81,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END +IDD_OPTIONS_SESSIONS DIALOGEX 0, 0, 310, 226 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_SESSIONS,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,1,0,309,182 + LTEXT "IP address",IDC_STATIC,0,188,75,8 + LTEXT "Software",IDC_STATIC,0,204,75,8 + EDITTEXT IDC_IPADDRESS,87,187,75,12,ES_AUTOHSCROLL | WS_DISABLED + EDITTEXT IDC_SOFTWARE,87,202,217,12,ES_AUTOHSCROLL | WS_DISABLED +END + IDD_ADD_PHONE DIALOGEX 0, 0, 343, 105 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Add phone contact" @@ -155,14 +167,15 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTI CAPTION "Reply to a message" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CONTROL "",IDC_REPLYTO,"NewstoryList",ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP,7,18,400,85 + CONTROL "",IDC_REPLYTO,"NewstoryList",WS_BORDER | WS_TABSTOP | 0x80,7,18,400,85 LTEXT "In reply to:",IDC_STATIC,7,4,400,9 - CONTROL "",IDC_TEXT,"RichEdit50W",ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP,7,105,400,103 + CONTROL "",IDC_TEXT,"RichEdit50W",WS_BORDER | WS_TABSTOP | 0x80,7,105,400,103 CONTROL "",IDC_ATTACH,"MButtonClass",WS_TABSTOP,7,212,17,14 DEFPUSHBUTTON "OK",IDOK,301,212,50,14 PUSHBUTTON "Cancel",IDCANCEL,357,212,50,14 END + ///////////////////////////////////////////////////////////////////////////// // // Icon @@ -199,6 +212,11 @@ BEGIN BEGIN END + IDD_OPTIONS_SESSIONS, DIALOG + BEGIN + BOTTOMMARGIN, 86 + END + IDD_ADD_PHONE, DIALOG BEGIN BOTTOMMARGIN, 84 @@ -242,9 +260,16 @@ BEGIN 0 END +IDD_OPTIONS_SESSIONS AFX_DIALOG_LAYOUT +BEGIN + 0 +END + #endif // English (Neutral) resources ///////////////////////////////////////////////////////////////////////////// + + #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // diff --git a/protocols/Telegram/src/options.cpp b/protocols/Telegram/src/options.cpp index e1c8d89c68..4960ad124d 100644 --- a/protocols/Telegram/src/options.cpp +++ b/protocols/Telegram/src/options.cpp @@ -179,6 +179,143 @@ public: } }; +///////////////////////////////////////////////////////////////////////////////////////// +// Session list + +class COptSessionsDlg : public CTelegramDlgBase +{ + CCtrlBase m_ipAddress, m_software; + CCtrlListView m_list; + +public: + COptSessionsDlg(CTelegramProto *ppro) : + CTelegramDlgBase(ppro, IDD_OPTIONS_SESSIONS), + m_list(this, IDC_SESSIONS), + m_software(this, IDC_SOFTWARE), + m_ipAddress(this, IDC_IPADDRESS) + { + m_list.OnBuildMenu = Callback(this, &COptSessionsDlg::onContextMenu); + m_list.OnDeleteItem = Callback(this, &COptSessionsDlg::onDeleteItem); + m_list.OnItemChanged = Callback(this, &COptSessionsDlg::onItemChanged); + } + + bool OnInitDialog() override + { + LVCOLUMN lvc = {}; + lvc.mask = LVCF_TEXT | LVCF_WIDTH; + + lvc.pszText = TranslateT("Name"); + lvc.cx = 150; + m_list.InsertColumn(0, &lvc); + + lvc.pszText = TranslateT("Platform"); + lvc.cx = 110; + m_list.InsertColumn(1, &lvc); + + lvc.pszText = TranslateT("Country"); + lvc.cx = 120; + m_list.InsertColumn(2, &lvc); + + lvc.pszText = TranslateT("Last active"); + lvc.cx = 110; + m_list.InsertColumn(3, &lvc); + + BuildList(); + return true; + } + + void OnDestroy() override + { + int iCount = m_list.GetItemCount(); + for (int i = 0; i < iCount; i++) { + auto *pSession = (TD::session *)m_list.GetItemData(i); + delete pSession; + } + } + + void onContextMenu(CContextMenuPos *pos) + { + HMENU hMenu = CreatePopupMenu(); + AppendMenuW(hMenu, MF_STRING, 100, TranslateT("Kill session")); + + if (100 == TrackPopupMenu(hMenu, TPM_RETURNCMD, pos->pt.x, pos->pt.y, 0, m_hwnd, 0)) { + auto *pSession = (TD::session *)m_list.GetItemData(pos->iCurr); + m_proto->SendQuery(new TD::terminateSession(pSession->id_), &CTelegramProto::OnKillSession, this); + } + } + + void onDeleteItem(CCtrlListView::TEventInfo *ev) + { + auto *pSession = (TD::session *)m_list.GetItemData(ev->nmlv->iItem); + delete pSession; + } + + void onItemChanged(CCtrlListView::TEventInfo *ev) + { + auto *pSession = (TD::session*)m_list.GetItemData(ev->nmlv->iItem); + m_ipAddress.SetTextA(pSession->ip_.c_str()); + m_software.SetTextA((pSession->application_name_ + " " + pSession->application_version_).c_str()); + } + + void BuildList() + { + m_list.DeleteAllItems(); + + m_proto->SendQuery(new TD::getActiveSessions(), &CTelegramProto::OnGetSessions, &m_list); + } +}; + +void CTelegramProto::OnGetSessions(td::ClientManager::Response &response, void *pUserInfo) +{ + if (!response.object) + return; + + if (response.object->get_id() != TD::sessions::ID) { + debugLogA("Gotten class ID %d instead of %d, exiting", response.object->get_id(), TD::chats::ID); + return; + } + + auto *pSessions = (TD::sessions *)response.object.get(); + auto *pList = (CCtrlListView *)pUserInfo; + + for (auto &it : pSessions->sessions_) { + auto *pSession = it.release(); + int iItem = pList->AddItem(Utf2T(pSession->device_model_.c_str()), 0, (LPARAM)pSession); + + const wchar_t *pwszType; + switch (pSession->type_->get_id()) { + case TD::sessionTypeAndroid::ID: pwszType = L"Android"; break; + case TD::sessionTypeApple::ID: pwszType = L"Apple"; break; + case TD::sessionTypeChrome::ID: pwszType = L"Chrome"; break; + case TD::sessionTypeEdge::ID: pwszType = L"MS Edge"; break; + case TD::sessionTypeFirefox::ID: pwszType = L"Firefox"; break; + case TD::sessionTypeIpad::ID: pwszType = L"Ipad"; break; + case TD::sessionTypeIphone::ID: pwszType = L"Iphone"; break; + case TD::sessionTypeLinux::ID: pwszType = L"Linux"; break; + case TD::sessionTypeMac::ID: pwszType = L"Mac"; break; + case TD::sessionTypeOpera::ID: pwszType = L"Opera"; break; + case TD::sessionTypeSafari::ID: pwszType = L"Safari"; break; + case TD::sessionTypeUbuntu::ID: pwszType = L"Ubuntu"; break; + case TD::sessionTypeVivaldi::ID: pwszType = L"Vivaldi"; break; + case TD::sessionTypeWindows::ID: pwszType = L"Windows"; break; + default: + pwszType = TranslateT("Unknown"); + } + pList->SetItemText(iItem, 1, pwszType); + pList->SetItemText(iItem, 2, Utf2T(pSession->country_.c_str())); + + wchar_t wszLastLogin[100]; + TimeZone_PrintTimeStamp(0, pSession->last_active_date_, L"d t", wszLastLogin, _countof(wszLastLogin), 0); + pList->SetItemText(iItem, 3, wszLastLogin); + } +} + +void CTelegramProto::OnKillSession(td::ClientManager::Response&, void *pUserInfo) +{ + auto *pDlg = (COptSessionsDlg *)pUserInfo; + pDlg->BuildList(); +} + ///////////////////////////////////////////////////////////////////////////////////////// MWindow CTelegramProto::OnCreateAccMgrUI(MWindow hwndParent) @@ -205,5 +342,10 @@ int CTelegramProto::OnOptionsInit(WPARAM wParam, LPARAM) odp.szTab.w = LPGENW("Advanced"); odp.pDialog = new CAdvOptionsDlg(this); g_plugin.addOptions(wParam, &odp); + + odp.position = 3; + odp.szTab.w = LPGENW("Sessions"); + odp.pDialog = new COptSessionsDlg(this); + g_plugin.addOptions(wParam, &odp); return 0; } diff --git a/protocols/Telegram/src/proto.h b/protocols/Telegram/src/proto.h index 32cec7fa60..db995e49be 100644 --- a/protocols/Telegram/src/proto.h +++ b/protocols/Telegram/src/proto.h @@ -150,6 +150,7 @@ class CTelegramProto : public PROTO friend class CReplyDlg; friend class CForwardDlg; friend class CReactionsDlg; + friend class COptSessionsDlg; friend class CAddPhoneContactDlg; class CProtoImpl @@ -224,6 +225,8 @@ class CTelegramProto : public PROTO void OnGetFileInfo(td::ClientManager::Response &response, void *pUserInfo); void OnGetFileLink(td::ClientManager::Response &response); void OnGetHistory(td::ClientManager::Response &response, void *pUserInfo); + void OnGetSessions(td::ClientManager::Response &response, void *pUserInfo); + void OnKillSession(td::ClientManager::Response &response, void *pUserInfo); void OnSendFile(td::ClientManager::Response &response, void *pUserInfo); void OnSendMessage(td::ClientManager::Response &response); void OnUpdateAuth(td::ClientManager::Response &response); diff --git a/protocols/Telegram/src/resource.h b/protocols/Telegram/src/resource.h index 0ffa5e1a47..9838a6cb40 100644 --- a/protocols/Telegram/src/resource.h +++ b/protocols/Telegram/src/resource.h @@ -15,6 +15,7 @@ #define IDI_BOT 110 #define IDI_REPLY 111 #define IDD_REPLY 112 +#define IDD_OPTIONS_SESSIONS 113 #define IDC_PHONE 1001 #define IDC_DEFGROUP 1002 #define IDC_HIDECHATS 1003 @@ -38,14 +39,17 @@ #define IDC_REPLYTO 1019 #define IDC_TEXT 1020 #define IDC_ATTACH 1021 +#define IDC_SESSIONS 1023 +#define IDC_IPADDRESS 1024 +#define IDC_SOFTWARE 1025 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 115 +#define _APS_NEXT_RESOURCE_VALUE 116 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1023 +#define _APS_NEXT_CONTROL_VALUE 1025 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/protocols/Telegram/src/stdafx.h b/protocols/Telegram/src/stdafx.h index f6e7100f53..bb331c192a 100644 --- a/protocols/Telegram/src/stdafx.h +++ b/protocols/Telegram/src/stdafx.h @@ -30,6 +30,7 @@ #include #include #include +#include #include "../../libs/freeimage/src/FreeImage.h" -- cgit v1.2.3