mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-03-25 04:38:23 +00:00
updating edited messages dependencies (replies, edit / reply / pinned bar), postponing notification about pinned message while the message itself is not yet available
This commit is contained in:
parent
c36fc92041
commit
5cab9569c3
@ -937,6 +937,7 @@ namespace App {
|
||||
if (App::main()) {
|
||||
App::main()->dlgUpdated(existing->history(), existing->id);
|
||||
}
|
||||
App::historyUpdateDependent(existing);
|
||||
Notify::historyItemResized(existing);
|
||||
}
|
||||
}
|
||||
@ -1796,6 +1797,18 @@ namespace App {
|
||||
}
|
||||
}
|
||||
|
||||
void historyUpdateDependent(HistoryItem *item) {
|
||||
DependentItems::iterator j = ::dependentItems.find(item);
|
||||
if (j != ::dependentItems.cend()) {
|
||||
for (OrderedSet<HistoryItem*>::const_iterator k = j.value().cbegin(), e = j.value().cend(); k != e; ++k) {
|
||||
k.key()->updateDependencyItem();
|
||||
}
|
||||
}
|
||||
if (App::main()) {
|
||||
App::main()->itemEdited(item);
|
||||
}
|
||||
}
|
||||
|
||||
void historyClearMsgs() {
|
||||
::dependentItems.clear();
|
||||
|
||||
|
@ -150,6 +150,7 @@ namespace App {
|
||||
void historyRegItem(HistoryItem *item);
|
||||
void historyItemDetached(HistoryItem *item);
|
||||
void historyUnregItem(HistoryItem *item);
|
||||
void historyUpdateDependent(HistoryItem *item);
|
||||
void historyClearMsgs();
|
||||
void historyClearItems();
|
||||
void historyRegDependency(HistoryItem *dependent, HistoryItem *dependency);
|
||||
|
@ -493,7 +493,7 @@ void RichDeleteMessageBox::onDelete() {
|
||||
QVector<MsgId> toDestroy;
|
||||
for (History::Blocks::const_iterator i = h->blocks.cbegin(), e = h->blocks.cend(); i != e; ++i) {
|
||||
for (HistoryBlock::Items::const_iterator j = (*i)->items.cbegin(), n = (*i)->items.cend(); j != n; ++j) {
|
||||
if ((*j)->from() == _from && (*j)->type() == HistoryItemMsg) {
|
||||
if ((*j)->from() == _from && (*j)->type() == HistoryItemMsg && (*j)->canDelete()) {
|
||||
toDestroy.push_back((*j)->id);
|
||||
}
|
||||
}
|
||||
|
@ -7101,11 +7101,19 @@ void HistoryReply::initDimensions() {
|
||||
}
|
||||
|
||||
bool HistoryReply::updateReplyTo(bool force) {
|
||||
if (replyToMsg || !replyToMsgId) return true;
|
||||
replyToMsg = App::histItemById(channelId(), replyToMsgId);
|
||||
if (!force) {
|
||||
if (replyToMsg || !replyToMsgId) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (!replyToMsg) {
|
||||
replyToMsg = App::histItemById(channelId(), replyToMsgId);
|
||||
if (replyToMsg) {
|
||||
App::historyRegDependency(this, replyToMsg);
|
||||
}
|
||||
}
|
||||
|
||||
if (replyToMsg) {
|
||||
App::historyRegDependency(this, replyToMsg);
|
||||
replyToText.setText(st::msgFont, replyToMsg->inReplyText(), _textDlgOptions);
|
||||
|
||||
replyToNameUpdated();
|
||||
@ -7526,22 +7534,38 @@ bool HistoryServiceMsg::updatePinned(bool force) {
|
||||
HistoryServicePinned *pinned = Get<HistoryServicePinned>();
|
||||
t_assert(pinned != nullptr);
|
||||
|
||||
if (!pinned->msgId || pinned->msg) return true;
|
||||
if (!force) {
|
||||
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);
|
||||
bool gotDependencyItem = false;
|
||||
if (!pinned->msg) {
|
||||
pinned->msg = App::histItemById(channelId(), pinned->msgId);
|
||||
if (pinned->msg) {
|
||||
App::historyRegDependency(this, pinned->msg);
|
||||
gotDependencyItem = true;
|
||||
}
|
||||
}
|
||||
if (pinned->msg) {
|
||||
App::historyRegDependency(this, pinned->msg);
|
||||
updatePinnedText();
|
||||
} else if (force) {
|
||||
pinned->msgId = 0;
|
||||
if (pinned->msgId > 0) {
|
||||
pinned->msgId = 0;
|
||||
gotDependencyItem = true;
|
||||
}
|
||||
updatePinnedText();
|
||||
}
|
||||
if (force) {
|
||||
initDimensions();
|
||||
Notify::historyItemResized(this);
|
||||
if (gotDependencyItem && App::wnd()) {
|
||||
App::wnd()->notifySettingGot();
|
||||
}
|
||||
}
|
||||
return (pinned->msg || !pinned->msgId);
|
||||
}
|
||||
@ -7613,6 +7637,7 @@ bool HistoryServiceMsg::updatePinnedText(const QString *pfrom, QString *ptext) {
|
||||
if (App::main()) {
|
||||
App::main()->dlgUpdated(history(), id);
|
||||
}
|
||||
App::historyUpdateDependent(this);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -937,6 +937,9 @@ public:
|
||||
virtual MsgId dependencyMsgId() const {
|
||||
return 0;
|
||||
}
|
||||
virtual bool notificationReady() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual UserData *viaBot() const {
|
||||
return 0;
|
||||
@ -2355,6 +2358,12 @@ public:
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
bool notificationReady() const override {
|
||||
if (const HistoryServicePinned *pinned = Get<HistoryServicePinned>()) {
|
||||
return (pinned->msg || !pinned->msgId);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void countPositionAndSize(int32 &left, int32 &width) const;
|
||||
|
||||
|
@ -6267,6 +6267,15 @@ void HistoryWidget::itemRemoved(HistoryItem *item) {
|
||||
}
|
||||
}
|
||||
|
||||
void HistoryWidget::itemEdited(HistoryItem *item) {
|
||||
if (item == _replyEditMsg) {
|
||||
updateReplyEditTexts(true);
|
||||
}
|
||||
if (_pinnedBar && item->id == _pinnedBar->msgId) {
|
||||
updatePinnedBar(true);
|
||||
}
|
||||
}
|
||||
|
||||
void HistoryWidget::updateScrollColors() {
|
||||
if (!App::historyScrollBarColor()) return;
|
||||
_scroll.updateColors(App::historyScrollBarColor(), App::historyScrollBgColor(), App::historyScrollBarOverColor(), App::historyScrollBgOverColor());
|
||||
@ -6785,12 +6794,19 @@ HistoryWidget::PinnedBar::PinnedBar(MsgId msgId, HistoryWidget *parent)
|
||||
}
|
||||
|
||||
void HistoryWidget::updatePinnedBar(bool force) {
|
||||
if (!_pinnedBar || _pinnedBar->msg) {
|
||||
if (!_pinnedBar) {
|
||||
return;
|
||||
}
|
||||
if (!force) {
|
||||
if (_pinnedBar->msg) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
t_assert(_history != nullptr);
|
||||
|
||||
_pinnedBar->msg = App::histItemById(_history->channelId(), _pinnedBar->msgId);
|
||||
if (!_pinnedBar->msg) {
|
||||
_pinnedBar->msg = App::histItemById(_history->channelId(), _pinnedBar->msgId);
|
||||
}
|
||||
if (_pinnedBar->msg) {
|
||||
_pinnedBar->text.setText(st::msgFont, _pinnedBar->msg->inDialogsText(), _textDlgOptions);
|
||||
} else if (force) {
|
||||
@ -7595,10 +7611,14 @@ void HistoryWidget::messageDataReceived(ChannelData *channel, MsgId msgId) {
|
||||
}
|
||||
|
||||
void HistoryWidget::updateReplyEditTexts(bool force) {
|
||||
if (_replyEditMsg || (!_editMsgId && !_replyToId)) {
|
||||
return;
|
||||
if (!force) {
|
||||
if (_replyEditMsg || (!_editMsgId && !_replyToId)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!_replyEditMsg) {
|
||||
_replyEditMsg = App::histItemById(_channel, _editMsgId ? _editMsgId : _replyToId);
|
||||
}
|
||||
_replyEditMsg = App::histItemById(_channel, _editMsgId ? _editMsgId : _replyToId);
|
||||
if (_replyEditMsg) {
|
||||
_replyEditMsgText.setText(st::msgFont, _replyEditMsg->inDialogsText(), _textDlgOptions);
|
||||
|
||||
|
@ -513,6 +513,7 @@ public:
|
||||
|
||||
void fillSelectedItems(SelectedItemSet &sel, bool forDelete = true);
|
||||
void itemRemoved(HistoryItem *item);
|
||||
void itemEdited(HistoryItem *item);
|
||||
|
||||
void updateScrollColors();
|
||||
|
||||
|
@ -1541,6 +1541,12 @@ void MainWidget::itemRemoved(HistoryItem *item) {
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::itemEdited(HistoryItem *item) {
|
||||
if (history.peer() == item->history()->peer || (history.peer() && history.peer() == item->history()->peer->migrateTo())) {
|
||||
history.itemEdited(item);
|
||||
}
|
||||
}
|
||||
|
||||
bool MainWidget::overviewFailed(PeerData *peer, const RPCError &error, mtpRequestId req) {
|
||||
if (mtpIsFlood(error)) return false;
|
||||
|
||||
|
@ -348,6 +348,7 @@ public:
|
||||
void mediaOverviewUpdated(PeerData *peer, MediaOverviewType type);
|
||||
void changingMsgId(HistoryItem *row, MsgId newId);
|
||||
void itemRemoved(HistoryItem *item);
|
||||
void itemEdited(HistoryItem *item);
|
||||
|
||||
void loadMediaBack(PeerData *peer, MediaOverviewType type, bool many = false);
|
||||
void peerUsernameChanged(PeerData *peer);
|
||||
|
@ -1213,21 +1213,22 @@ void _serialize_channelFull(MTPStringLogger &to, int32 stage, int32 lev, Types &
|
||||
switch (stage) {
|
||||
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(" can_view_participants: "); ++stages.back(); if (flag & MTPDchannelFull::flag_can_view_participants) { to.add("YES [ BY BIT 3 IN FIELD flags ]"); } else { to.add("[ SKIPPED BY BIT 3 IN FIELD flags ]"); } break;
|
||||
case 2: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 3: to.add(" about: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 4: to.add(" participants_count: "); ++stages.back(); if (flag & MTPDchannelFull::flag_participants_count) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 0 IN FIELD flags ]"); } break;
|
||||
case 5: to.add(" admins_count: "); ++stages.back(); if (flag & MTPDchannelFull::flag_admins_count) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 1 IN FIELD flags ]"); } break;
|
||||
case 6: to.add(" kicked_count: "); ++stages.back(); if (flag & MTPDchannelFull::flag_kicked_count) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break;
|
||||
case 7: to.add(" read_inbox_max_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(" unread_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 9: to.add(" unread_important_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 10: to.add(" chat_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 11: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 12: to.add(" exported_invite: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 13: to.add(" bot_info: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 14: to.add(" migrated_from_chat_id: "); ++stages.back(); if (flag & MTPDchannelFull::flag_migrated_from_chat_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 4 IN FIELD flags ]"); } break;
|
||||
case 15: to.add(" migrated_from_max_id: "); ++stages.back(); if (flag & MTPDchannelFull::flag_migrated_from_max_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 4 IN FIELD flags ]"); } break;
|
||||
case 16: to.add(" pinned_msg_id: "); ++stages.back(); if (flag & MTPDchannelFull::flag_pinned_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 5 IN FIELD flags ]"); } break;
|
||||
case 2: to.add(" can_set_username: "); ++stages.back(); if (flag & MTPDchannelFull::flag_can_set_username) { to.add("YES [ BY BIT 6 IN FIELD flags ]"); } else { to.add("[ SKIPPED BY BIT 6 IN FIELD flags ]"); } 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;
|
||||
case 4: to.add(" about: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 5: to.add(" participants_count: "); ++stages.back(); if (flag & MTPDchannelFull::flag_participants_count) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 0 IN FIELD flags ]"); } break;
|
||||
case 6: to.add(" admins_count: "); ++stages.back(); if (flag & MTPDchannelFull::flag_admins_count) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 1 IN FIELD flags ]"); } break;
|
||||
case 7: to.add(" kicked_count: "); ++stages.back(); if (flag & MTPDchannelFull::flag_kicked_count) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break;
|
||||
case 8: to.add(" read_inbox_max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 9: to.add(" unread_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 10: to.add(" unread_important_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 11: to.add(" chat_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 12: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 13: to.add(" exported_invite: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 14: to.add(" bot_info: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
|
||||
case 15: to.add(" migrated_from_chat_id: "); ++stages.back(); if (flag & MTPDchannelFull::flag_migrated_from_chat_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 4 IN FIELD flags ]"); } break;
|
||||
case 16: to.add(" migrated_from_max_id: "); ++stages.back(); if (flag & MTPDchannelFull::flag_migrated_from_max_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 4 IN FIELD flags ]"); } break;
|
||||
case 17: to.add(" pinned_msg_id: "); ++stages.back(); if (flag & MTPDchannelFull::flag_pinned_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 5 IN FIELD flags ]"); } break;
|
||||
default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break;
|
||||
}
|
||||
}
|
||||
@ -1901,6 +1902,20 @@ void _serialize_peerNotifySettings(MTPStringLogger &to, int32 stage, int32 lev,
|
||||
}
|
||||
}
|
||||
|
||||
void _serialize_peerSettings(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
||||
if (stage) {
|
||||
to.add(",\n").addSpaces(lev);
|
||||
} else {
|
||||
to.add("{ peerSettings");
|
||||
to.add("\n").addSpaces(lev);
|
||||
}
|
||||
switch (stage) {
|
||||
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(" report_spam: "); ++stages.back(); if (flag & MTPDpeerSettings::flag_report_spam) { to.add("YES [ BY BIT 0 IN FIELD flags ]"); } else { to.add("[ SKIPPED BY BIT 0 IN FIELD flags ]"); } break;
|
||||
default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break;
|
||||
}
|
||||
}
|
||||
|
||||
void _serialize_wallPaper(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
||||
if (stage) {
|
||||
to.add(",\n").addSpaces(lev);
|
||||
@ -5577,6 +5592,19 @@ void _serialize_messages_reportSpam(MTPStringLogger &to, int32 stage, int32 lev,
|
||||
}
|
||||
}
|
||||
|
||||
void _serialize_messages_hideReportSpam(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
||||
if (stage) {
|
||||
to.add(",\n").addSpaces(lev);
|
||||
} else {
|
||||
to.add("{ messages_hideReportSpam");
|
||||
to.add("\n").addSpaces(lev);
|
||||
}
|
||||
switch (stage) {
|
||||
case 0: to.add(" peer: "); ++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;
|
||||
}
|
||||
}
|
||||
|
||||
void _serialize_messages_discardEncryption(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
||||
if (stage) {
|
||||
to.add(",\n").addSpaces(lev);
|
||||
@ -6974,6 +7002,19 @@ void _serialize_channels_updatePinnedMessage(MTPStringLogger &to, int32 stage, i
|
||||
}
|
||||
}
|
||||
|
||||
void _serialize_messages_getPeerSettings(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
||||
if (stage) {
|
||||
to.add(",\n").addSpaces(lev);
|
||||
} else {
|
||||
to.add("{ messages_getPeerSettings");
|
||||
to.add("\n").addSpaces(lev);
|
||||
}
|
||||
switch (stage) {
|
||||
case 0: to.add(" peer: "); ++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;
|
||||
}
|
||||
}
|
||||
|
||||
void _serialize_messages_getChats(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) {
|
||||
if (stage) {
|
||||
to.add(",\n").addSpaces(lev);
|
||||
@ -7719,6 +7760,7 @@ namespace {
|
||||
_serializers.insert(mtpc_peerNotifyEventsAll, _serialize_peerNotifyEventsAll);
|
||||
_serializers.insert(mtpc_peerNotifySettingsEmpty, _serialize_peerNotifySettingsEmpty);
|
||||
_serializers.insert(mtpc_peerNotifySettings, _serialize_peerNotifySettings);
|
||||
_serializers.insert(mtpc_peerSettings, _serialize_peerSettings);
|
||||
_serializers.insert(mtpc_wallPaper, _serialize_wallPaper);
|
||||
_serializers.insert(mtpc_wallPaperSolid, _serialize_wallPaperSolid);
|
||||
_serializers.insert(mtpc_inputReportReasonSpam, _serialize_inputReportReasonSpam);
|
||||
@ -8011,6 +8053,7 @@ namespace {
|
||||
_serializers.insert(mtpc_contacts_unblock, _serialize_contacts_unblock);
|
||||
_serializers.insert(mtpc_messages_setTyping, _serialize_messages_setTyping);
|
||||
_serializers.insert(mtpc_messages_reportSpam, _serialize_messages_reportSpam);
|
||||
_serializers.insert(mtpc_messages_hideReportSpam, _serialize_messages_hideReportSpam);
|
||||
_serializers.insert(mtpc_messages_discardEncryption, _serialize_messages_discardEncryption);
|
||||
_serializers.insert(mtpc_messages_setEncryptedTyping, _serialize_messages_setEncryptedTyping);
|
||||
_serializers.insert(mtpc_messages_readEncryptedHistory, _serialize_messages_readEncryptedHistory);
|
||||
@ -8111,6 +8154,7 @@ namespace {
|
||||
_serializers.insert(mtpc_channels_toggleSignatures, _serialize_channels_toggleSignatures);
|
||||
_serializers.insert(mtpc_channels_editMessage, _serialize_channels_editMessage);
|
||||
_serializers.insert(mtpc_channels_updatePinnedMessage, _serialize_channels_updatePinnedMessage);
|
||||
_serializers.insert(mtpc_messages_getPeerSettings, _serialize_messages_getPeerSettings);
|
||||
_serializers.insert(mtpc_messages_getChats, _serialize_messages_getChats);
|
||||
_serializers.insert(mtpc_channels_getChannels, _serialize_channels_getChannels);
|
||||
_serializers.insert(mtpc_messages_getFullChat, _serialize_messages_getFullChat);
|
||||
|
@ -192,6 +192,7 @@ enum {
|
||||
mtpc_peerNotifyEventsAll = 0x6d1ded88,
|
||||
mtpc_peerNotifySettingsEmpty = 0x70a68512,
|
||||
mtpc_peerNotifySettings = 0x9acda4c0,
|
||||
mtpc_peerSettings = 0x818426cd,
|
||||
mtpc_wallPaper = 0xccb03657,
|
||||
mtpc_wallPaperSolid = 0x63117f24,
|
||||
mtpc_inputReportReasonSpam = 0x58dbcab8,
|
||||
@ -523,6 +524,8 @@ enum {
|
||||
mtpc_messages_sendMedia = 0xc8f16791,
|
||||
mtpc_messages_forwardMessages = 0x708e0195,
|
||||
mtpc_messages_reportSpam = 0xcf1592db,
|
||||
mtpc_messages_hideReportSpam = 0xa8f1709b,
|
||||
mtpc_messages_getPeerSettings = 0x3672e09c,
|
||||
mtpc_messages_getChats = 0x3c6aa187,
|
||||
mtpc_messages_getFullChat = 0x3b831c66,
|
||||
mtpc_messages_editChatTitle = 0xdc452855,
|
||||
@ -854,6 +857,9 @@ class MTPpeerNotifyEvents;
|
||||
class MTPpeerNotifySettings;
|
||||
class MTPDpeerNotifySettings;
|
||||
|
||||
class MTPpeerSettings;
|
||||
class MTPDpeerSettings;
|
||||
|
||||
class MTPwallPaper;
|
||||
class MTPDwallPaper;
|
||||
class MTPDwallPaperSolid;
|
||||
@ -1313,6 +1319,7 @@ typedef MTPBoxed<MTPinputPeerNotifyEvents> MTPInputPeerNotifyEvents;
|
||||
typedef MTPBoxed<MTPinputPeerNotifySettings> MTPInputPeerNotifySettings;
|
||||
typedef MTPBoxed<MTPpeerNotifyEvents> MTPPeerNotifyEvents;
|
||||
typedef MTPBoxed<MTPpeerNotifySettings> MTPPeerNotifySettings;
|
||||
typedef MTPBoxed<MTPpeerSettings> MTPPeerSettings;
|
||||
typedef MTPBoxed<MTPwallPaper> MTPWallPaper;
|
||||
typedef MTPBoxed<MTPreportReason> MTPReportReason;
|
||||
typedef MTPBoxed<MTPuserFull> MTPUserFull;
|
||||
@ -4311,6 +4318,37 @@ private:
|
||||
};
|
||||
typedef MTPBoxed<MTPpeerNotifySettings> MTPPeerNotifySettings;
|
||||
|
||||
class MTPpeerSettings : private mtpDataOwner {
|
||||
public:
|
||||
MTPpeerSettings();
|
||||
MTPpeerSettings(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_peerSettings) : mtpDataOwner(0) {
|
||||
read(from, end, cons);
|
||||
}
|
||||
|
||||
MTPDpeerSettings &_peerSettings() {
|
||||
if (!data) throw mtpErrorUninitialized();
|
||||
split();
|
||||
return *(MTPDpeerSettings*)data;
|
||||
}
|
||||
const MTPDpeerSettings &c_peerSettings() const {
|
||||
if (!data) throw mtpErrorUninitialized();
|
||||
return *(const MTPDpeerSettings*)data;
|
||||
}
|
||||
|
||||
uint32 innerLength() const;
|
||||
mtpTypeId type() const;
|
||||
void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_peerSettings);
|
||||
void write(mtpBuffer &to) const;
|
||||
|
||||
typedef void ResponseType;
|
||||
|
||||
private:
|
||||
explicit MTPpeerSettings(MTPDpeerSettings *_data);
|
||||
|
||||
friend MTPpeerSettings MTP_peerSettings(MTPint _flags);
|
||||
};
|
||||
typedef MTPBoxed<MTPpeerSettings> MTPPeerSettings;
|
||||
|
||||
class MTPwallPaper : private mtpDataOwner {
|
||||
public:
|
||||
MTPwallPaper() : mtpDataOwner(0), _type(0) {
|
||||
@ -10042,6 +10080,7 @@ public:
|
||||
|
||||
enum {
|
||||
flag_can_view_participants = (1 << 3),
|
||||
flag_can_set_username = (1 << 6),
|
||||
flag_participants_count = (1 << 0),
|
||||
flag_admins_count = (1 << 1),
|
||||
flag_kicked_count = (1 << 2),
|
||||
@ -10051,6 +10090,7 @@ public:
|
||||
};
|
||||
|
||||
bool is_can_view_participants() const { return vflags.v & flag_can_view_participants; }
|
||||
bool is_can_set_username() const { return vflags.v & flag_can_set_username; }
|
||||
bool has_participants_count() const { return vflags.v & flag_participants_count; }
|
||||
bool has_admins_count() const { return vflags.v & flag_admins_count; }
|
||||
bool has_kicked_count() const { return vflags.v & flag_kicked_count; }
|
||||
@ -10608,6 +10648,22 @@ public:
|
||||
bool is_silent() const { return vflags.v & flag_silent; }
|
||||
};
|
||||
|
||||
class MTPDpeerSettings : public mtpDataImpl<MTPDpeerSettings> {
|
||||
public:
|
||||
MTPDpeerSettings() {
|
||||
}
|
||||
MTPDpeerSettings(MTPint _flags) : vflags(_flags) {
|
||||
}
|
||||
|
||||
MTPint vflags;
|
||||
|
||||
enum {
|
||||
flag_report_spam = (1 << 0),
|
||||
};
|
||||
|
||||
bool is_report_spam() const { return vflags.v & flag_report_spam; }
|
||||
};
|
||||
|
||||
class MTPDwallPaper : public mtpDataImpl<MTPDwallPaper> {
|
||||
public:
|
||||
MTPDwallPaper() {
|
||||
@ -16712,6 +16768,84 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class MTPmessages_hideReportSpam { // RPC method 'messages.hideReportSpam'
|
||||
public:
|
||||
MTPInputPeer vpeer;
|
||||
|
||||
MTPmessages_hideReportSpam() {
|
||||
}
|
||||
MTPmessages_hideReportSpam(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_hideReportSpam) {
|
||||
read(from, end, cons);
|
||||
}
|
||||
MTPmessages_hideReportSpam(const MTPInputPeer &_peer) : vpeer(_peer) {
|
||||
}
|
||||
|
||||
uint32 innerLength() const {
|
||||
return vpeer.innerLength();
|
||||
}
|
||||
mtpTypeId type() const {
|
||||
return mtpc_messages_hideReportSpam;
|
||||
}
|
||||
void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_hideReportSpam) {
|
||||
vpeer.read(from, end);
|
||||
}
|
||||
void write(mtpBuffer &to) const {
|
||||
vpeer.write(to);
|
||||
}
|
||||
|
||||
typedef MTPBool ResponseType;
|
||||
};
|
||||
class MTPmessages_HideReportSpam : public MTPBoxed<MTPmessages_hideReportSpam> {
|
||||
public:
|
||||
MTPmessages_HideReportSpam() {
|
||||
}
|
||||
MTPmessages_HideReportSpam(const MTPmessages_hideReportSpam &v) : MTPBoxed<MTPmessages_hideReportSpam>(v) {
|
||||
}
|
||||
MTPmessages_HideReportSpam(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPmessages_hideReportSpam>(from, end, cons) {
|
||||
}
|
||||
MTPmessages_HideReportSpam(const MTPInputPeer &_peer) : MTPBoxed<MTPmessages_hideReportSpam>(MTPmessages_hideReportSpam(_peer)) {
|
||||
}
|
||||
};
|
||||
|
||||
class MTPmessages_getPeerSettings { // RPC method 'messages.getPeerSettings'
|
||||
public:
|
||||
MTPInputPeer vpeer;
|
||||
|
||||
MTPmessages_getPeerSettings() {
|
||||
}
|
||||
MTPmessages_getPeerSettings(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_getPeerSettings) {
|
||||
read(from, end, cons);
|
||||
}
|
||||
MTPmessages_getPeerSettings(const MTPInputPeer &_peer) : vpeer(_peer) {
|
||||
}
|
||||
|
||||
uint32 innerLength() const {
|
||||
return vpeer.innerLength();
|
||||
}
|
||||
mtpTypeId type() const {
|
||||
return mtpc_messages_getPeerSettings;
|
||||
}
|
||||
void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_getPeerSettings) {
|
||||
vpeer.read(from, end);
|
||||
}
|
||||
void write(mtpBuffer &to) const {
|
||||
vpeer.write(to);
|
||||
}
|
||||
|
||||
typedef MTPPeerSettings ResponseType;
|
||||
};
|
||||
class MTPmessages_GetPeerSettings : public MTPBoxed<MTPmessages_getPeerSettings> {
|
||||
public:
|
||||
MTPmessages_GetPeerSettings() {
|
||||
}
|
||||
MTPmessages_GetPeerSettings(const MTPmessages_getPeerSettings &v) : MTPBoxed<MTPmessages_getPeerSettings>(v) {
|
||||
}
|
||||
MTPmessages_GetPeerSettings(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPmessages_getPeerSettings>(from, end, cons) {
|
||||
}
|
||||
MTPmessages_GetPeerSettings(const MTPInputPeer &_peer) : MTPBoxed<MTPmessages_getPeerSettings>(MTPmessages_getPeerSettings(_peer)) {
|
||||
}
|
||||
};
|
||||
|
||||
class MTPmessages_getChats { // RPC method 'messages.getChats'
|
||||
public:
|
||||
MTPVector<MTPint> vid;
|
||||
@ -24585,6 +24719,33 @@ inline MTPpeerNotifySettings MTP_peerNotifySettings(MTPint _flags, MTPint _mute_
|
||||
return MTPpeerNotifySettings(new MTPDpeerNotifySettings(_flags, _mute_until, _sound));
|
||||
}
|
||||
|
||||
inline MTPpeerSettings::MTPpeerSettings() : mtpDataOwner(new MTPDpeerSettings()) {
|
||||
}
|
||||
|
||||
inline uint32 MTPpeerSettings::innerLength() const {
|
||||
const MTPDpeerSettings &v(c_peerSettings());
|
||||
return v.vflags.innerLength();
|
||||
}
|
||||
inline mtpTypeId MTPpeerSettings::type() const {
|
||||
return mtpc_peerSettings;
|
||||
}
|
||||
inline void MTPpeerSettings::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
|
||||
if (cons != mtpc_peerSettings) throw mtpErrorUnexpected(cons, "MTPpeerSettings");
|
||||
|
||||
if (!data) setData(new MTPDpeerSettings());
|
||||
MTPDpeerSettings &v(_peerSettings());
|
||||
v.vflags.read(from, end);
|
||||
}
|
||||
inline void MTPpeerSettings::write(mtpBuffer &to) const {
|
||||
const MTPDpeerSettings &v(c_peerSettings());
|
||||
v.vflags.write(to);
|
||||
}
|
||||
inline MTPpeerSettings::MTPpeerSettings(MTPDpeerSettings *_data) : mtpDataOwner(_data) {
|
||||
}
|
||||
inline MTPpeerSettings MTP_peerSettings(MTPint _flags) {
|
||||
return MTPpeerSettings(new MTPDpeerSettings(_flags));
|
||||
}
|
||||
|
||||
inline uint32 MTPwallPaper::innerLength() const {
|
||||
switch (_type) {
|
||||
case mtpc_wallPaper: {
|
||||
|
@ -213,7 +213,7 @@ channel#a14dca52 flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?t
|
||||
channelForbidden#2d85832c id:int access_hash:long title:string = Chat;
|
||||
|
||||
chatFull#2e02a614 id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> = ChatFull;
|
||||
channelFull#97bee562 flags:# can_view_participants:flags.3?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int read_inbox_max_id:int unread_count:int unread_important_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int = ChatFull;
|
||||
channelFull#97bee562 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int read_inbox_max_id:int unread_count:int unread_important_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int = ChatFull;
|
||||
|
||||
chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;
|
||||
chatParticipantCreator#da13538a user_id:int = ChatParticipant;
|
||||
@ -289,6 +289,8 @@ peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;
|
||||
peerNotifySettingsEmpty#70a68512 = PeerNotifySettings;
|
||||
peerNotifySettings#9acda4c0 flags:# show_previews:flags.0?true silent:flags.1?true mute_until:int sound:string = PeerNotifySettings;
|
||||
|
||||
peerSettings#818426cd flags:# report_spam:flags.0?true = PeerSettings;
|
||||
|
||||
wallPaper#ccb03657 id:int title:string sizes:Vector<PhotoSize> color:int = WallPaper;
|
||||
wallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;
|
||||
|
||||
@ -726,6 +728,8 @@ messages.sendMessage#fa88427a flags:# no_webpage:flags.1?true broadcast:flags.4?
|
||||
messages.sendMedia#c8f16791 flags:# broadcast:flags.4?true silent:flags.5?true background:flags.6?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia random_id:long reply_markup:flags.2?ReplyMarkup = Updates;
|
||||
messages.forwardMessages#708e0195 flags:# broadcast:flags.4?true silent:flags.5?true background:flags.6?true from_peer:InputPeer id:Vector<int> random_id:Vector<long> to_peer:InputPeer = Updates;
|
||||
messages.reportSpam#cf1592db peer:InputPeer = Bool;
|
||||
messages.hideReportSpam#a8f1709b peer:InputPeer = Bool;
|
||||
messages.getPeerSettings#3672e09c peer:InputPeer = PeerSettings;
|
||||
messages.getChats#3c6aa187 id:Vector<int> = messages.Chats;
|
||||
messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;
|
||||
messages.editChatTitle#dc452855 chat_id:int title:string = Updates;
|
||||
|
@ -1408,6 +1408,9 @@ void Window::notifySchedule(History *history, HistoryItem *item) {
|
||||
}
|
||||
App::wnd()->getNotifySetting(MTP_inputNotifyPeer(history->peer->input));
|
||||
}
|
||||
if (!item->notificationReady()) {
|
||||
haveSetting = false;
|
||||
}
|
||||
|
||||
int delay = item->Is<HistoryMessageForwarded>() ? 500 : 100, t = unixtime();
|
||||
uint64 ms = getms(true);
|
||||
@ -1419,7 +1422,7 @@ void Window::notifySchedule(History *history, HistoryItem *item) {
|
||||
delay = Global::NotifyDefaultDelay();
|
||||
}
|
||||
|
||||
uint64 when = getms(true) + delay;
|
||||
uint64 when = ms + delay;
|
||||
notifyWhenAlerts[history].insert(when, notifyByFrom);
|
||||
if (cDesktopNotify() && !psSkipDesktopNotify()) {
|
||||
NotifyWhenMaps::iterator i = notifyWhenMaps.find(history);
|
||||
@ -1487,20 +1490,38 @@ void Window::notifySettingGot() {
|
||||
int32 t = unixtime();
|
||||
for (NotifyWaiters::iterator i = notifySettingWaiters.begin(); i != notifySettingWaiters.end();) {
|
||||
History *history = i.key();
|
||||
if (history->peer->notify == UnknownNotifySettings) {
|
||||
++i;
|
||||
} else {
|
||||
bool loaded = false, muted = false;
|
||||
if (history->peer->notify != UnknownNotifySettings) {
|
||||
if (history->peer->notify == EmptyNotifySettings || history->peer->notify->mute <= t) {
|
||||
notifyWaiters.insert(i.key(), i.value());
|
||||
loaded = true;
|
||||
} else if (PeerData *from = i.value().notifyByFrom) {
|
||||
if (from->notify == UnknownNotifySettings) {
|
||||
++i;
|
||||
continue;
|
||||
} else if (from->notify == EmptyNotifySettings || from->notify->mute <= t) {
|
||||
notifyWaiters.insert(i.key(), i.value());
|
||||
if (from->notify != UnknownNotifySettings) {
|
||||
if (from->notify == EmptyNotifySettings || from->notify->mute <= t) {
|
||||
loaded = true;
|
||||
} else {
|
||||
loaded = muted = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
loaded = muted = true;
|
||||
}
|
||||
}
|
||||
if (loaded) {
|
||||
if (HistoryItem *item = App::histItemById(history->channelId(), i.value().msg)) {
|
||||
if (!item->notificationReady()) {
|
||||
loaded = false;
|
||||
}
|
||||
} else {
|
||||
muted = true;
|
||||
}
|
||||
}
|
||||
if (loaded) {
|
||||
if (!muted) {
|
||||
notifyWaiters.insert(i.key(), i.value());
|
||||
}
|
||||
i = notifySettingWaiters.erase(i);
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
notifyWaitTimer.stop();
|
||||
|
Loading…
Reference in New Issue
Block a user