mirror of https://github.com/procxx/kepka.git
forwarded getState fixed, pinned message service msg dependency request and text update done
This commit is contained in:
parent
2bfb1e0f1f
commit
1c722a425d
|
@ -533,6 +533,17 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
||||||
"lng_action_created_chat" = "{from} created group «{title}»";
|
"lng_action_created_chat" = "{from} created group «{title}»";
|
||||||
"lng_action_created_channel" = "Channel «{title}» created";
|
"lng_action_created_channel" = "Channel «{title}» created";
|
||||||
"lng_action_group_migrate" = "The group was upgraded to a supergroup";
|
"lng_action_group_migrate" = "The group was upgraded to a supergroup";
|
||||||
|
"lng_action_pinned_message" = "{from} pinned «{text}»";
|
||||||
|
"lng_action_pinned_media" = "{from} pinned {media}";
|
||||||
|
"lng_action_pinned_media_photo" = "a photo";
|
||||||
|
"lng_action_pinned_media_video" = "a video file";
|
||||||
|
"lng_action_pinned_media_music" = "a music file";
|
||||||
|
"lng_action_pinned_media_voice" = "a voice message";
|
||||||
|
"lng_action_pinned_media_file" = "a file";
|
||||||
|
"lng_action_pinned_media_gif" = "a GIF animation";
|
||||||
|
"lng_action_pinned_media_contact" = "a contact information";
|
||||||
|
"lng_action_pinned_media_location" = "a location mark";
|
||||||
|
"lng_action_pinned_media_sticker" = "a sticker";
|
||||||
|
|
||||||
"lng_profile_migrate_reached" = "{count:_not_used_|# member|# members} limit reached";
|
"lng_profile_migrate_reached" = "{count:_not_used_|# member|# members} limit reached";
|
||||||
"lng_profile_migrate_about" = "If you'd like to go over this limit, you can upgrade your group to a supergroup. In supergroups:";
|
"lng_profile_migrate_about" = "If you'd like to go over this limit, you can upgrade your group to a supergroup. In supergroups:";
|
||||||
|
|
|
@ -32,7 +32,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
||||||
ApiWrap::ApiWrap(QObject *parent) : QObject(parent) {
|
ApiWrap::ApiWrap(QObject *parent) : QObject(parent) {
|
||||||
App::initBackground();
|
App::initBackground();
|
||||||
|
|
||||||
connect(&_replyToTimer, SIGNAL(timeout()), this, SLOT(resolveReplyTo()));
|
connect(&_dependencyTimer, SIGNAL(timeout()), this, SLOT(resolveDependencyItems()));
|
||||||
connect(&_webPagesTimer, SIGNAL(timeout()), this, SLOT(resolveWebPages()));
|
connect(&_webPagesTimer, SIGNAL(timeout()), this, SLOT(resolveWebPages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,78 +40,78 @@ void ApiWrap::init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiWrap::itemRemoved(HistoryItem *item) {
|
void ApiWrap::itemRemoved(HistoryItem *item) {
|
||||||
if (HistoryReply *reply = item->toHistoryReply()) {
|
if (MsgId dependencyMsgId = item->dependencyMsgId()) {
|
||||||
ChannelData *channel = reply->history()->peer->asChannel();
|
ChannelData *channel = item->history()->peer->asChannel();
|
||||||
ReplyToRequests *requests(replyToRequests(channel, true));
|
DependencyRequests *requests(dependencyRequests(channel, true));
|
||||||
if (requests) {
|
if (requests) {
|
||||||
ReplyToRequests::iterator i = requests->find(reply->replyToId());
|
DependencyRequests::iterator i = requests->find(dependencyMsgId);
|
||||||
if (i != requests->cend()) {
|
if (i != requests->cend()) {
|
||||||
for (QList<HistoryReply*>::iterator j = i->replies.begin(); j != i->replies.end();) {
|
for (QList<HistoryItem*>::iterator j = i->dependentItems.begin(); j != i->dependentItems.end();) {
|
||||||
if ((*j) == reply) {
|
if ((*j) == item) {
|
||||||
j = i->replies.erase(j);
|
j = i->dependentItems.erase(j);
|
||||||
} else {
|
} else {
|
||||||
++j;
|
++j;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i->replies.isEmpty()) {
|
if (i->dependentItems.isEmpty()) {
|
||||||
requests->erase(i);
|
requests->erase(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (channel && requests->isEmpty()) {
|
if (channel && requests->isEmpty()) {
|
||||||
_channelReplyToRequests.remove(channel);
|
_channelDependencyRequests.remove(channel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiWrap::requestReplyTo(HistoryReply *reply, ChannelData *channel, MsgId id) {
|
void ApiWrap::requestDependencyItem(HistoryItem *dependency, ChannelData *channel, MsgId id) {
|
||||||
ReplyToRequest &req(channel ? _channelReplyToRequests[channel][id] : _replyToRequests[id]);
|
DependencyRequest &req(channel ? _channelDependencyRequests[channel][id] : _dependencyRequests[id]);
|
||||||
req.replies.append(reply);
|
req.dependentItems.append(dependency);
|
||||||
if (!req.req) _replyToTimer.start(1);
|
if (!req.req) _dependencyTimer.start(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ApiWrap::MessageIds ApiWrap::collectMessageIds(const ReplyToRequests &requests) {
|
ApiWrap::MessageIds ApiWrap::collectMessageIds(const DependencyRequests &requests) {
|
||||||
MessageIds result;
|
MessageIds result;
|
||||||
result.reserve(requests.size());
|
result.reserve(requests.size());
|
||||||
for (ReplyToRequests::const_iterator i = requests.cbegin(), e = requests.cend(); i != e; ++i) {
|
for (DependencyRequests::const_iterator i = requests.cbegin(), e = requests.cend(); i != e; ++i) {
|
||||||
if (i.value().req > 0) continue;
|
if (i.value().req > 0) continue;
|
||||||
result.push_back(MTP_int(i.key()));
|
result.push_back(MTP_int(i.key()));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
ApiWrap::ReplyToRequests *ApiWrap::replyToRequests(ChannelData *channel, bool onlyExisting) {
|
ApiWrap::DependencyRequests *ApiWrap::dependencyRequests(ChannelData *channel, bool onlyExisting) {
|
||||||
if (channel) {
|
if (channel) {
|
||||||
ChannelReplyToRequests::iterator i = _channelReplyToRequests.find(channel);
|
ChannelDependencyRequests::iterator i = _channelDependencyRequests.find(channel);
|
||||||
if (i == _channelReplyToRequests.cend()) {
|
if (i == _channelDependencyRequests.cend()) {
|
||||||
if (onlyExisting) return 0;
|
if (onlyExisting) return 0;
|
||||||
i = _channelReplyToRequests.insert(channel, ReplyToRequests());
|
i = _channelDependencyRequests.insert(channel, DependencyRequests());
|
||||||
}
|
}
|
||||||
return &i.value();
|
return &i.value();
|
||||||
}
|
}
|
||||||
return &_replyToRequests;
|
return &_dependencyRequests;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiWrap::resolveReplyTo() {
|
void ApiWrap::resolveDependencyItems() {
|
||||||
if (_replyToRequests.isEmpty() && _channelReplyToRequests.isEmpty()) return;
|
if (_dependencyRequests.isEmpty() && _channelDependencyRequests.isEmpty()) return;
|
||||||
|
|
||||||
MessageIds ids = collectMessageIds(_replyToRequests);
|
MessageIds ids = collectMessageIds(_dependencyRequests);
|
||||||
if (!ids.isEmpty()) {
|
if (!ids.isEmpty()) {
|
||||||
mtpRequestId req = MTP::send(MTPmessages_GetMessages(MTP_vector<MTPint>(ids)), rpcDone(&ApiWrap::gotReplyTo, (ChannelData*)0), RPCFailHandlerPtr(), 0, 5);
|
mtpRequestId req = MTP::send(MTPmessages_GetMessages(MTP_vector<MTPint>(ids)), rpcDone(&ApiWrap::gotDependencyItem, (ChannelData*)0), RPCFailHandlerPtr(), 0, 5);
|
||||||
for (ReplyToRequests::iterator i = _replyToRequests.begin(); i != _replyToRequests.cend(); ++i) {
|
for (DependencyRequests::iterator i = _dependencyRequests.begin(); i != _dependencyRequests.cend(); ++i) {
|
||||||
if (i.value().req > 0) continue;
|
if (i.value().req > 0) continue;
|
||||||
i.value().req = req;
|
i.value().req = req;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ChannelReplyToRequests::iterator j = _channelReplyToRequests.begin(); j != _channelReplyToRequests.cend();) {
|
for (ChannelDependencyRequests::iterator j = _channelDependencyRequests.begin(); j != _channelDependencyRequests.cend();) {
|
||||||
if (j->isEmpty()) {
|
if (j->isEmpty()) {
|
||||||
j = _channelReplyToRequests.erase(j);
|
j = _channelDependencyRequests.erase(j);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
MessageIds ids = collectMessageIds(j.value());
|
MessageIds ids = collectMessageIds(j.value());
|
||||||
if (!ids.isEmpty()) {
|
if (!ids.isEmpty()) {
|
||||||
mtpRequestId req = MTP::send(MTPchannels_GetMessages(j.key()->inputChannel, MTP_vector<MTPint>(ids)), rpcDone(&ApiWrap::gotReplyTo, j.key()), RPCFailHandlerPtr(), 0, 5);
|
mtpRequestId req = MTP::send(MTPchannels_GetMessages(j.key()->inputChannel, MTP_vector<MTPint>(ids)), rpcDone(&ApiWrap::gotDependencyItem, j.key()), RPCFailHandlerPtr(), 0, 5);
|
||||||
for (ReplyToRequests::iterator i = j->begin(); i != j->cend(); ++i) {
|
for (DependencyRequests::iterator i = j->begin(); i != j->cend(); ++i) {
|
||||||
if (i.value().req > 0) continue;
|
if (i.value().req > 0) continue;
|
||||||
i.value().req = req;
|
i.value().req = req;
|
||||||
}
|
}
|
||||||
|
@ -120,7 +120,7 @@ void ApiWrap::resolveReplyTo() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiWrap::gotReplyTo(ChannelData *channel, const MTPmessages_Messages &msgs, mtpRequestId req) {
|
void ApiWrap::gotDependencyItem(ChannelData *channel, const MTPmessages_Messages &msgs, mtpRequestId req) {
|
||||||
switch (msgs.type()) {
|
switch (msgs.type()) {
|
||||||
case mtpc_messages_messages: {
|
case mtpc_messages_messages: {
|
||||||
const MTPDmessages_messages &d(msgs.c_messages_messages());
|
const MTPDmessages_messages &d(msgs.c_messages_messages());
|
||||||
|
@ -141,10 +141,10 @@ void ApiWrap::gotReplyTo(ChannelData *channel, const MTPmessages_Messages &msgs,
|
||||||
if (channel) {
|
if (channel) {
|
||||||
channel->ptsReceived(d.vpts.v);
|
channel->ptsReceived(d.vpts.v);
|
||||||
} else {
|
} else {
|
||||||
LOG(("App Error: received messages.channelMessages when no channel was passed! (ApiWrap::gotReplyTo)"));
|
LOG(("App Error: received messages.channelMessages when no channel was passed! (ApiWrap::gotDependencyItem)"));
|
||||||
}
|
}
|
||||||
if (d.has_collapsed()) { // should not be returned
|
if (d.has_collapsed()) { // should not be returned
|
||||||
LOG(("API Error: channels.getMessages and messages.getMessages should not return collapsed groups! (ApiWrap::gotReplyTo)"));
|
LOG(("API Error: channels.getMessages and messages.getMessages should not return collapsed groups! (ApiWrap::gotDependencyItem)"));
|
||||||
}
|
}
|
||||||
|
|
||||||
App::feedUsers(d.vusers);
|
App::feedUsers(d.vusers);
|
||||||
|
@ -152,15 +152,15 @@ void ApiWrap::gotReplyTo(ChannelData *channel, const MTPmessages_Messages &msgs,
|
||||||
App::feedMsgs(d.vmessages, NewMessageExisting);
|
App::feedMsgs(d.vmessages, NewMessageExisting);
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
ReplyToRequests *requests(replyToRequests(channel, true));
|
DependencyRequests *requests(dependencyRequests(channel, true));
|
||||||
if (requests) {
|
if (requests) {
|
||||||
for (ReplyToRequests::iterator i = requests->begin(); i != requests->cend();) {
|
for (DependencyRequests::iterator i = requests->begin(); i != requests->cend();) {
|
||||||
if (i.value().req == req) {
|
if (i.value().req == req) {
|
||||||
for (QList<HistoryReply*>::const_iterator j = i.value().replies.cbegin(), e = i.value().replies.cend(); j != e; ++j) {
|
for (QList<HistoryItem*>::const_iterator j = i.value().dependentItems.cbegin(), e = i.value().dependentItems.cend(); j != e; ++j) {
|
||||||
if (*j) {
|
if (*j) {
|
||||||
(*j)->updateReplyTo(true);
|
(*j)->updateDependencyItem();
|
||||||
} else {
|
} else if (App::main()) {
|
||||||
App::main()->updateReplyTo();
|
App::main()->updateDependencyItem();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i = requests->erase(i);
|
i = requests->erase(i);
|
||||||
|
@ -169,7 +169,7 @@ void ApiWrap::gotReplyTo(ChannelData *channel, const MTPmessages_Messages &msgs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (channel && requests->isEmpty()) {
|
if (channel && requests->isEmpty()) {
|
||||||
_channelReplyToRequests.remove(channel);
|
_channelDependencyRequests.remove(channel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,8 @@ public:
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
void itemRemoved(HistoryItem *item);
|
void itemRemoved(HistoryItem *item);
|
||||||
|
|
||||||
void requestReplyTo(HistoryReply *reply, ChannelData *channel, MsgId id);
|
void requestDependencyItem(HistoryItem *dependent, ChannelData *channel, MsgId id);
|
||||||
|
|
||||||
void requestFullPeer(PeerData *peer);
|
void requestFullPeer(PeerData *peer);
|
||||||
void requestPeer(PeerData *peer);
|
void requestPeer(PeerData *peer);
|
||||||
|
@ -59,35 +59,35 @@ signals:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void resolveReplyTo();
|
void resolveDependencyItems();
|
||||||
void resolveWebPages();
|
void resolveWebPages();
|
||||||
|
|
||||||
void delayedRequestParticipantsCount();
|
void delayedRequestParticipantsCount();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void gotReplyTo(ChannelData *channel, const MTPmessages_Messages &result, mtpRequestId req);
|
void gotDependencyItem(ChannelData *channel, const MTPmessages_Messages &result, mtpRequestId req);
|
||||||
struct ReplyToRequest {
|
struct DependencyRequest {
|
||||||
ReplyToRequest() : req(0) {
|
DependencyRequest() : req(0) {
|
||||||
}
|
}
|
||||||
mtpRequestId req;
|
mtpRequestId req;
|
||||||
QList<HistoryReply*> replies;
|
QList<HistoryItem*> dependentItems;
|
||||||
};
|
};
|
||||||
typedef QMap<MsgId, ReplyToRequest> ReplyToRequests;
|
typedef QMap<MsgId, DependencyRequest> DependencyRequests;
|
||||||
ReplyToRequests _replyToRequests;
|
DependencyRequests _dependencyRequests;
|
||||||
typedef QMap<ChannelData*, ReplyToRequests> ChannelReplyToRequests;
|
typedef QMap<ChannelData*, DependencyRequests> ChannelDependencyRequests;
|
||||||
ChannelReplyToRequests _channelReplyToRequests;
|
ChannelDependencyRequests _channelDependencyRequests;
|
||||||
SingleTimer _replyToTimer;
|
SingleTimer _dependencyTimer;
|
||||||
typedef QVector<MTPint> MessageIds;
|
typedef QVector<MTPint> MessageIds;
|
||||||
MessageIds collectMessageIds(const ReplyToRequests &requests);
|
MessageIds collectMessageIds(const DependencyRequests &requests);
|
||||||
ReplyToRequests *replyToRequests(ChannelData *channel, bool onlyExisting = false);
|
DependencyRequests *dependencyRequests(ChannelData *channel, bool onlyExisting = false);
|
||||||
|
|
||||||
void gotChatFull(PeerData *peer, const MTPmessages_ChatFull &result, mtpRequestId req);
|
void gotChatFull(PeerData *peer, const MTPmessages_ChatFull &result, mtpRequestId req);
|
||||||
void gotUserFull(PeerData *peer, const MTPUserFull &result, mtpRequestId req);
|
void gotUserFull(PeerData *peer, const MTPUserFull &result, mtpRequestId req);
|
||||||
bool gotPeerFullFailed(PeerData *peer, const RPCError &err);
|
bool gotPeerFullFailed(PeerData *peer, const RPCError &err);
|
||||||
typedef QMap<PeerData*, mtpRequestId> PeerRequests;
|
typedef QMap<PeerData*, mtpRequestId> PeerRequests;
|
||||||
PeerRequests _fullPeerRequests;
|
PeerRequests _fullPeerRequests;
|
||||||
|
|
||||||
void gotChat(PeerData *peer, const MTPmessages_Chats &result);
|
void gotChat(PeerData *peer, const MTPmessages_Chats &result);
|
||||||
void gotUser(PeerData *peer, const MTPVector<MTPUser> &result);
|
void gotUser(PeerData *peer, const MTPVector<MTPUser> &result);
|
||||||
void gotChats(const MTPmessages_Chats &result);
|
void gotChats(const MTPmessages_Chats &result);
|
||||||
|
|
|
@ -67,8 +67,8 @@ namespace {
|
||||||
SharedContactItems sharedContactItems;
|
SharedContactItems sharedContactItems;
|
||||||
GifItems gifItems;
|
GifItems gifItems;
|
||||||
|
|
||||||
typedef QMap<HistoryItem*, QMap<HistoryReply*, bool> > RepliesTo;
|
typedef QMap<HistoryItem*, OrderedSet<HistoryItem*> > DependentItems;
|
||||||
RepliesTo repliesTo;
|
DependentItems dependentItems;
|
||||||
|
|
||||||
Histories histories;
|
Histories histories;
|
||||||
|
|
||||||
|
@ -1784,12 +1784,12 @@ namespace App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
historyItemDetached(item);
|
historyItemDetached(item);
|
||||||
RepliesTo::iterator j = ::repliesTo.find(item);
|
DependentItems::iterator j = ::dependentItems.find(item);
|
||||||
if (j != ::repliesTo.cend()) {
|
if (j != ::dependentItems.cend()) {
|
||||||
for (QMap<HistoryReply*, bool>::const_iterator k = j.value().cbegin(), e = j.value().cend(); k != e; ++k) {
|
for (OrderedSet<HistoryItem*>::const_iterator k = j.value().cbegin(), e = j.value().cend(); k != e; ++k) {
|
||||||
k.key()->replyToReplaced(item, 0);
|
k.key()->dependencyItemRemoved(item);
|
||||||
}
|
}
|
||||||
::repliesTo.erase(j);
|
::dependentItems.erase(j);
|
||||||
}
|
}
|
||||||
if (App::main() && !App::quitting()) {
|
if (App::main() && !App::quitting()) {
|
||||||
App::main()->itemRemoved(item);
|
App::main()->itemRemoved(item);
|
||||||
|
@ -1797,7 +1797,7 @@ namespace App {
|
||||||
}
|
}
|
||||||
|
|
||||||
void historyClearMsgs() {
|
void historyClearMsgs() {
|
||||||
::repliesTo.clear();
|
::dependentItems.clear();
|
||||||
|
|
||||||
QVector<HistoryItem*> toDelete;
|
QVector<HistoryItem*> toDelete;
|
||||||
for (MsgsData::const_iterator i = msgsData.cbegin(), e = msgsData.cend(); i != e; ++i) {
|
for (MsgsData::const_iterator i = msgsData.cbegin(), e = msgsData.cend(); i != e; ++i) {
|
||||||
|
@ -1869,16 +1869,16 @@ namespace App {
|
||||||
if (App::wnd()) App::wnd()->updateGlobalMenu();
|
if (App::wnd()) App::wnd()->updateGlobalMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
void historyRegReply(HistoryReply *reply, HistoryItem *to) {
|
void historyRegDependency(HistoryItem *dependent, HistoryItem *dependency) {
|
||||||
::repliesTo[to].insert(reply, true);
|
::dependentItems[dependency].insert(dependent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void historyUnregReply(HistoryReply *reply, HistoryItem *to) {
|
void historyUnregDependency(HistoryItem *dependent, HistoryItem *dependency) {
|
||||||
RepliesTo::iterator i = ::repliesTo.find(to);
|
DependentItems::iterator i = ::dependentItems.find(dependency);
|
||||||
if (i != ::repliesTo.cend()) {
|
if (i != ::dependentItems.cend()) {
|
||||||
i.value().remove(reply);
|
i.value().remove(dependent);
|
||||||
if (i.value().isEmpty()) {
|
if (i.value().isEmpty()) {
|
||||||
::repliesTo.erase(i);
|
::dependentItems.erase(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,8 +152,8 @@ namespace App {
|
||||||
void historyUnregItem(HistoryItem *item);
|
void historyUnregItem(HistoryItem *item);
|
||||||
void historyClearMsgs();
|
void historyClearMsgs();
|
||||||
void historyClearItems();
|
void historyClearItems();
|
||||||
void historyRegReply(HistoryReply *reply, HistoryItem *to);
|
void historyRegDependency(HistoryItem *dependent, HistoryItem *dependency);
|
||||||
void historyUnregReply(HistoryReply *reply, HistoryItem *to);
|
void historyUnregDependency(HistoryItem *dependent, HistoryItem *dependency);
|
||||||
|
|
||||||
void historyRegRandom(uint64 randomId, const FullMsgId &itemId);
|
void historyRegRandom(uint64 randomId, const FullMsgId &itemId);
|
||||||
void historyUnregRandom(uint64 randomId);
|
void historyUnregRandom(uint64 randomId);
|
||||||
|
|
|
@ -171,6 +171,8 @@ enum {
|
||||||
|
|
||||||
ChoosePeerByDragTimeout = 1000, // 1 second mouse not moved to choose dialog when dragging a file
|
ChoosePeerByDragTimeout = 1000, // 1 second mouse not moved to choose dialog when dragging a file
|
||||||
ReloadChannelMembersTimeout = 1000, // 1 second wait before reload members in channel after adding
|
ReloadChannelMembersTimeout = 1000, // 1 second wait before reload members in channel after adding
|
||||||
|
|
||||||
|
PinnedMessageTextLimit = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool isNotificationsUser(uint64 id) {
|
inline bool isNotificationsUser(uint64 id) {
|
||||||
|
|
|
@ -1509,6 +1509,13 @@ HistoryItem *History::createItem(HistoryBlock *block, const MTPMessage &msg, boo
|
||||||
//const MTPDmessageActionChannelMigrateFrom &d(action.c_messageActionChannelMigrateFrom());
|
//const MTPDmessageActionChannelMigrateFrom &d(action.c_messageActionChannelMigrateFrom());
|
||||||
//PeerData *chat = App::peerLoaded(peerFromChat(d.vchat_id));
|
//PeerData *chat = App::peerLoaded(peerFromChat(d.vchat_id));
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case mtpc_messageActionPinMessage: {
|
||||||
|
if (d.has_reply_to_msg_id() && result && result->history()->peer->isMegagroup()) {
|
||||||
|
result->history()->peer->asChannel()->mgInfo->pinnedMsgId = d.vreply_to_msg_id.v;
|
||||||
|
if (App::main()) emit App::main()->peerUpdated(result->history()->peer);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
@ -1540,7 +1547,7 @@ HistoryItem *History::createItemDocument(HistoryBlock *block, MsgId id, int32 fl
|
||||||
HistoryItem *History::createItemPhoto(HistoryBlock *block, MsgId id, int32 flags, int32 viaBotId, MsgId replyTo, QDateTime date, int32 from, PhotoData *photo, const QString &caption) {
|
HistoryItem *History::createItemPhoto(HistoryBlock *block, MsgId id, int32 flags, int32 viaBotId, MsgId replyTo, QDateTime date, int32 from, PhotoData *photo, const QString &caption) {
|
||||||
HistoryItem *result = 0;
|
HistoryItem *result = 0;
|
||||||
|
|
||||||
if (flags & MTPDmessage::flag_reply_to_msg_id && replyTo > 0) {
|
if ((flags & MTPDmessage::flag_reply_to_msg_id) && replyTo > 0) {
|
||||||
result = new HistoryReply(this, block, id, flags, viaBotId, replyTo, date, from, photo, caption);
|
result = new HistoryReply(this, block, id, flags, viaBotId, replyTo, date, from, photo, caption);
|
||||||
} else {
|
} else {
|
||||||
result = new HistoryMessage(this, block, id, flags, viaBotId, date, from, photo, caption);
|
result = new HistoryMessage(this, block, id, flags, viaBotId, date, from, photo, caption);
|
||||||
|
@ -6891,7 +6898,7 @@ void HistoryMessage::getState(TextLinkPtr &lnk, HistoryCursorState &state, int32
|
||||||
bool inText = false;
|
bool inText = false;
|
||||||
bool breakEverywhere = (fwd->_text.countHeight(trect.width()) > 2 * st::semiboldFont->height);
|
bool breakEverywhere = (fwd->_text.countHeight(trect.width()) > 2 * st::semiboldFont->height);
|
||||||
textstyleSet(&st::inFwdTextStyle);
|
textstyleSet(&st::inFwdTextStyle);
|
||||||
fwd->_text.getState(lnk, inText, x - trect.left(), y - trect.top(), trect.right() - trect.left(), style::al_left, breakEverywhere);
|
fwd->_text.getState(lnk, inText, x - trect.left(), y - trect.top(), trect.width(), style::al_left, breakEverywhere);
|
||||||
textstyleRestore();
|
textstyleRestore();
|
||||||
if (breakEverywhere) {
|
if (breakEverywhere) {
|
||||||
state = HistoryInForwardedCursorState;
|
state = HistoryInForwardedCursorState;
|
||||||
|
@ -7035,7 +7042,7 @@ HistoryReply::HistoryReply(History *history, HistoryBlock *block, const MTPDmess
|
||||||
, _maxReplyWidth(0)
|
, _maxReplyWidth(0)
|
||||||
, _replyToVia(0) {
|
, _replyToVia(0) {
|
||||||
if (!updateReplyTo() && App::api()) {
|
if (!updateReplyTo() && App::api()) {
|
||||||
App::api()->requestReplyTo(this, history->peer->asChannel(), replyToMsgId);
|
App::api()->requestDependencyItem(this, history->peer->asChannel(), replyToMsgId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7047,7 +7054,7 @@ HistoryReply::HistoryReply(History *history, HistoryBlock *block, MsgId msgId, i
|
||||||
, _maxReplyWidth(0)
|
, _maxReplyWidth(0)
|
||||||
, _replyToVia(0) {
|
, _replyToVia(0) {
|
||||||
if (!updateReplyTo() && App::api()) {
|
if (!updateReplyTo() && App::api()) {
|
||||||
App::api()->requestReplyTo(this, history->peer->asChannel(), replyToMsgId);
|
App::api()->requestDependencyItem(this, history->peer->asChannel(), replyToMsgId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7059,7 +7066,7 @@ HistoryReply::HistoryReply(History *history, HistoryBlock *block, MsgId msgId, i
|
||||||
, _maxReplyWidth(0)
|
, _maxReplyWidth(0)
|
||||||
, _replyToVia(0) {
|
, _replyToVia(0) {
|
||||||
if (!updateReplyTo() && App::api()) {
|
if (!updateReplyTo() && App::api()) {
|
||||||
App::api()->requestReplyTo(this, history->peer->asChannel(), replyToMsgId);
|
App::api()->requestDependencyItem(this, history->peer->asChannel(), replyToMsgId);
|
||||||
}
|
}
|
||||||
replyToNameUpdated();
|
replyToNameUpdated();
|
||||||
}
|
}
|
||||||
|
@ -7089,7 +7096,7 @@ bool HistoryReply::updateReplyTo(bool force) {
|
||||||
replyToMsg = App::histItemById(channelId(), replyToMsgId);
|
replyToMsg = App::histItemById(channelId(), replyToMsgId);
|
||||||
|
|
||||||
if (replyToMsg) {
|
if (replyToMsg) {
|
||||||
App::historyRegReply(this, replyToMsg);
|
App::historyRegDependency(this, replyToMsg);
|
||||||
replyToText.setText(st::msgFont, replyToMsg->inReplyText(), _textDlgOptions);
|
replyToText.setText(st::msgFont, replyToMsg->inReplyText(), _textDlgOptions);
|
||||||
|
|
||||||
replyToNameUpdated();
|
replyToNameUpdated();
|
||||||
|
@ -7146,20 +7153,14 @@ HistoryItem *HistoryReply::replyToMessage() const {
|
||||||
return replyToMsg;
|
return replyToMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryReply::replyToReplaced(HistoryItem *oldItem, HistoryItem *newItem) {
|
void HistoryReply::dependencyItemRemoved(HistoryItem *dependency) {
|
||||||
if (replyToMsg == oldItem) {
|
if (replyToMsg == dependency) {
|
||||||
delete _replyToVia;
|
delete _replyToVia;
|
||||||
_replyToVia = 0;
|
_replyToVia = 0;
|
||||||
replyToMsg = newItem;
|
|
||||||
if (!newItem) {
|
replyToMsg = nullptr;
|
||||||
replyToMsgId = 0;
|
replyToMsgId = 0;
|
||||||
initDimensions();
|
initDimensions();
|
||||||
} else if (!replyToMsg->Is<HistoryMessageForwarded>()) {
|
|
||||||
if (UserData *bot = replyToMsg->viaBot()) {
|
|
||||||
_replyToVia = new HistoryMessageVia(0);
|
|
||||||
_replyToVia->create(peerToUser(bot->id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7301,7 +7302,7 @@ void HistoryReply::getState(TextLinkPtr &lnk, HistoryCursorState &state, int32 x
|
||||||
|
|
||||||
int32 h = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom();
|
int32 h = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom();
|
||||||
if (y >= trect.top() && y < trect.top() + h) {
|
if (y >= trect.top() && y < trect.top() + h) {
|
||||||
if (replyToMsg && y >= trect.top() + st::msgReplyPadding.top() && y < trect.top() + st::msgReplyPadding.top() + st::msgReplyBarSize.height() && x >= trect.left() && x < trect.right()) {
|
if (replyToMsg && y >= trect.top() + st::msgReplyPadding.top() && y < trect.top() + st::msgReplyPadding.top() + st::msgReplyBarSize.height() && x >= trect.left() && x < trect.left() + trect.width()) {
|
||||||
lnk = replyToLnk;
|
lnk = replyToLnk;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -7347,13 +7348,18 @@ void HistoryReply::getSymbol(uint16 &symbol, bool &after, bool &upon, int32 x, i
|
||||||
|
|
||||||
HistoryReply::~HistoryReply() {
|
HistoryReply::~HistoryReply() {
|
||||||
if (replyToMsg) {
|
if (replyToMsg) {
|
||||||
App::historyUnregReply(this, replyToMsg);
|
App::historyUnregDependency(this, replyToMsg);
|
||||||
} else if (replyToMsgId && App::api()) {
|
} else if (replyToMsgId && App::api()) {
|
||||||
App::api()->itemRemoved(this);
|
App::api()->itemRemoved(this);
|
||||||
}
|
}
|
||||||
deleteAndMark(_replyToVia);
|
deleteAndMark(_replyToVia);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HistoryServicePinned::HistoryServicePinned(Interfaces *)
|
||||||
|
: msgId(0)
|
||||||
|
, msg(0) {
|
||||||
|
}
|
||||||
|
|
||||||
void HistoryServiceMsg::setMessageByAction(const MTPmessageAction &action) {
|
void HistoryServiceMsg::setMessageByAction(const MTPmessageAction &action) {
|
||||||
QList<TextLinkPtr> links;
|
QList<TextLinkPtr> links;
|
||||||
LangString text = lang(lng_message_empty);
|
LangString text = lang(lng_message_empty);
|
||||||
|
@ -7486,6 +7492,15 @@ void HistoryServiceMsg::setMessageByAction(const MTPmessageAction &action) {
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case mtpc_messageActionPinMessage: {
|
||||||
|
if (updatePinnedText(&from, &text)) {
|
||||||
|
HistoryServicePinned *pinned = Get<HistoryServicePinned>();
|
||||||
|
t_assert(pinned != nullptr);
|
||||||
|
|
||||||
|
links.push_back(pinned->lnk);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
default: from = QString(); break;
|
default: from = QString(); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7500,19 +7515,106 @@ void HistoryServiceMsg::setMessageByAction(const MTPmessageAction &action) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HistoryServiceMsg::updatePinned(bool force) {
|
||||||
|
HistoryServicePinned *pinned = Get<HistoryServicePinned>();
|
||||||
|
t_assert(pinned != nullptr);
|
||||||
|
|
||||||
|
if (!pinned->msgId || pinned->msg) return true;
|
||||||
|
|
||||||
|
if (!pinned->lnk) {
|
||||||
|
pinned->lnk = TextLinkPtr(new MessageLink(history()->peer->id, pinned->msgId));
|
||||||
|
}
|
||||||
|
pinned->msg = App::histItemById(channelId(), pinned->msgId);
|
||||||
|
if (pinned->msg) {
|
||||||
|
App::historyRegDependency(this, pinned->msg);
|
||||||
|
updatePinnedText();
|
||||||
|
} else if (force) {
|
||||||
|
pinned->msgId = 0;
|
||||||
|
updatePinnedText();
|
||||||
|
}
|
||||||
|
if (force) {
|
||||||
|
initDimensions();
|
||||||
|
Notify::historyItemResized(this);
|
||||||
|
}
|
||||||
|
return (pinned->msg || !pinned->msgId);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HistoryServiceMsg::updatePinnedText(const QString *pfrom, QString *ptext) {
|
||||||
|
bool result = false;
|
||||||
|
QString from, text;
|
||||||
|
if (pfrom) {
|
||||||
|
from = *pfrom;
|
||||||
|
} else {
|
||||||
|
from = textcmdLink(1, _from->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
HistoryServicePinned *pinned = Get<HistoryServicePinned>();
|
||||||
|
if (pinned && pinned->msg) {
|
||||||
|
HistoryMedia *media = pinned->msg->getMedia();
|
||||||
|
QString mediaText;
|
||||||
|
switch (media ? media->type() : MediaTypeCount) {
|
||||||
|
case MediaTypePhoto: mediaText = lang(lng_action_pinned_media_photo); break;
|
||||||
|
case MediaTypeVideo: mediaText = lang(lng_action_pinned_media_video); break;
|
||||||
|
case MediaTypeContact: mediaText = lang(lng_action_pinned_media_contact); break;
|
||||||
|
case MediaTypeFile: mediaText = lang(lng_action_pinned_media_file); break;
|
||||||
|
case MediaTypeGif: mediaText = lang(lng_action_pinned_media_gif); break;
|
||||||
|
case MediaTypeSticker: mediaText = lang(lng_action_pinned_media_sticker); break;
|
||||||
|
case MediaTypeLocation: mediaText = lang(lng_action_pinned_media_location); break;
|
||||||
|
case MediaTypeMusicFile: mediaText = lang(lng_action_pinned_media_music); break;
|
||||||
|
case MediaTypeVoiceFile: mediaText = lang(lng_action_pinned_media_voice); break;
|
||||||
|
}
|
||||||
|
if (mediaText.isEmpty()) {
|
||||||
|
QString original = pinned->msg->originalText();
|
||||||
|
int32 cutat = 0, limit = PinnedMessageTextLimit, size = original.size();
|
||||||
|
for (; limit > 0;) {
|
||||||
|
--limit;
|
||||||
|
if (cutat >= size) break;
|
||||||
|
if (original.at(cutat).isLowSurrogate() && cutat + 1 < size && original.at(cutat + 1).isHighSurrogate()) {
|
||||||
|
cutat += 2;
|
||||||
|
} else {
|
||||||
|
++cutat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!limit && cutat + 5 < size) {
|
||||||
|
original = original.mid(0, cutat) + qstr("..");
|
||||||
|
}
|
||||||
|
text = lng_action_pinned_message(lt_from, from, lt_text, textcmdLink(2, original));
|
||||||
|
} else {
|
||||||
|
text = lng_action_pinned_media(lt_from, from, lt_media, textcmdLink(2, mediaText));
|
||||||
|
}
|
||||||
|
result = true;
|
||||||
|
} else if (pinned && pinned->msgId) {
|
||||||
|
text = lng_action_pinned_media(lt_from, from, lt_media, textcmdLink(2, lang(lng_contacts_loading)));
|
||||||
|
result = true;
|
||||||
|
} else {
|
||||||
|
text = lng_action_pinned_media(lt_from, from, lt_media, lang(lng_deleted_message));
|
||||||
|
}
|
||||||
|
if (ptext) {
|
||||||
|
*ptext = text;
|
||||||
|
} else {
|
||||||
|
setServiceText(text);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
HistoryServiceMsg::HistoryServiceMsg(History *history, HistoryBlock *block, const MTPDmessageService &msg) :
|
HistoryServiceMsg::HistoryServiceMsg(History *history, HistoryBlock *block, const MTPDmessageService &msg) :
|
||||||
HistoryItem(history, block, msg.vid.v, msg.vflags.v, ::date(msg.vdate), msg.has_from_id() ? msg.vfrom_id.v : 0)
|
HistoryItem(history, block, msg.vid.v, msg.vflags.v, ::date(msg.vdate), msg.has_from_id() ? msg.vfrom_id.v : 0)
|
||||||
, _text(st::msgMinWidth)
|
, _text(st::msgMinWidth)
|
||||||
, _media(0)
|
, _media(0) {
|
||||||
{
|
if (msg.has_reply_to_msg_id()) {
|
||||||
|
UpdateInterfaces(HistoryServicePinned::Bit());
|
||||||
|
Get<HistoryServicePinned>()->msgId = msg.vreply_to_msg_id.v;
|
||||||
|
if (!updatePinned() && App::api()) {
|
||||||
|
App::api()->requestDependencyItem(this, history->peer->asChannel(), Get<HistoryServicePinned>()->msgId);
|
||||||
|
}
|
||||||
|
}
|
||||||
setMessageByAction(msg.vaction);
|
setMessageByAction(msg.vaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
HistoryServiceMsg::HistoryServiceMsg(History *history, HistoryBlock *block, MsgId msgId, QDateTime date, const QString &msg, int32 flags, HistoryMedia *media, int32 from) :
|
HistoryServiceMsg::HistoryServiceMsg(History *history, HistoryBlock *block, MsgId msgId, QDateTime date, const QString &msg, int32 flags, HistoryMedia *media, int32 from) :
|
||||||
HistoryItem(history, block, msgId, flags, date, from)
|
HistoryItem(history, block, msgId, flags, date, from)
|
||||||
, _text(st::msgServiceFont, msg, _historySrvOptions, st::dlgMinWidth)
|
, _text(st::msgServiceFont, msg, _historySrvOptions, st::dlgMinWidth)
|
||||||
, _media(media)
|
, _media(media) {
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryServiceMsg::initDimensions() {
|
void HistoryServiceMsg::initDimensions() {
|
||||||
|
|
|
@ -115,7 +115,6 @@ struct FakeDialogRow {
|
||||||
enum HistoryMediaType {
|
enum HistoryMediaType {
|
||||||
MediaTypePhoto,
|
MediaTypePhoto,
|
||||||
MediaTypeVideo,
|
MediaTypeVideo,
|
||||||
MediaTypeGeo,
|
|
||||||
MediaTypeContact,
|
MediaTypeContact,
|
||||||
MediaTypeFile,
|
MediaTypeFile,
|
||||||
MediaTypeGif,
|
MediaTypeGif,
|
||||||
|
@ -919,6 +918,15 @@ public:
|
||||||
virtual int32 resize(int32 width) = 0; // return new height
|
virtual int32 resize(int32 width) = 0; // return new height
|
||||||
virtual void draw(Painter &p, const QRect &r, uint32 selection, uint64 ms) const = 0;
|
virtual void draw(Painter &p, const QRect &r, uint32 selection, uint64 ms) const = 0;
|
||||||
|
|
||||||
|
virtual void dependencyItemRemoved(HistoryItem *dependency) {
|
||||||
|
}
|
||||||
|
virtual bool updateDependencyItem() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
virtual MsgId dependencyMsgId() const {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
virtual UserData *viaBot() const {
|
virtual UserData *viaBot() const {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2229,15 +2237,19 @@ public:
|
||||||
|
|
||||||
void initDimensions();
|
void initDimensions();
|
||||||
|
|
||||||
bool updateReplyTo(bool force = false);
|
bool updateDependencyItem() override {
|
||||||
void replyToNameUpdated() const;
|
return updateReplyTo(true);
|
||||||
|
}
|
||||||
|
MsgId dependencyMsgId() const override {
|
||||||
|
return replyToId();
|
||||||
|
}
|
||||||
int32 replyToWidth() const;
|
int32 replyToWidth() const;
|
||||||
|
|
||||||
TextLinkPtr replyToLink() const;
|
TextLinkPtr replyToLink() const;
|
||||||
|
|
||||||
MsgId replyToId() const;
|
MsgId replyToId() const;
|
||||||
HistoryItem *replyToMessage() const;
|
HistoryItem *replyToMessage() const;
|
||||||
void replyToReplaced(HistoryItem *oldItem, HistoryItem *newItem);
|
void dependencyItemRemoved(HistoryItem *dependency) override;
|
||||||
|
|
||||||
void draw(Painter &p, const QRect &r, uint32 selection, uint64 ms) const;
|
void draw(Painter &p, const QRect &r, uint32 selection, uint64 ms) const;
|
||||||
void drawReplyTo(Painter &p, int32 x, int32 y, int32 w, bool selected, bool likeService = false) const;
|
void drawReplyTo(Painter &p, int32 x, int32 y, int32 w, bool selected, bool likeService = false) const;
|
||||||
|
@ -2265,6 +2277,9 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
bool updateReplyTo(bool force = false);
|
||||||
|
void replyToNameUpdated() const;
|
||||||
|
|
||||||
MsgId replyToMsgId;
|
MsgId replyToMsgId;
|
||||||
HistoryItem *replyToMsg;
|
HistoryItem *replyToMsg;
|
||||||
TextLinkPtr replyToLnk;
|
TextLinkPtr replyToLnk;
|
||||||
|
@ -2296,6 +2311,14 @@ inline int32 newForwardedFlags(PeerData *p, int32 from, HistoryMessage *fwd) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct HistoryServicePinned : public BasicInterface<HistoryServicePinned> {
|
||||||
|
HistoryServicePinned(Interfaces *);
|
||||||
|
|
||||||
|
MsgId msgId;
|
||||||
|
HistoryItem *msg;
|
||||||
|
TextLinkPtr lnk;
|
||||||
|
};
|
||||||
|
|
||||||
class HistoryServiceMsg : public HistoryItem {
|
class HistoryServiceMsg : public HistoryItem {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -2304,6 +2327,16 @@ public:
|
||||||
|
|
||||||
void initDimensions();
|
void initDimensions();
|
||||||
|
|
||||||
|
bool updateDependencyItem() override {
|
||||||
|
return updatePinned(true);
|
||||||
|
}
|
||||||
|
MsgId dependencyMsgId() const override {
|
||||||
|
if (const HistoryServicePinned *pinned = Get<HistoryServicePinned>()) {
|
||||||
|
return pinned->msgId;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void countPositionAndSize(int32 &left, int32 &width) const;
|
void countPositionAndSize(int32 &left, int32 &width) const;
|
||||||
|
|
||||||
void draw(Painter &p, const QRect &r, uint32 selection, uint64 ms) const;
|
void draw(Painter &p, const QRect &r, uint32 selection, uint64 ms) const;
|
||||||
|
@ -2344,6 +2377,8 @@ public:
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void setMessageByAction(const MTPmessageAction &action);
|
void setMessageByAction(const MTPmessageAction &action);
|
||||||
|
bool updatePinned(bool force = false);
|
||||||
|
bool updatePinnedText(const QString *pfrom = nullptr, QString *ptext = nullptr);
|
||||||
|
|
||||||
Text _text;
|
Text _text;
|
||||||
HistoryMedia *_media;
|
HistoryMedia *_media;
|
||||||
|
|
|
@ -3500,7 +3500,7 @@ void HistoryWidget::applyDraft(bool parseLinks) {
|
||||||
if (_editMsgId || _replyToId) {
|
if (_editMsgId || _replyToId) {
|
||||||
updateReplyEditTexts();
|
updateReplyEditTexts();
|
||||||
if (!_replyEditMsg && App::api()) {
|
if (!_replyEditMsg && App::api()) {
|
||||||
App::api()->requestReplyTo(0, _peer->asChannel(), _editMsgId ? _editMsgId : _replyToId);
|
App::api()->requestDependencyItem(0, _peer->asChannel(), _editMsgId ? _editMsgId : _replyToId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2056,7 +2056,7 @@ ApiWrap *MainWidget::api() {
|
||||||
return _api;
|
return _api;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWidget::updateReplyTo() {
|
void MainWidget::updateDependencyItem() {
|
||||||
history.updateReplyEditTexts(true);
|
history.updateReplyEditTexts(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -373,7 +373,7 @@ public:
|
||||||
ImagePtr newBackgroundThumb();
|
ImagePtr newBackgroundThumb();
|
||||||
|
|
||||||
ApiWrap *api();
|
ApiWrap *api();
|
||||||
void updateReplyTo();
|
void updateDependencyItem();
|
||||||
void updateBotKeyboard(History *h);
|
void updateBotKeyboard(History *h);
|
||||||
|
|
||||||
void pushReplyReturn(HistoryItem *item);
|
void pushReplyReturn(HistoryItem *item);
|
||||||
|
|
|
@ -1385,8 +1385,9 @@ void _serialize_messageService(MTPStringLogger &to, int32 stage, int32 lev, Type
|
||||||
case 7: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
case 7: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||||
case 8: to.add(" from_id: "); ++stages.back(); if (flag & MTPDmessageService::flag_from_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 8 IN FIELD flags ]"); } break;
|
case 8: to.add(" from_id: "); ++stages.back(); if (flag & MTPDmessageService::flag_from_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 8 IN FIELD flags ]"); } break;
|
||||||
case 9: to.add(" to_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
case 9: to.add(" to_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||||
case 10: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
case 10: to.add(" reply_to_msg_id: "); ++stages.back(); if (flag & MTPDmessageService::flag_reply_to_msg_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 3 IN FIELD flags ]"); } break;
|
||||||
case 11: to.add(" action: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
case 11: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||||
|
case 12: to.add(" action: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||||
default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break;
|
default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1613,6 +1614,10 @@ void _serialize_messageActionChannelMigrateFrom(MTPStringLogger &to, int32 stage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _serialize_messageActionPinMessage(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
||||||
|
to.add("{ messageActionPinMessage }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
void _serialize_dialog(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
void _serialize_dialog(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
||||||
if (stage) {
|
if (stage) {
|
||||||
to.add(",\n").addSpaces(lev);
|
to.add(",\n").addSpaces(lev);
|
||||||
|
@ -6958,8 +6963,10 @@ void _serialize_channels_updatePinnedMessage(MTPStringLogger &to, int32 stage, i
|
||||||
to.add("\n").addSpaces(lev);
|
to.add("\n").addSpaces(lev);
|
||||||
}
|
}
|
||||||
switch (stage) {
|
switch (stage) {
|
||||||
case 0: to.add(" channel: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
case 0: to.add(" flags: "); ++stages.back(); if (start >= end) throw Exception("start >= end in flags"); else flags.back() = *start; types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||||
case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
case 1: to.add(" silent: "); ++stages.back(); if (flag & MTPchannels_updatePinnedMessage::flag_silent) { to.add("YES [ BY BIT 0 IN FIELD flags ]"); } else { to.add("[ SKIPPED BY BIT 0 IN FIELD flags ]"); } break;
|
||||||
|
case 2: to.add(" channel: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||||
|
case 3: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||||
default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break;
|
default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7683,6 +7690,7 @@ namespace {
|
||||||
_serializers.insert(mtpc_messageActionChannelCreate, _serialize_messageActionChannelCreate);
|
_serializers.insert(mtpc_messageActionChannelCreate, _serialize_messageActionChannelCreate);
|
||||||
_serializers.insert(mtpc_messageActionChatMigrateTo, _serialize_messageActionChatMigrateTo);
|
_serializers.insert(mtpc_messageActionChatMigrateTo, _serialize_messageActionChatMigrateTo);
|
||||||
_serializers.insert(mtpc_messageActionChannelMigrateFrom, _serialize_messageActionChannelMigrateFrom);
|
_serializers.insert(mtpc_messageActionChannelMigrateFrom, _serialize_messageActionChannelMigrateFrom);
|
||||||
|
_serializers.insert(mtpc_messageActionPinMessage, _serialize_messageActionPinMessage);
|
||||||
_serializers.insert(mtpc_dialog, _serialize_dialog);
|
_serializers.insert(mtpc_dialog, _serialize_dialog);
|
||||||
_serializers.insert(mtpc_dialogChannel, _serialize_dialogChannel);
|
_serializers.insert(mtpc_dialogChannel, _serialize_dialogChannel);
|
||||||
_serializers.insert(mtpc_photoEmpty, _serialize_photoEmpty);
|
_serializers.insert(mtpc_photoEmpty, _serialize_photoEmpty);
|
||||||
|
|
|
@ -146,7 +146,7 @@ enum {
|
||||||
mtpc_chatPhoto = 0x6153276a,
|
mtpc_chatPhoto = 0x6153276a,
|
||||||
mtpc_messageEmpty = 0x83e5de54,
|
mtpc_messageEmpty = 0x83e5de54,
|
||||||
mtpc_message = 0xc09be45f,
|
mtpc_message = 0xc09be45f,
|
||||||
mtpc_messageService = 0xc06b9607,
|
mtpc_messageService = 0x9e19a1f6,
|
||||||
mtpc_messageMediaEmpty = 0x3ded6320,
|
mtpc_messageMediaEmpty = 0x3ded6320,
|
||||||
mtpc_messageMediaPhoto = 0x3d8ce53d,
|
mtpc_messageMediaPhoto = 0x3d8ce53d,
|
||||||
mtpc_messageMediaGeo = 0x56e0d474,
|
mtpc_messageMediaGeo = 0x56e0d474,
|
||||||
|
@ -166,6 +166,7 @@ enum {
|
||||||
mtpc_messageActionChannelCreate = 0x95d2ac92,
|
mtpc_messageActionChannelCreate = 0x95d2ac92,
|
||||||
mtpc_messageActionChatMigrateTo = 0x51bdb021,
|
mtpc_messageActionChatMigrateTo = 0x51bdb021,
|
||||||
mtpc_messageActionChannelMigrateFrom = 0xb055eaee,
|
mtpc_messageActionChannelMigrateFrom = 0xb055eaee,
|
||||||
|
mtpc_messageActionPinMessage = 0x94bd38ed,
|
||||||
mtpc_dialog = 0xc1dd804a,
|
mtpc_dialog = 0xc1dd804a,
|
||||||
mtpc_dialogChannel = 0x5b8496b2,
|
mtpc_dialogChannel = 0x5b8496b2,
|
||||||
mtpc_photoEmpty = 0x2331b22d,
|
mtpc_photoEmpty = 0x2331b22d,
|
||||||
|
@ -613,7 +614,7 @@ enum {
|
||||||
mtpc_channels_toggleSignatures = 0x1f69b606,
|
mtpc_channels_toggleSignatures = 0x1f69b606,
|
||||||
mtpc_channels_getMessageEditData = 0x27ea3a28,
|
mtpc_channels_getMessageEditData = 0x27ea3a28,
|
||||||
mtpc_channels_editMessage = 0xdcda80ed,
|
mtpc_channels_editMessage = 0xdcda80ed,
|
||||||
mtpc_channels_updatePinnedMessage = 0x84a41867
|
mtpc_channels_updatePinnedMessage = 0xa72ded52
|
||||||
};
|
};
|
||||||
|
|
||||||
// Type forward declarations
|
// Type forward declarations
|
||||||
|
@ -3535,7 +3536,7 @@ private:
|
||||||
|
|
||||||
friend MTPmessage MTP_messageEmpty(MTPint _id);
|
friend MTPmessage MTP_messageEmpty(MTPint _id);
|
||||||
friend MTPmessage MTP_message(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, const MTPMessageFwdHeader &_fwd_from, MTPint _via_bot_id, MTPint _reply_to_msg_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media, const MTPReplyMarkup &_reply_markup, const MTPVector<MTPMessageEntity> &_entities, MTPint _views, MTPint _edit_date);
|
friend MTPmessage MTP_message(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, const MTPMessageFwdHeader &_fwd_from, MTPint _via_bot_id, MTPint _reply_to_msg_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media, const MTPReplyMarkup &_reply_markup, const MTPVector<MTPMessageEntity> &_entities, MTPint _views, MTPint _edit_date);
|
||||||
friend MTPmessage MTP_messageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPMessageAction &_action);
|
friend MTPmessage MTP_messageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _reply_to_msg_id, MTPint _date, const MTPMessageAction &_action);
|
||||||
|
|
||||||
mtpTypeId _type;
|
mtpTypeId _type;
|
||||||
};
|
};
|
||||||
|
@ -3796,6 +3797,7 @@ private:
|
||||||
friend MTPmessageAction MTP_messageActionChannelCreate(const MTPstring &_title);
|
friend MTPmessageAction MTP_messageActionChannelCreate(const MTPstring &_title);
|
||||||
friend MTPmessageAction MTP_messageActionChatMigrateTo(MTPint _channel_id);
|
friend MTPmessageAction MTP_messageActionChatMigrateTo(MTPint _channel_id);
|
||||||
friend MTPmessageAction MTP_messageActionChannelMigrateFrom(const MTPstring &_title, MTPint _chat_id);
|
friend MTPmessageAction MTP_messageActionChannelMigrateFrom(const MTPstring &_title, MTPint _chat_id);
|
||||||
|
friend MTPmessageAction MTP_messageActionPinMessage();
|
||||||
|
|
||||||
mtpTypeId _type;
|
mtpTypeId _type;
|
||||||
};
|
};
|
||||||
|
@ -10199,13 +10201,14 @@ class MTPDmessageService : public mtpDataImpl<MTPDmessageService> {
|
||||||
public:
|
public:
|
||||||
MTPDmessageService() {
|
MTPDmessageService() {
|
||||||
}
|
}
|
||||||
MTPDmessageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPMessageAction &_action) : vflags(_flags), vid(_id), vfrom_id(_from_id), vto_id(_to_id), vdate(_date), vaction(_action) {
|
MTPDmessageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _reply_to_msg_id, MTPint _date, const MTPMessageAction &_action) : vflags(_flags), vid(_id), vfrom_id(_from_id), vto_id(_to_id), vreply_to_msg_id(_reply_to_msg_id), vdate(_date), vaction(_action) {
|
||||||
}
|
}
|
||||||
|
|
||||||
MTPint vflags;
|
MTPint vflags;
|
||||||
MTPint vid;
|
MTPint vid;
|
||||||
MTPint vfrom_id;
|
MTPint vfrom_id;
|
||||||
MTPPeer vto_id;
|
MTPPeer vto_id;
|
||||||
|
MTPint vreply_to_msg_id;
|
||||||
MTPint vdate;
|
MTPint vdate;
|
||||||
MTPMessageAction vaction;
|
MTPMessageAction vaction;
|
||||||
|
|
||||||
|
@ -10217,6 +10220,7 @@ public:
|
||||||
flag_silent = (1 << 13),
|
flag_silent = (1 << 13),
|
||||||
flag_post = (1 << 14),
|
flag_post = (1 << 14),
|
||||||
flag_from_id = (1 << 8),
|
flag_from_id = (1 << 8),
|
||||||
|
flag_reply_to_msg_id = (1 << 3),
|
||||||
};
|
};
|
||||||
|
|
||||||
bool is_unread() const { return vflags.v & flag_unread; }
|
bool is_unread() const { return vflags.v & flag_unread; }
|
||||||
|
@ -10226,6 +10230,7 @@ public:
|
||||||
bool is_silent() const { return vflags.v & flag_silent; }
|
bool is_silent() const { return vflags.v & flag_silent; }
|
||||||
bool is_post() const { return vflags.v & flag_post; }
|
bool is_post() const { return vflags.v & flag_post; }
|
||||||
bool has_from_id() const { return vflags.v & flag_from_id; }
|
bool has_from_id() const { return vflags.v & flag_from_id; }
|
||||||
|
bool has_reply_to_msg_id() const { return vflags.v & flag_reply_to_msg_id; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class MTPDmessageMediaPhoto : public mtpDataImpl<MTPDmessageMediaPhoto> {
|
class MTPDmessageMediaPhoto : public mtpDataImpl<MTPDmessageMediaPhoto> {
|
||||||
|
@ -20603,6 +20608,7 @@ public:
|
||||||
|
|
||||||
class MTPchannels_updatePinnedMessage { // RPC method 'channels.updatePinnedMessage'
|
class MTPchannels_updatePinnedMessage { // RPC method 'channels.updatePinnedMessage'
|
||||||
public:
|
public:
|
||||||
|
MTPint vflags;
|
||||||
MTPInputChannel vchannel;
|
MTPInputChannel vchannel;
|
||||||
MTPint vid;
|
MTPint vid;
|
||||||
|
|
||||||
|
@ -20611,20 +20617,28 @@ public:
|
||||||
MTPchannels_updatePinnedMessage(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_channels_updatePinnedMessage) {
|
MTPchannels_updatePinnedMessage(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_channels_updatePinnedMessage) {
|
||||||
read(from, end, cons);
|
read(from, end, cons);
|
||||||
}
|
}
|
||||||
MTPchannels_updatePinnedMessage(const MTPInputChannel &_channel, MTPint _id) : vchannel(_channel), vid(_id) {
|
MTPchannels_updatePinnedMessage(MTPint _flags, const MTPInputChannel &_channel, MTPint _id) : vflags(_flags), vchannel(_channel), vid(_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
flag_silent = (1 << 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
bool is_silent() const { return vflags.v & flag_silent; }
|
||||||
|
|
||||||
uint32 innerLength() const {
|
uint32 innerLength() const {
|
||||||
return vchannel.innerLength() + vid.innerLength();
|
return vflags.innerLength() + vchannel.innerLength() + vid.innerLength();
|
||||||
}
|
}
|
||||||
mtpTypeId type() const {
|
mtpTypeId type() const {
|
||||||
return mtpc_channels_updatePinnedMessage;
|
return mtpc_channels_updatePinnedMessage;
|
||||||
}
|
}
|
||||||
void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_channels_updatePinnedMessage) {
|
void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_channels_updatePinnedMessage) {
|
||||||
|
vflags.read(from, end);
|
||||||
vchannel.read(from, end);
|
vchannel.read(from, end);
|
||||||
vid.read(from, end);
|
vid.read(from, end);
|
||||||
}
|
}
|
||||||
void write(mtpBuffer &to) const {
|
void write(mtpBuffer &to) const {
|
||||||
|
vflags.write(to);
|
||||||
vchannel.write(to);
|
vchannel.write(to);
|
||||||
vid.write(to);
|
vid.write(to);
|
||||||
}
|
}
|
||||||
|
@ -20639,7 +20653,7 @@ public:
|
||||||
}
|
}
|
||||||
MTPchannels_UpdatePinnedMessage(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPchannels_updatePinnedMessage>(from, end, cons) {
|
MTPchannels_UpdatePinnedMessage(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPchannels_updatePinnedMessage>(from, end, cons) {
|
||||||
}
|
}
|
||||||
MTPchannels_UpdatePinnedMessage(const MTPInputChannel &_channel, MTPint _id) : MTPBoxed<MTPchannels_updatePinnedMessage>(MTPchannels_updatePinnedMessage(_channel, _id)) {
|
MTPchannels_UpdatePinnedMessage(MTPint _flags, const MTPInputChannel &_channel, MTPint _id) : MTPBoxed<MTPchannels_updatePinnedMessage>(MTPchannels_updatePinnedMessage(_flags, _channel, _id)) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -23401,7 +23415,7 @@ inline uint32 MTPmessage::innerLength() const {
|
||||||
}
|
}
|
||||||
case mtpc_messageService: {
|
case mtpc_messageService: {
|
||||||
const MTPDmessageService &v(c_messageService());
|
const MTPDmessageService &v(c_messageService());
|
||||||
return v.vflags.innerLength() + v.vid.innerLength() + (v.has_from_id() ? v.vfrom_id.innerLength() : 0) + v.vto_id.innerLength() + v.vdate.innerLength() + v.vaction.innerLength();
|
return v.vflags.innerLength() + v.vid.innerLength() + (v.has_from_id() ? v.vfrom_id.innerLength() : 0) + v.vto_id.innerLength() + (v.has_reply_to_msg_id() ? v.vreply_to_msg_id.innerLength() : 0) + v.vdate.innerLength() + v.vaction.innerLength();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -23443,6 +23457,7 @@ inline void MTPmessage::read(const mtpPrime *&from, const mtpPrime *end, mtpType
|
||||||
v.vid.read(from, end);
|
v.vid.read(from, end);
|
||||||
if (v.has_from_id()) { v.vfrom_id.read(from, end); } else { v.vfrom_id = MTPint(); }
|
if (v.has_from_id()) { v.vfrom_id.read(from, end); } else { v.vfrom_id = MTPint(); }
|
||||||
v.vto_id.read(from, end);
|
v.vto_id.read(from, end);
|
||||||
|
if (v.has_reply_to_msg_id()) { v.vreply_to_msg_id.read(from, end); } else { v.vreply_to_msg_id = MTPint(); }
|
||||||
v.vdate.read(from, end);
|
v.vdate.read(from, end);
|
||||||
v.vaction.read(from, end);
|
v.vaction.read(from, end);
|
||||||
} break;
|
} break;
|
||||||
|
@ -23478,6 +23493,7 @@ inline void MTPmessage::write(mtpBuffer &to) const {
|
||||||
v.vid.write(to);
|
v.vid.write(to);
|
||||||
if (v.has_from_id()) v.vfrom_id.write(to);
|
if (v.has_from_id()) v.vfrom_id.write(to);
|
||||||
v.vto_id.write(to);
|
v.vto_id.write(to);
|
||||||
|
if (v.has_reply_to_msg_id()) v.vreply_to_msg_id.write(to);
|
||||||
v.vdate.write(to);
|
v.vdate.write(to);
|
||||||
v.vaction.write(to);
|
v.vaction.write(to);
|
||||||
} break;
|
} break;
|
||||||
|
@ -23503,8 +23519,8 @@ inline MTPmessage MTP_messageEmpty(MTPint _id) {
|
||||||
inline MTPmessage MTP_message(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, const MTPMessageFwdHeader &_fwd_from, MTPint _via_bot_id, MTPint _reply_to_msg_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media, const MTPReplyMarkup &_reply_markup, const MTPVector<MTPMessageEntity> &_entities, MTPint _views, MTPint _edit_date) {
|
inline MTPmessage MTP_message(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, const MTPMessageFwdHeader &_fwd_from, MTPint _via_bot_id, MTPint _reply_to_msg_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media, const MTPReplyMarkup &_reply_markup, const MTPVector<MTPMessageEntity> &_entities, MTPint _views, MTPint _edit_date) {
|
||||||
return MTPmessage(new MTPDmessage(_flags, _id, _from_id, _to_id, _fwd_from, _via_bot_id, _reply_to_msg_id, _date, _message, _media, _reply_markup, _entities, _views, _edit_date));
|
return MTPmessage(new MTPDmessage(_flags, _id, _from_id, _to_id, _fwd_from, _via_bot_id, _reply_to_msg_id, _date, _message, _media, _reply_markup, _entities, _views, _edit_date));
|
||||||
}
|
}
|
||||||
inline MTPmessage MTP_messageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPMessageAction &_action) {
|
inline MTPmessage MTP_messageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _reply_to_msg_id, MTPint _date, const MTPMessageAction &_action) {
|
||||||
return MTPmessage(new MTPDmessageService(_flags, _id, _from_id, _to_id, _date, _action));
|
return MTPmessage(new MTPDmessageService(_flags, _id, _from_id, _to_id, _reply_to_msg_id, _date, _action));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint32 MTPmessageMedia::innerLength() const {
|
inline uint32 MTPmessageMedia::innerLength() const {
|
||||||
|
@ -23771,6 +23787,7 @@ inline void MTPmessageAction::read(const mtpPrime *&from, const mtpPrime *end, m
|
||||||
v.vtitle.read(from, end);
|
v.vtitle.read(from, end);
|
||||||
v.vchat_id.read(from, end);
|
v.vchat_id.read(from, end);
|
||||||
} break;
|
} break;
|
||||||
|
case mtpc_messageActionPinMessage: _type = cons; break;
|
||||||
default: throw mtpErrorUnexpected(cons, "MTPmessageAction");
|
default: throw mtpErrorUnexpected(cons, "MTPmessageAction");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23829,6 +23846,7 @@ inline MTPmessageAction::MTPmessageAction(mtpTypeId type) : mtpDataOwner(0), _ty
|
||||||
case mtpc_messageActionChannelCreate: setData(new MTPDmessageActionChannelCreate()); break;
|
case mtpc_messageActionChannelCreate: setData(new MTPDmessageActionChannelCreate()); break;
|
||||||
case mtpc_messageActionChatMigrateTo: setData(new MTPDmessageActionChatMigrateTo()); break;
|
case mtpc_messageActionChatMigrateTo: setData(new MTPDmessageActionChatMigrateTo()); break;
|
||||||
case mtpc_messageActionChannelMigrateFrom: setData(new MTPDmessageActionChannelMigrateFrom()); break;
|
case mtpc_messageActionChannelMigrateFrom: setData(new MTPDmessageActionChannelMigrateFrom()); break;
|
||||||
|
case mtpc_messageActionPinMessage: break;
|
||||||
default: throw mtpErrorBadTypeId(type, "MTPmessageAction");
|
default: throw mtpErrorBadTypeId(type, "MTPmessageAction");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23883,6 +23901,9 @@ inline MTPmessageAction MTP_messageActionChatMigrateTo(MTPint _channel_id) {
|
||||||
inline MTPmessageAction MTP_messageActionChannelMigrateFrom(const MTPstring &_title, MTPint _chat_id) {
|
inline MTPmessageAction MTP_messageActionChannelMigrateFrom(const MTPstring &_title, MTPint _chat_id) {
|
||||||
return MTPmessageAction(new MTPDmessageActionChannelMigrateFrom(_title, _chat_id));
|
return MTPmessageAction(new MTPDmessageActionChannelMigrateFrom(_title, _chat_id));
|
||||||
}
|
}
|
||||||
|
inline MTPmessageAction MTP_messageActionPinMessage() {
|
||||||
|
return MTPmessageAction(mtpc_messageActionPinMessage);
|
||||||
|
}
|
||||||
|
|
||||||
inline uint32 MTPdialog::innerLength() const {
|
inline uint32 MTPdialog::innerLength() const {
|
||||||
switch (_type) {
|
switch (_type) {
|
||||||
|
|
|
@ -227,7 +227,7 @@ chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;
|
||||||
|
|
||||||
messageEmpty#83e5de54 id:int = Message;
|
messageEmpty#83e5de54 id:int = Message;
|
||||||
message#c09be45f flags:# unread:flags.0?true out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int = Message;
|
message#c09be45f flags:# unread:flags.0?true out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int = Message;
|
||||||
messageService#c06b9607 flags:# unread:flags.0?true out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer date:int action:MessageAction = Message;
|
messageService#9e19a1f6 flags:# unread:flags.0?true out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer reply_to_msg_id:flags.3?int date:int action:MessageAction = Message;
|
||||||
|
|
||||||
messageMediaEmpty#3ded6320 = MessageMedia;
|
messageMediaEmpty#3ded6320 = MessageMedia;
|
||||||
messageMediaPhoto#3d8ce53d photo:Photo caption:string = MessageMedia;
|
messageMediaPhoto#3d8ce53d photo:Photo caption:string = MessageMedia;
|
||||||
|
@ -249,6 +249,7 @@ messageActionChatJoinedByLink#f89cf5e8 inviter_id:int = MessageAction;
|
||||||
messageActionChannelCreate#95d2ac92 title:string = MessageAction;
|
messageActionChannelCreate#95d2ac92 title:string = MessageAction;
|
||||||
messageActionChatMigrateTo#51bdb021 channel_id:int = MessageAction;
|
messageActionChatMigrateTo#51bdb021 channel_id:int = MessageAction;
|
||||||
messageActionChannelMigrateFrom#b055eaee title:string chat_id:int = MessageAction;
|
messageActionChannelMigrateFrom#b055eaee title:string chat_id:int = MessageAction;
|
||||||
|
messageActionPinMessage#94bd38ed = MessageAction;
|
||||||
|
|
||||||
dialog#c1dd804a peer:Peer top_message:int read_inbox_max_id:int unread_count:int notify_settings:PeerNotifySettings = Dialog;
|
dialog#c1dd804a peer:Peer top_message:int read_inbox_max_id:int unread_count:int notify_settings:PeerNotifySettings = Dialog;
|
||||||
dialogChannel#5b8496b2 peer:Peer top_message:int top_important_message:int read_inbox_max_id:int unread_count:int unread_important_count:int notify_settings:PeerNotifySettings pts:int = Dialog;
|
dialogChannel#5b8496b2 peer:Peer top_message:int top_important_message:int read_inbox_max_id:int unread_count:int unread_important_count:int notify_settings:PeerNotifySettings pts:int = Dialog;
|
||||||
|
@ -821,4 +822,4 @@ channels.exportMessageLink#c846d22d channel:InputChannel id:int = ExportedMessag
|
||||||
channels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates;
|
channels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates;
|
||||||
channels.getMessageEditData#27ea3a28 channel:InputChannel id:int = channels.MessageEditData;
|
channels.getMessageEditData#27ea3a28 channel:InputChannel id:int = channels.MessageEditData;
|
||||||
channels.editMessage#dcda80ed flags:# no_webpage:flags.1?true channel:InputChannel id:int message:string entities:flags.3?Vector<MessageEntity> = Updates;
|
channels.editMessage#dcda80ed flags:# no_webpage:flags.1?true channel:InputChannel id:int message:string entities:flags.3?Vector<MessageEntity> = Updates;
|
||||||
channels.updatePinnedMessage#84a41867 channel:InputChannel id:int = Updates;
|
channels.updatePinnedMessage#a72ded52 flags:# silent:flags.0?true channel:InputChannel id:int = Updates;
|
||||||
|
|
Loading…
Reference in New Issue