diff options
Diffstat (limited to 'protocols/Telegram/src')
-rw-r--r-- | protocols/Telegram/src/groupchat.cpp | 23 | ||||
-rw-r--r-- | protocols/Telegram/src/proto.cpp | 5 | ||||
-rw-r--r-- | protocols/Telegram/src/proto.h | 5 | ||||
-rw-r--r-- | protocols/Telegram/src/resource.h | 9 | ||||
-rw-r--r-- | protocols/Telegram/src/server.cpp | 3 | ||||
-rw-r--r-- | protocols/Telegram/src/userinfo.cpp | 110 | ||||
-rw-r--r-- | protocols/Telegram/src/utils.cpp | 6 |
7 files changed, 108 insertions, 53 deletions
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<CTelegramProto> 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<CTelegramProto> 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 <http://www.gnu.org/licenses/>. #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
|