summaryrefslogtreecommitdiff
path: root/protocols/Telegram
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-09-18 18:14:53 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-09-18 18:14:53 +0300
commit78c5dd9a8648dba7ca09f59b4b7460610c6ff3a6 (patch)
tree0a49a7e53e8ba05f501f46dd6ed36e355b49158b /protocols/Telegram
parent41e677d44f0efc241bf484252af6de64b0d00a6c (diff)
Telegram: ability to add custom chat reactions using NewHistory
Diffstat (limited to 'protocols/Telegram')
-rw-r--r--protocols/Telegram/res/reaction.icobin0 -> 1150 bytes
-rw-r--r--protocols/Telegram/res/resource.rc21
-rw-r--r--protocols/Telegram/src/main.cpp3
-rw-r--r--protocols/Telegram/src/menus.cpp75
-rw-r--r--protocols/Telegram/src/proto.h10
-rw-r--r--protocols/Telegram/src/resource.h5
-rw-r--r--protocols/Telegram/src/server.cpp35
7 files changed, 141 insertions, 8 deletions
diff --git a/protocols/Telegram/res/reaction.ico b/protocols/Telegram/res/reaction.ico
new file mode 100644
index 0000000000..9fa0abcfc6
--- /dev/null
+++ b/protocols/Telegram/res/reaction.ico
Binary files differ
diff --git a/protocols/Telegram/res/resource.rc b/protocols/Telegram/res/resource.rc
index 340d24eb87..cf5e73e2f5 100644
--- a/protocols/Telegram/res/resource.rc
+++ b/protocols/Telegram/res/resource.rc
@@ -140,6 +140,16 @@ BEGIN
PUSHBUTTON "Cancel",IDCANCEL,158,248,50,14
END
+IDD_REACTIONS DIALOGEX 0, 0, 215, 40
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Forward message"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ COMBOBOX IDC_REACTIONS,8,4,201,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "OK",IDOK,104,22,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,158,22,50,14
+END
+
/////////////////////////////////////////////////////////////////////////////
//
@@ -154,6 +164,7 @@ IDI_PREMIUM ICON "premium.ico"
IDI_FORWARD ICON "forward.ico"
+IDI_REACTION ICON "reaction.ico"
/////////////////////////////////////////////////////////////////////////////
//
@@ -180,6 +191,11 @@ BEGIN
BEGIN
BOTTOMMARGIN, 262
END
+
+ "IDC_REACTION", DIALOG
+ BEGIN
+ BOTTOMMARGIN, 36
+ END
END
#endif // APSTUDIO_INVOKED
@@ -209,6 +225,11 @@ BEGIN
0
END
+IDC_REACTION AFX_DIALOG_LAYOUT
+BEGIN
+ 0
+END
+
#endif // English (Neutral) resources
/////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/Telegram/src/main.cpp b/protocols/Telegram/src/main.cpp
index 32206a9b6c..ee1aa1ecee 100644
--- a/protocols/Telegram/src/main.cpp
+++ b/protocols/Telegram/src/main.cpp
@@ -41,7 +41,8 @@ extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOC
static IconItem iconList[] =
{
{ LPGEN("Telegram Premium user"), "premuim", IDI_PREMIUM },
- { LPGEN("Forward"), "forward", IDI_FORWARD },
+ { LPGEN("Forward"), "forward", IDI_FORWARD },
+ { LPGEN("Reaction"), "reaction", IDI_REACTION },
};
int CMPlugin::Load()
diff --git a/protocols/Telegram/src/menus.cpp b/protocols/Telegram/src/menus.cpp
index 12bcdd2afa..73327f1665 100644
--- a/protocols/Telegram/src/menus.cpp
+++ b/protocols/Telegram/src/menus.cpp
@@ -35,15 +35,30 @@ void CTelegramProto::InitMenus()
mi.hIcolibItem = g_plugin.getIconHandle(IDI_FORWARD);
mi.name.a = LPGEN("Forward");
hmiForward = Menu_AddNewStoryMenuItem(&mi, 1);
+
+ mi.position = 1000000;
+ mi.hIcolibItem = g_plugin.getIconHandle(IDI_REACTION);
+ mi.name.a = LPGEN("Reaction");
+ hmiReaction = Menu_AddNewStoryMenuItem(&mi, 2);
}
int CTelegramProto::OnPrebuildMenu(WPARAM hContact, LPARAM)
{
- Menu_ShowItem(hmiForward, Proto_IsProtoOnContact(hContact, m_szModuleName));
+ if (!Proto_IsProtoOnContact(hContact, m_szModuleName)) {
+ Menu_ShowItem(hmiForward, false);
+ Menu_ShowItem(hmiReaction, false);
+ }
+ else {
+ Menu_ShowItem(hmiForward, true);
+
+ auto *pUser = FindUser(GetId(hContact));
+ Menu_ShowItem(hmiReaction, pUser && pUser->pReactions);
+ }
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
+// Dialog for message forwarding
class CForwardDlg : public CTelegramDlgBase
{
@@ -114,13 +129,63 @@ public:
}
};
+/////////////////////////////////////////////////////////////////////////////////////////
+// Dialog for sending reaction
+
+class CReactionsDlg : public CTelegramDlgBase
+{
+ MEVENT m_hEvent;
+ TG_USER *m_pUser;
+ CCtrlCombo cmbReactions;
+
+public:
+ CReactionsDlg(CTelegramProto *ppro, MEVENT hEvent) :
+ CTelegramDlgBase(ppro, IDD_REACTIONS),
+ m_hEvent(hEvent),
+ cmbReactions(this, IDC_REACTIONS)
+ {
+ m_pUser = ppro->FindUser(ppro->GetId(db_event_getContact(hEvent)));
+ }
+
+ bool OnInitDialog() override
+ {
+ for (auto &it : *m_pUser->pReactions)
+ cmbReactions.AddString(Utf2T(it), (LPARAM)it);
+ return true;
+ }
+
+ bool OnApply() override
+ {
+ DB::EventInfo dbei(m_hEvent, false);
+ __int64 msgId = (dbei && dbei.szId) ? _atoi64(dbei.szId) : 0;
+
+ char *pszEmoji = (char *)cmbReactions.GetCurData();
+ auto reaction = TD::make_object<TD::reactionTypeEmoji>(pszEmoji);
+
+ m_proto->SendQuery(new TD::addMessageReaction(m_pUser->chatId, msgId, std::move(reaction), false, false));
+ return true;
+ }
+};
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Module entry point
+
INT_PTR CTelegramProto::SvcExecMenu(WPARAM iCommand, LPARAM pHandle)
{
switch (iCommand) {
- case 1:
- std::vector<MEVENT> ids = NS_GetSelection(HANDLE(pHandle));
- if (!ids.empty())
- CForwardDlg(this, ids).DoModal();
+ case 1: // forward message
+ { std::vector<MEVENT> ids = NS_GetSelection(HANDLE(pHandle));
+ if (!ids.empty())
+ CForwardDlg(this, ids).DoModal();
+ }
+ break;
+
+ case 2: // reactions
+ {
+ MEVENT hCurrentEvent = NS_GetCurrent((HANDLE)pHandle);
+ if (hCurrentEvent != -1)
+ CReactionsDlg(this, hCurrentEvent).DoModal();
+ }
break;
}
return 0;
diff --git a/protocols/Telegram/src/proto.h b/protocols/Telegram/src/proto.h
index 27394a241c..a4bfc440d2 100644
--- a/protocols/Telegram/src/proto.h
+++ b/protocols/Telegram/src/proto.h
@@ -95,6 +95,11 @@ struct TG_USER : public MZeroedObject
chatId = (isGroupChat) ? -1 : id;
}
+ ~TG_USER()
+ {
+ delete pReactions;
+ }
+
int64_t id, chatId;
MCONTACT hContact;
bool isGroupChat, bLoadMembers;
@@ -103,6 +108,7 @@ struct TG_USER : public MZeroedObject
time_t m_timer1 = 0, m_timer2 = 0;
SESSION_INFO *m_si = nullptr;
TD::chatNotificationSettings notificationSettings;
+ OBJLIST<char> *pReactions = nullptr;
CMStringW getDisplayName() const;
};
@@ -145,6 +151,7 @@ struct TG_OWN_MESSAGE
class CTelegramProto : public PROTO<CTelegramProto>
{
friend class CForwardDlg;
+ friend class CReactionsDlg;
friend class CAddPhoneContactDlg;
class CProtoImpl
@@ -236,6 +243,7 @@ class CTelegramProto : public PROTO<CTelegramProto>
void ProcessChatLastMessage(TD::updateChatLastMessage *pObj);
void ProcessChatNotification(TD::updateChatNotificationSettings *pObj);
void ProcessChatPosition(TD::updateChatPosition *pObj);
+ void ProcessChatReactions(TD::updateChatAvailableReactions *);
void ProcessConnectionState(TD::updateConnectionState *pObj);
void ProcessDeleteMessage(TD::updateDeleteMessages *pObj);
void ProcessFile(TD::updateFile *pObj);
@@ -302,7 +310,7 @@ class CTelegramProto : public PROTO<CTelegramProto>
MCONTACT GetRealContact(const TG_USER *pUser);
// Menus
- HGENMENU hmiForward;
+ HGENMENU hmiForward, hmiReaction;
void InitMenus();
diff --git a/protocols/Telegram/src/resource.h b/protocols/Telegram/src/resource.h
index f72710ca00..6a15eac64e 100644
--- a/protocols/Telegram/src/resource.h
+++ b/protocols/Telegram/src/resource.h
@@ -10,6 +10,8 @@
#define IDI_FORWARD 105
#define IDD_FORWARD 106
#define IDD_ADD_PHONE 107
+#define IDI_REACTION 108
+#define IDD_REACTIONS 109
#define IDC_PHONE 1001
#define IDC_DEFGROUP 1002
#define IDC_HIDECHATS 1003
@@ -29,6 +31,7 @@
#define IDC_LAST_NAME 1015
#define IDC_CLIST 1016
#define IDC_COMPRESS_FILES 1017
+#define IDC_REACTIONS 1018
// Next default values for new objects
//
@@ -36,7 +39,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 109
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1016
+#define _APS_NEXT_CONTROL_VALUE 1019
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/protocols/Telegram/src/server.cpp b/protocols/Telegram/src/server.cpp
index 3eb42bd103..403d2f390c 100644
--- a/protocols/Telegram/src/server.cpp
+++ b/protocols/Telegram/src/server.cpp
@@ -161,6 +161,10 @@ void CTelegramProto::ProcessResponse(td::ClientManager::Response response)
ProcessChatPosition((TD::updateChatPosition *)response.object.get());
break;
+ case TD::updateChatAvailableReactions::ID:
+ ProcessChatReactions((TD::updateChatAvailableReactions *)response.object.get());
+ break;
+
case TD::updateChatReadInbox::ID:
ProcessMarkRead((TD::updateChatReadInbox *)response.object.get());
break;
@@ -516,6 +520,37 @@ void CTelegramProto::ProcessChatPosition(TD::updateChatPosition *pObj)
}
}
+void CTelegramProto::ProcessChatReactions(TD::updateChatAvailableReactions *pObj)
+{
+ if (pObj->available_reactions_->get_id() != TD::chatAvailableReactionsSome::ID) {
+ debugLogA("Unsupported reactions type: %d", pObj->available_reactions_->get_id());
+ return;
+ }
+
+ auto &pReactions = ((TD::chatAvailableReactionsSome *)pObj->available_reactions_.get())->reactions_;
+
+ if (auto *pChat = FindChat(pObj->chat_id_)) {
+ if (!pChat->pReactions)
+ pChat->pReactions = new OBJLIST<char>(1);
+ else
+ pChat->pReactions->destroy();
+
+ for (auto &it : pReactions) {
+ if (it->get_id() != TD::reactionTypeEmoji::ID)
+ continue;
+
+ auto *pEmoji = (TD::reactionTypeEmoji *)it.get();
+ auto &str = pEmoji->emoji_;
+ pChat->pReactions->insert(mir_strcpy(new char[str.length() + 1], str.c_str()));
+ }
+
+ if (pChat->pReactions->getCount() == 0) {
+ delete pChat->pReactions;
+ pChat->pReactions = nullptr;
+ }
+ }
+}
+
void CTelegramProto::ProcessConnectionState(TD::updateConnectionState *pObj)
{
pConnState = std::move(pObj->state_);