From 40eb6363bb4e66bbd3bbc1e4191baaa46e1c21c0 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 22 Jun 2025 19:32:45 +0300 Subject: =?UTF-8?q?fixes=20#5051=20(Telegram:=20=D0=BD=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=D1=83=D0=B2=D0=B8=D0=B4=D0=B5=D1=82=D1=8C=20=D1=81?= =?UTF-8?q?=D1=81=D1=8B=D0=BB=D0=BA=D1=83=20=D0=BD=D0=B0=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocols/Telegram/src/groupchat.cpp | 23 ++++++-- protocols/Telegram/src/proto.cpp | 5 +- protocols/Telegram/src/proto.h | 5 +- protocols/Telegram/src/resource.h | 9 ++- protocols/Telegram/src/server.cpp | 3 +- protocols/Telegram/src/userinfo.cpp | 110 +++++++++++++++++++++++------------ protocols/Telegram/src/utils.cpp | 6 ++ 7 files changed, 108 insertions(+), 53 deletions(-) (limited to 'protocols/Telegram/src') diff --git a/protocols/Telegram/src/groupchat.cpp b/protocols/Telegram/src/groupchat.cpp index 38ab04a307..c4f134f6d9 100644 --- a/protocols/Telegram/src/groupchat.cpp +++ b/protocols/Telegram/src/groupchat.cpp @@ -404,6 +404,19 @@ void CTelegramProto::ProcessBasicGroupInfo(TG_USER *pChat, TD::basicGroupFullInf void CTelegramProto::ProcessSuperGroupInfo(TG_USER *pUser, TD::supergroupFullInfo *pInfo) { + setDword(pUser->hContact, "MemberCount", pInfo->member_count_); + + if (auto *pLink = pInfo->invite_link_.get()) + setUString(pUser->hContact, "Link", pLink->invite_link_.c_str()); + else if (auto *pGroup = FindSuperGroup(pUser->id)) { + if (pGroup->group->usernames_) { + CMStringA szLink(FORMAT, "https://t.me/%s", pGroup->group->usernames_->editable_username_.c_str()); + setString(pUser->hContact, "Link", szLink); + } + else delSetting(pUser->hContact, "Link"); + } + else delSetting(pUser->hContact, "Link"); + if (!pInfo->description_.empty()) { setUString(pUser->hContact, "About", pInfo->description_.c_str()); GcChangeTopic(pUser, pInfo->description_); @@ -418,16 +431,16 @@ void CTelegramProto::ProcessSuperGroup(TD::updateSupergroup *pObj) return; } - TG_SUPER_GROUP tmp(pObj->supergroup_->id_, 0); - auto *pGroup = m_arSuperGroups.find(&tmp); + auto id = pObj->supergroup_->id_; + auto *pGroup = FindSuperGroup(id); if (pGroup == nullptr) { - pGroup = new TG_SUPER_GROUP(tmp.id, std::move(pObj->supergroup_)); + pGroup = new TG_SUPER_GROUP(id, std::move(pObj->supergroup_)); m_arSuperGroups.insert(pGroup); } else pGroup->group = std::move(pObj->supergroup_); if (iStatusId == TD::chatMemberStatusLeft::ID) { - auto *pUser = AddFakeUser(tmp.id, true); + auto *pUser = AddFakeUser(id, true); pUser->isForum = pGroup->group->is_forum_; if (pUser->hContact == INVALID_CONTACT_ID) { // cache some information for the search @@ -438,7 +451,7 @@ void CTelegramProto::ProcessSuperGroup(TD::updateSupergroup *pObj) else RemoveFromClist(pUser); } else { - auto *pChat = AddUser(tmp.id, true); + auto *pChat = AddUser(id, true); pChat->isForum = pGroup->group->is_forum_; if (!pGroup->group->is_channel_) pChat->bLoadMembers = true; diff --git a/protocols/Telegram/src/proto.cpp b/protocols/Telegram/src/proto.cpp index a233395481..66fab24119 100644 --- a/protocols/Telegram/src/proto.cpp +++ b/protocols/Telegram/src/proto.cpp @@ -398,8 +398,7 @@ int CTelegramProto::GetInfo(MCONTACT hContact, int) if (!pUser->isGroupChat) SendQuery(new TD::getUserFullInfo(pUser->id), &CTelegramProto::OnGetUserInfo, pUser); else { - TG_SUPER_GROUP tmp(pUser->id, 0); - if (m_arSuperGroups.find(&tmp)) + if (FindSuperGroup(pUser->id)) SendQuery(new TD::getSupergroupFullInfo(pUser->id), &CTelegramProto::OnGetUserInfo, pUser); else SendQuery(new TD::getBasicGroupFullInfo(pUser->id), &CTelegramProto::OnGetUserInfo, pUser); @@ -423,7 +422,7 @@ void CTelegramProto::OnGetUserInfo(td::ClientManager::Response &response, void * case TD::supergroupFullInfo::ID: ProcessSuperGroupInfo(pUser, (TD::supergroupFullInfo *)response.object.get()); break; - case TD::updateUserFullInfo::ID: + case TD::userFullInfo::ID: ProcessUserInfo(pUser->id, (TD::userFullInfo *)response.object.get()); break; diff --git a/protocols/Telegram/src/proto.h b/protocols/Telegram/src/proto.h index 56cf85d7f6..a465104f01 100644 --- a/protocols/Telegram/src/proto.h +++ b/protocols/Telegram/src/proto.h @@ -365,6 +365,8 @@ class CTelegramProto : public PROTO TG_USER* AddFakeUser(int64_t id, bool bIsChat); TG_USER* GetSender(const TD::MessageSender *pSender); + TG_SUPER_GROUP* FindSuperGroup(int64_t id); + int64_t GetId(MCONTACT, const char *pszSetting = DBKEY_ID); void SetId(MCONTACT, int64_t id, const char *pszSetting = DBKEY_ID); @@ -375,9 +377,6 @@ class CTelegramProto : public PROTO void RemoveFromClist(TG_USER *pUser); void MarkRead(MCONTACT hContact, const CMStringA &szMaxId, bool bSent); - void RetrieveProfile(CMyProfileDlg *pDlg); - void OnReceivedProfile(td::ClientManager::Response &response, void *pUserData); - // Menus HGENMENU hmiForward, hmiReaction; diff --git a/protocols/Telegram/src/resource.h b/protocols/Telegram/src/resource.h index 7f1fda4af3..5b55af12a3 100644 --- a/protocols/Telegram/src/resource.h +++ b/protocols/Telegram/src/resource.h @@ -15,6 +15,7 @@ #define IDI_BOT 110 #define IDD_MYPROFILE 111 #define IDD_OPTIONS_SESSIONS 112 +#define IDD_CHANNEL_INFO 113 #define IDC_PHONE 1001 #define IDC_DEFGROUP 1002 #define IDC_HIDECHATS 1003 @@ -38,16 +39,18 @@ #define IDC_BIO 1020 #define IDC_BIRTHDAY 1021 #define IDC_SESSIONS 1023 +#define IDC_LINK 1024 #define IDC_SOFTWARE 1025 -#define IDC_LOGOUT 1025 +#define IDC_LOGOUT 1026 +#define IDC_USER_COUNT 1027 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 119 +#define _APS_NEXT_RESOURCE_VALUE 120 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1029 +#define _APS_NEXT_CONTROL_VALUE 1030 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/protocols/Telegram/src/server.cpp b/protocols/Telegram/src/server.cpp index 2845520fdb..209fefd70e 100644 --- a/protocols/Telegram/src/server.cpp +++ b/protocols/Telegram/src/server.cpp @@ -538,8 +538,7 @@ INT_PTR CTelegramProto::SvcLoadServerHistory(WPARAM hContact, LPARAM) INT_PTR CTelegramProto::SvcCanEmptyHistory(WPARAM hContact, LPARAM bIncoming) { if (auto *pUser = FindUser(GetId(hContact))) { - TG_SUPER_GROUP tmp(pUser->id, 0); - if (auto *pGroup = m_arSuperGroups.find(&tmp)) + if (auto *pGroup = FindSuperGroup(pUser->id)) if (pGroup->group->is_channel_) return 0; diff --git a/protocols/Telegram/src/userinfo.cpp b/protocols/Telegram/src/userinfo.cpp index ae5e5b64d1..30b3af0050 100644 --- a/protocols/Telegram/src/userinfo.cpp +++ b/protocols/Telegram/src/userinfo.cpp @@ -17,6 +17,9 @@ along with this program. If not, see . #include "stdafx.h" +///////////////////////////////////////////////////////////////////////////////////////// +// Dialog for my own profile in Telegram + class CMyProfileDlg : public CUserInfoPageDlg { CTelegramProto *m_proto; @@ -31,7 +34,19 @@ public: bool OnRefresh() override { - m_proto->RetrieveProfile(this); + HWND _hwndDate = GetDlgItem(m_hwnd, IDC_BIRTHDAY); + SYSTEMTIME st = {}; + st.wDay = m_proto->getWord(m_hContact, "BirthDay"); + st.wMonth = m_proto->getWord(m_hContact, "BirthMonth"); + st.wYear = m_proto->getWord(m_hContact, "BirthYear"); + + if (st.wDay && st.wMonth && st.wYear) { + DateTime_SetSystemtime(_hwndDate, GDT_VALID, &st); + DateTime_SetFormat(_hwndDate, NULL); + } + else DateTime_SetFormat(_hwndDate, TranslateT("Unspecified")); + + edtNotes.SetText(m_proto->getMStringW(m_hContact, "About")); return true; } @@ -39,8 +54,7 @@ public: { m_proto->WindowSubscribe(m_hwnd); - OnRefresh(); - Display(); + m_proto->GetInfo(0, 0); return true; } @@ -57,59 +71,81 @@ public: { m_proto->WindowUnsubscribe(m_hwnd); } - - void Display() - { - HWND _hwndDate = GetDlgItem(m_hwnd, IDC_BIRTHDAY); - SYSTEMTIME st = {}; - st.wDay = m_proto->getWord(m_hContact, "BirthDay"); - st.wMonth = m_proto->getWord(m_hContact, "BirthMonth"); - st.wYear = m_proto->getWord(m_hContact, "BirthYear"); - - if (st.wDay && st.wMonth && st.wYear) { - DateTime_SetSystemtime(_hwndDate, GDT_VALID, &st); - DateTime_SetFormat(_hwndDate, NULL); - } - else DateTime_SetFormat(_hwndDate, TranslateT("Unspecified")); - - edtNotes.SetText(m_proto->getMStringW(m_hContact, "About")); - } }; ///////////////////////////////////////////////////////////////////////////////////////// +// Channel info dialog -void CTelegramProto::RetrieveProfile(CMyProfileDlg *pDlg) +class CChannelInfoDlg : public CUserInfoPageDlg { - SendQuery(new TD::getUserFullInfo(m_iOwnId), &CTelegramProto::OnReceivedProfile, pDlg); -} + CMStringA m_szLink; + CTelegramProto *m_proto; -void CTelegramProto::OnReceivedProfile(td::ClientManager::Response &response, void *pUserData) -{ - if (!response.object) - return; + CCtrlEdit edtUserCount; + CCtrlHyperlink m_link; + +public: + CChannelInfoDlg(CTelegramProto *ppro) : + CUserInfoPageDlg(g_plugin, IDD_CHANNEL_INFO), + m_proto(ppro), + m_link(this, IDC_LINK), + edtUserCount(this, IDC_USER_COUNT) + {} - if (response.object->get_id() != TD::userFullInfo::ID) { - debugLogA("Gotten class ID %d instead of %d, exiting", response.object->get_id(), TD::updateUserFullInfo::ID); - return; + bool OnInitDialog() override + { + m_proto->WindowSubscribe(m_hwnd); + return true; } - ProcessUserInfo(m_iOwnId, (TD::userFullInfo *)response.object.get()); - ((CMyProfileDlg *)pUserData)->Display(); -} + int Resizer(UTILRESIZECONTROL *urc) override + { + switch (urc->wId) { + case IDC_LINK: + return RD_ANCHORX_WIDTH | RD_ANCHORY_TOP; + } + return RD_ANCHORX_RIGHT | RD_ANCHORY_TOP; + } + + void OnDestroy() override + { + m_proto->WindowUnsubscribe(m_hwnd); + } + + bool OnRefresh() override + { + edtUserCount.SetInt(m_proto->getDword(m_hContact, "MemberCount")); + + m_szLink = m_proto->getMStringA(m_hContact, "Link"); + m_link.SetUrl(m_szLink); + m_link.SetTextA(m_szLink); + return true; + } +}; ///////////////////////////////////////////////////////////////////////////////////////// // module entry point int CTelegramProto::OnUserInfoInit(WPARAM wParam, LPARAM hContact) { - if (hContact != 0) - return 0; - USERINFOPAGE uip = {}; uip.flags = ODPF_UNICODE | ODPF_ICON; uip.szProto = m_szModuleName; uip.szTitle.w = m_tszUserName; - uip.pDialog = new CMyProfileDlg(this); uip.dwInitParam = (INT_PTR)Skin_GetProtoIcon(m_szModuleName, ID_STATUS_ONLINE); + + if (hContact != 0) { + // we display this tab only for our contacts + char *szProto = Proto_GetBaseAccountName(hContact); + if (!szProto || mir_strcmp(szProto, m_szModuleName)) + return 0; + + auto *pUser = FindUser(GetId(hContact)); + if (pUser && pUser->isChannel) + uip.pDialog = new CChannelInfoDlg(this); + else + return 0; + } + else uip.pDialog = new CMyProfileDlg(this); return g_plugin.addUserInfo(wParam, &uip); } diff --git a/protocols/Telegram/src/utils.cpp b/protocols/Telegram/src/utils.cpp index 2fbf18c2f2..ed9b37473d 100644 --- a/protocols/Telegram/src/utils.cpp +++ b/protocols/Telegram/src/utils.cpp @@ -381,6 +381,12 @@ void CTelegramProto::UpdateString(MCONTACT hContact, const char *pszSetting, con setUString(hContact, pszSetting, str.c_str()); } +TG_SUPER_GROUP* CTelegramProto::FindSuperGroup(int64_t id) +{ + TG_SUPER_GROUP tmp(id, 0); + return m_arSuperGroups.find(&tmp); +} + ///////////////////////////////////////////////////////////////////////////////////////// // Users -- cgit v1.2.3