mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Moved sending of bot's CallbackData and CallbackGame to separate file.
This commit is contained in:
parent
515d8e78da
commit
9445ce4b09
9 changed files with 168 additions and 143 deletions
|
@ -208,6 +208,8 @@ nice_target_sources(Telegram ${src_loc}
|
||||||
PRIVATE
|
PRIVATE
|
||||||
${style_files}
|
${style_files}
|
||||||
|
|
||||||
|
api/api_bot.cpp
|
||||||
|
api/api_bot.h
|
||||||
api/api_chat_filters.cpp
|
api/api_chat_filters.cpp
|
||||||
api/api_chat_filters.h
|
api/api_chat_filters.h
|
||||||
api/api_common.h
|
api/api_common.h
|
||||||
|
|
112
Telegram/SourceFiles/api/api_bot.cpp
Normal file
112
Telegram/SourceFiles/api/api_bot.cpp
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
This file is part of Telegram Desktop,
|
||||||
|
the official desktop application for the Telegram messaging service.
|
||||||
|
|
||||||
|
For license and copyright information please follow this link:
|
||||||
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
*/
|
||||||
|
#include "api/api_bot.h"
|
||||||
|
|
||||||
|
#include "apiwrap.h"
|
||||||
|
#include "api/api_send_progress.h"
|
||||||
|
#include "boxes/confirm_box.h"
|
||||||
|
#include "boxes/share_box.h"
|
||||||
|
#include "core/click_handler_types.h"
|
||||||
|
#include "data/data_changes.h"
|
||||||
|
#include "data/data_peer.h"
|
||||||
|
#include "data/data_session.h"
|
||||||
|
#include "history/history.h"
|
||||||
|
#include "history/history_item.h"
|
||||||
|
#include "history/history_item_components.h"
|
||||||
|
#include "main/main_session.h"
|
||||||
|
#include "ui/toast/toast.h"
|
||||||
|
|
||||||
|
namespace Api {
|
||||||
|
|
||||||
|
void SendBotCallbackData(
|
||||||
|
not_null<HistoryItem*> item,
|
||||||
|
int row,
|
||||||
|
int column) {
|
||||||
|
if (!IsServerMsgId(item->id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const auto history = item->history();
|
||||||
|
const auto session = &history->session();
|
||||||
|
const auto owner = &history->owner();
|
||||||
|
const auto api = &session->api();
|
||||||
|
const auto bot = item->getMessageBot();
|
||||||
|
const auto getButton = [=] {
|
||||||
|
return HistoryMessageMarkupButton::Get(
|
||||||
|
owner,
|
||||||
|
item->fullId(),
|
||||||
|
row,
|
||||||
|
column);
|
||||||
|
};
|
||||||
|
const auto button = getButton();
|
||||||
|
if (!button) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using ButtonType = HistoryMessageMarkupButton::Type;
|
||||||
|
const auto gameProgressType = Api::SendProgressType::PlayGame;
|
||||||
|
const auto isGame = (button->type == ButtonType::Game);
|
||||||
|
|
||||||
|
auto flags = MTPmessages_GetBotCallbackAnswer::Flags(0);
|
||||||
|
QByteArray sendData;
|
||||||
|
if (isGame) {
|
||||||
|
flags |= MTPmessages_GetBotCallbackAnswer::Flag::f_game;
|
||||||
|
} else if (button->type == ButtonType::Callback) {
|
||||||
|
flags |= MTPmessages_GetBotCallbackAnswer::Flag::f_data;
|
||||||
|
sendData = button->data;
|
||||||
|
}
|
||||||
|
button->requestId = api->request(MTPmessages_GetBotCallbackAnswer(
|
||||||
|
MTP_flags(flags),
|
||||||
|
history->peer->input,
|
||||||
|
MTP_int(item->id),
|
||||||
|
MTP_bytes(sendData)
|
||||||
|
)).done([=](const MTPmessages_BotCallbackAnswer &result, auto id) {
|
||||||
|
if (const auto button = getButton()) {
|
||||||
|
button->requestId = 0;
|
||||||
|
owner->requestItemRepaint(item);
|
||||||
|
}
|
||||||
|
result.match([&](const MTPDmessages_botCallbackAnswer &data) {
|
||||||
|
if (const auto message = data.vmessage()) {
|
||||||
|
if (data.is_alert()) {
|
||||||
|
Ui::show(Box<InformBox>(qs(*message)));
|
||||||
|
} else {
|
||||||
|
Ui::Toast::Show(qs(*message));
|
||||||
|
}
|
||||||
|
} else if (const auto url = data.vurl()) {
|
||||||
|
const auto link = qs(*url);
|
||||||
|
if (!isGame) {
|
||||||
|
UrlClickHandler::Open(link);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const auto scoreLink = AppendShareGameScoreUrl(
|
||||||
|
session,
|
||||||
|
link,
|
||||||
|
item->fullId());
|
||||||
|
BotGameUrlClickHandler(bot, scoreLink).onClick({});
|
||||||
|
|
||||||
|
if (history->mySendActionUpdated(gameProgressType, true)) {
|
||||||
|
session->sendProgressManager().update(
|
||||||
|
history,
|
||||||
|
gameProgressType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).fail([=](const RPCError &error, auto id) {
|
||||||
|
// Show error?
|
||||||
|
if (const auto button = getButton()) {
|
||||||
|
button->requestId = 0;
|
||||||
|
owner->requestItemRepaint(item);
|
||||||
|
}
|
||||||
|
}).send();
|
||||||
|
|
||||||
|
session->changes().messageUpdated(
|
||||||
|
item,
|
||||||
|
Data::MessageUpdate::Flag::BotCallbackSent
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Api
|
19
Telegram/SourceFiles/api/api_bot.h
Normal file
19
Telegram/SourceFiles/api/api_bot.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
This file is part of Telegram Desktop,
|
||||||
|
the official desktop application for the Telegram messaging service.
|
||||||
|
|
||||||
|
For license and copyright information please follow this link:
|
||||||
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class HistoryItem;
|
||||||
|
|
||||||
|
namespace Api {
|
||||||
|
|
||||||
|
void SendBotCallbackData(
|
||||||
|
not_null<HistoryItem*> item,
|
||||||
|
int row,
|
||||||
|
int column);
|
||||||
|
|
||||||
|
} // namespace Api
|
|
@ -134,8 +134,9 @@ struct MessageUpdate {
|
||||||
DialogRowRefresh = (1 << 3),
|
DialogRowRefresh = (1 << 3),
|
||||||
CallAdded = (1 << 4),
|
CallAdded = (1 << 4),
|
||||||
ReplyMarkup = (1 << 5),
|
ReplyMarkup = (1 << 5),
|
||||||
|
BotCallbackSent = (1 << 6),
|
||||||
|
|
||||||
LastUsedBit = (1 << 5),
|
LastUsedBit = (1 << 6),
|
||||||
};
|
};
|
||||||
using Flags = base::flags<Flag>;
|
using Flags = base::flags<Flag>;
|
||||||
friend inline constexpr auto is_flag_type(Flag) { return true; }
|
friend inline constexpr auto is_flag_type(Flag) { return true; }
|
||||||
|
|
|
@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#include "facades.h"
|
#include "facades.h"
|
||||||
|
|
||||||
|
#include "api/api_bot.h"
|
||||||
#include "info/info_memento.h"
|
#include "info/info_memento.h"
|
||||||
#include "core/click_handler_types.h"
|
#include "core/click_handler_types.h"
|
||||||
#include "core/application.h"
|
#include "core/application.h"
|
||||||
|
@ -106,9 +107,10 @@ void activateBotCommand(
|
||||||
|
|
||||||
case ButtonType::Callback:
|
case ButtonType::Callback:
|
||||||
case ButtonType::Game: {
|
case ButtonType::Game: {
|
||||||
if (const auto m = CheckMainWidget(&msg->history()->session())) {
|
Api::SendBotCallbackData(
|
||||||
m->app_sendBotCallback(button, msg, row, column);
|
const_cast<HistoryItem*>(msg.get()),
|
||||||
}
|
row,
|
||||||
|
column);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ButtonType::Buy: {
|
case ButtonType::Buy: {
|
||||||
|
|
|
@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#include "history/history_widget.h"
|
#include "history/history_widget.h"
|
||||||
|
|
||||||
|
#include "api/api_bot.h"
|
||||||
#include "api/api_sending.h"
|
#include "api/api_sending.h"
|
||||||
#include "api/api_text_entities.h"
|
#include "api/api_text_entities.h"
|
||||||
#include "api/api_send_progress.h"
|
#include "api/api_send_progress.h"
|
||||||
|
@ -604,6 +605,33 @@ HistoryWidget::HistoryWidget(
|
||||||
}
|
}
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
||||||
|
session().changes().messageUpdates(
|
||||||
|
Data::MessageUpdate::Flag::BotCallbackSent
|
||||||
|
) | rpl::start_with_next([=](const Data::MessageUpdate &update) {
|
||||||
|
const auto item = update.item;
|
||||||
|
if (item->id < 0 || _peer != item->history()->peer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto keyId = _keyboard->forMsgId();
|
||||||
|
const auto lastKeyboardUsed = (keyId == FullMsgId(_channel, item->id))
|
||||||
|
&& (keyId == FullMsgId(_channel, _history->lastKeyboardId));
|
||||||
|
|
||||||
|
session().data().requestItemRepaint(item);
|
||||||
|
|
||||||
|
if (_replyToId == item->id) {
|
||||||
|
cancelReply();
|
||||||
|
}
|
||||||
|
if (_keyboard->singleUse()
|
||||||
|
&& _keyboard->hasMarkup()
|
||||||
|
&& lastKeyboardUsed) {
|
||||||
|
if (_kbShown) {
|
||||||
|
toggleKeyboard(false);
|
||||||
|
}
|
||||||
|
_history->lastKeyboardUsed = true;
|
||||||
|
}
|
||||||
|
}, lifetime());
|
||||||
|
|
||||||
subscribe(Media::Player::instance()->switchToNextNotifier(), [this](const Media::Player::Instance::Switch &pair) {
|
subscribe(Media::Player::instance()->switchToNextNotifier(), [this](const Media::Player::Instance::Switch &pair) {
|
||||||
if (pair.from.type() == AudioMsgId::Type::Voice) {
|
if (pair.from.type() == AudioMsgId::Type::Voice) {
|
||||||
scrollToCurrentVoiceMessage(pair.from.contextId(), pair.to);
|
scrollToCurrentVoiceMessage(pair.from.contextId(), pair.to);
|
||||||
|
@ -3596,115 +3624,6 @@ void HistoryWidget::hideSingleUseKeyboard(PeerData *peer, MsgId replyTo) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryWidget::app_sendBotCallback(
|
|
||||||
not_null<const HistoryMessageMarkupButton*> button,
|
|
||||||
not_null<const HistoryItem*> msg,
|
|
||||||
int row,
|
|
||||||
int column) {
|
|
||||||
if (msg->id < 0 || _peer != msg->history()->peer) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool lastKeyboardUsed = (_keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId)) && (_keyboard->forMsgId() == FullMsgId(_channel, msg->id));
|
|
||||||
|
|
||||||
auto bot = msg->getMessageBot();
|
|
||||||
|
|
||||||
using ButtonType = HistoryMessageMarkupButton::Type;
|
|
||||||
BotCallbackInfo info = {
|
|
||||||
&session(),
|
|
||||||
bot,
|
|
||||||
msg->fullId(),
|
|
||||||
row,
|
|
||||||
column,
|
|
||||||
(button->type == ButtonType::Game)
|
|
||||||
};
|
|
||||||
auto flags = MTPmessages_GetBotCallbackAnswer::Flags(0);
|
|
||||||
QByteArray sendData;
|
|
||||||
if (info.game) {
|
|
||||||
flags |= MTPmessages_GetBotCallbackAnswer::Flag::f_game;
|
|
||||||
} else if (button->type == ButtonType::Callback) {
|
|
||||||
flags |= MTPmessages_GetBotCallbackAnswer::Flag::f_data;
|
|
||||||
sendData = button->data;
|
|
||||||
}
|
|
||||||
button->requestId = session().api().request(MTPmessages_GetBotCallbackAnswer(
|
|
||||||
MTP_flags(flags),
|
|
||||||
_peer->input,
|
|
||||||
MTP_int(msg->id),
|
|
||||||
MTP_bytes(sendData)
|
|
||||||
)).done([info](const MTPmessages_BotCallbackAnswer &result, mtpRequestId requestId) {
|
|
||||||
BotCallbackDone(info, result, requestId);
|
|
||||||
}).fail([info](const RPCError &error, mtpRequestId requestId) {
|
|
||||||
BotCallbackFail(info, error, requestId);
|
|
||||||
}).send();
|
|
||||||
session().data().requestItemRepaint(msg);
|
|
||||||
|
|
||||||
if (_replyToId == msg->id) {
|
|
||||||
cancelReply();
|
|
||||||
}
|
|
||||||
if (_keyboard->singleUse() && _keyboard->hasMarkup() && lastKeyboardUsed) {
|
|
||||||
if (_kbShown) toggleKeyboard(false);
|
|
||||||
_history->lastKeyboardUsed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HistoryWidget::BotCallbackDone(
|
|
||||||
BotCallbackInfo info,
|
|
||||||
const MTPmessages_BotCallbackAnswer &answer,
|
|
||||||
mtpRequestId req) {
|
|
||||||
const auto session = info.session;
|
|
||||||
const auto item = session->data().message(info.msgId);
|
|
||||||
const auto button = HistoryMessageMarkupButton::Get(
|
|
||||||
&session->data(),
|
|
||||||
info.msgId,
|
|
||||||
info.row,
|
|
||||||
info.col);
|
|
||||||
if (button && button->requestId == req) {
|
|
||||||
button->requestId = 0;
|
|
||||||
session->data().requestItemRepaint(item);
|
|
||||||
}
|
|
||||||
answer.match([&](const MTPDmessages_botCallbackAnswer &data) {
|
|
||||||
if (const auto message = data.vmessage()) {
|
|
||||||
if (data.is_alert()) {
|
|
||||||
Ui::show(Box<InformBox>(qs(*message)));
|
|
||||||
} else {
|
|
||||||
Ui::Toast::Show(qs(*message));
|
|
||||||
}
|
|
||||||
} else if (const auto url = data.vurl()) {
|
|
||||||
auto link = qs(*url);
|
|
||||||
if (info.game) {
|
|
||||||
link = AppendShareGameScoreUrl(session, link, info.msgId);
|
|
||||||
BotGameUrlClickHandler(info.bot, link).onClick({});
|
|
||||||
} else {
|
|
||||||
UrlClickHandler::Open(link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (const auto item = info.session->data().message(info.msgId)) {
|
|
||||||
if (!data.vmessage() && data.vurl() && info.game) {
|
|
||||||
info.session->sendProgressManager().update(
|
|
||||||
item->history(),
|
|
||||||
Api::SendProgressType::PlayGame);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void HistoryWidget::BotCallbackFail(
|
|
||||||
BotCallbackInfo info,
|
|
||||||
const RPCError &error,
|
|
||||||
mtpRequestId req) {
|
|
||||||
// show error?
|
|
||||||
const auto owner = &info.session->data();
|
|
||||||
const auto button = HistoryMessageMarkupButton::Get(
|
|
||||||
owner,
|
|
||||||
info.msgId,
|
|
||||||
info.row,
|
|
||||||
info.col);
|
|
||||||
if (button && button->requestId == req) {
|
|
||||||
button->requestId = 0;
|
|
||||||
owner->requestItemRepaint(owner->message(info.msgId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HistoryWidget::insertBotCommand(const QString &cmd) {
|
bool HistoryWidget::insertBotCommand(const QString &cmd) {
|
||||||
if (!canWriteMessage()) return false;
|
if (!canWriteMessage()) return false;
|
||||||
|
|
||||||
|
|
|
@ -268,12 +268,6 @@ public:
|
||||||
bool floatPlayerHandleWheelEvent(QEvent *e) override;
|
bool floatPlayerHandleWheelEvent(QEvent *e) override;
|
||||||
QRect floatPlayerAvailableRect() override;
|
QRect floatPlayerAvailableRect() override;
|
||||||
|
|
||||||
void app_sendBotCallback(
|
|
||||||
not_null<const HistoryMessageMarkupButton*> button,
|
|
||||||
not_null<const HistoryItem*> msg,
|
|
||||||
int row,
|
|
||||||
int column);
|
|
||||||
|
|
||||||
PeerData *ui_getPeerForMouseAction();
|
PeerData *ui_getPeerForMouseAction();
|
||||||
|
|
||||||
bool notify_switchInlineBotButtonReceived(const QString &query, UserData *samePeerBot, MsgId samePeerReplyTo);
|
bool notify_switchInlineBotButtonReceived(const QString &query, UserData *samePeerBot, MsgId samePeerReplyTo);
|
||||||
|
@ -335,13 +329,6 @@ private:
|
||||||
using TabbedPanel = ChatHelpers::TabbedPanel;
|
using TabbedPanel = ChatHelpers::TabbedPanel;
|
||||||
using TabbedSelector = ChatHelpers::TabbedSelector;
|
using TabbedSelector = ChatHelpers::TabbedSelector;
|
||||||
using DragState = Storage::MimeDataState;
|
using DragState = Storage::MimeDataState;
|
||||||
struct BotCallbackInfo {
|
|
||||||
not_null<Main::Session*> session;
|
|
||||||
UserData *bot;
|
|
||||||
FullMsgId msgId;
|
|
||||||
int row, col;
|
|
||||||
bool game;
|
|
||||||
};
|
|
||||||
struct PinnedBar {
|
struct PinnedBar {
|
||||||
PinnedBar(MsgId msgId, HistoryWidget *parent);
|
PinnedBar(MsgId msgId, HistoryWidget *parent);
|
||||||
~PinnedBar();
|
~PinnedBar();
|
||||||
|
@ -551,9 +538,6 @@ private:
|
||||||
|
|
||||||
static void UnpinMessage(not_null<PeerData*> peer);
|
static void UnpinMessage(not_null<PeerData*> peer);
|
||||||
|
|
||||||
static void BotCallbackDone(BotCallbackInfo info, const MTPmessages_BotCallbackAnswer &answer, mtpRequestId req);
|
|
||||||
static void BotCallbackFail(BotCallbackInfo info, const RPCError &error, mtpRequestId req);
|
|
||||||
|
|
||||||
void updateHistoryGeometry(bool initial = false, bool loadedDown = false, const ScrollChange &change = { ScrollChangeNone, 0 });
|
void updateHistoryGeometry(bool initial = false, bool loadedDown = false, const ScrollChange &change = { ScrollChangeNone, 0 });
|
||||||
void updateListSize();
|
void updateListSize();
|
||||||
|
|
||||||
|
|
|
@ -833,14 +833,6 @@ void MainWidget::hideSingleUseKeyboard(PeerData *peer, MsgId replyTo) {
|
||||||
_history->hideSingleUseKeyboard(peer, replyTo);
|
_history->hideSingleUseKeyboard(peer, replyTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWidget::app_sendBotCallback(
|
|
||||||
not_null<const HistoryMessageMarkupButton*> button,
|
|
||||||
not_null<const HistoryItem*> msg,
|
|
||||||
int row,
|
|
||||||
int column) {
|
|
||||||
_history->app_sendBotCallback(button, msg, row, column);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MainWidget::insertBotCommand(const QString &cmd) {
|
bool MainWidget::insertBotCommand(const QString &cmd) {
|
||||||
return _history->insertBotCommand(cmd);
|
return _history->insertBotCommand(cmd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,12 +219,6 @@ public:
|
||||||
|
|
||||||
void searchInChat(Dialogs::Key chat);
|
void searchInChat(Dialogs::Key chat);
|
||||||
|
|
||||||
void app_sendBotCallback(
|
|
||||||
not_null<const HistoryMessageMarkupButton*> button,
|
|
||||||
not_null<const HistoryItem*> msg,
|
|
||||||
int row,
|
|
||||||
int column);
|
|
||||||
|
|
||||||
void ui_showPeerHistory(
|
void ui_showPeerHistory(
|
||||||
PeerId peer,
|
PeerId peer,
|
||||||
const SectionShow ¶ms,
|
const SectionShow ¶ms,
|
||||||
|
|
Loading…
Add table
Reference in a new issue