summaryrefslogtreecommitdiff
path: root/protocols/Telegram/src
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/src')
-rw-r--r--protocols/Telegram/src/groupchat.cpp23
-rw-r--r--protocols/Telegram/src/proto.cpp5
-rw-r--r--protocols/Telegram/src/proto.h5
-rw-r--r--protocols/Telegram/src/resource.h9
-rw-r--r--protocols/Telegram/src/server.cpp3
-rw-r--r--protocols/Telegram/src/userinfo.cpp110
-rw-r--r--protocols/Telegram/src/utils.cpp6
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