feat: burn ttl message & display expired status

This commit is contained in:
AlexeyZavar 2025-03-09 02:33:22 +03:00
parent 7c940a0480
commit ccf8d91f01
6 changed files with 124 additions and 51 deletions

View file

@ -34,6 +34,7 @@
#include "data/data_session.h"
#include "history/view/history_view_context_menu.h"
#include "history/view/history_view_element.h"
#include "window/window_controller.h"
#include "window/window_session_controller.h"
namespace AyuUi {
@ -58,13 +59,14 @@ void AddDeletedMessagesActions(PeerData *peerData,
return;
}
addCallback(tr::ayu_ViewDeletedMenuText(tr::now),
[=]
{
sessionController->session().tryResolveWindow()
->showSection(std::make_shared<MessageHistory::SectionMemento>(peerData, nullptr, topicId));
},
&st::menuIconArchive);
addCallback(
tr::ayu_ViewDeletedMenuText(tr::now),
[=]
{
sessionController->session().tryResolveWindow()
->showSection(std::make_shared<MessageHistory::SectionMemento>(peerData, nullptr, topicId));
},
&st::menuIconArchive);
}
void AddJumpToBeginningAction(PeerData *peerData,
@ -149,14 +151,15 @@ void AddJumpToBeginningAction(PeerData *peerData,
void AddHistoryAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item) {
if (AyuMessages::hasRevisions(item)) {
menu->addAction(tr::ayu_EditsHistoryMenuText(tr::now),
[=]
{
item->history()->session().tryResolveWindow()
->showSection(
std::make_shared<MessageHistory::SectionMemento>(item->history()->peer, item, 0));
},
&st::ayuEditsHistoryIcon);
menu->addAction(
tr::ayu_EditsHistoryMenuText(tr::now),
[=]
{
item->history()->session().tryResolveWindow()
->showSection(
std::make_shared<MessageHistory::SectionMemento>(item->history()->peer, item, 0));
},
&st::ayuEditsHistoryIcon);
}
}
@ -171,15 +174,16 @@ void AddHideMessageAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item) {
}
const auto history = item->history();
menu->addAction(tr::ayu_ContextHideMessage(tr::now),
[=]()
{
item->destroy();
history->requestChatListMessage();
menu->addAction(
tr::ayu_ContextHideMessage(tr::now),
[=]()
{
item->destroy();
history->requestChatListMessage();
AyuState::hide(item);
},
&st::menuIconClear);
AyuState::hide(item);
},
&st::menuIconClear);
}
void AddUserMessagesAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item) {
@ -432,31 +436,77 @@ void AddReadUntilAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item) {
return;
}
menu->addAction(tr::ayu_ReadUntilMenuText(tr::now),
[=]()
menu->addAction(
tr::ayu_ReadUntilMenuText(tr::now),
[=]()
{
readHistory(item);
if (item->media() && item->media()->ttlSeconds() <= 0 && item->unsupportedTTL() <= 0 && !item->out() && item
->isUnreadMedia()) {
const auto ids = MTP_vector<MTPint>(1, MTP_int(item->id));
if (const auto channel = item->history()->peer->asChannel()) {
item->history()->session().api().request(MTPchannels_ReadMessageContents(
channel->inputChannel,
ids
)).send();
} else {
item->history()->session().api().request(MTPmessages_ReadMessageContents(
ids
)).done([=](const MTPmessages_AffectedMessages &result)
{
readHistory(item);
if (item->media() && !item->media()->ttlSeconds()) {
const auto ids = MTP_vector<MTPint>(1, MTP_int(item->id));
if (const auto channel = item->history()->peer->asChannel()) {
item->history()->session().api().request(MTPchannels_ReadMessageContents(
channel->inputChannel,
ids
)).send();
} else {
item->history()->session().api().request(MTPmessages_ReadMessageContents(
ids
)).done([=](const MTPmessages_AffectedMessages &result)
{
item->history()->session().api().applyAffectedMessages(
item->history()->peer,
result);
}).send();
}
item->markContentsRead();
}
},
&st::menuIconShowInChat);
item->history()->session().api().applyAffectedMessages(
item->history()->peer,
result);
}).send();
}
item->markContentsRead();
}
},
&st::menuIconShowInChat);
}
void AddBurnAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item) {
if (!item->media() || item->media()->ttlSeconds() <= 0 && item->unsupportedTTL() <= 0 || item->out() ||
!item->isUnreadMedia()) {
return;
}
menu->addAction(
tr::ayu_ExpireMediaContextMenuText(tr::now),
[=]()
{
const auto ids = MTP_vector<MTPint>(1, MTP_int(item->id));
const auto callback = [=]()
{
if (const auto window = Core::App().activeWindow()) {
if (const auto controller = window->sessionController()) {
controller->showToast(tr::lng_box_ok(tr::now));
}
}
};
if (const auto channel = item->history()->peer->asChannel()) {
item->history()->session().api().request(MTPchannels_ReadMessageContents(
channel->inputChannel,
ids
)).done([=]()
{
callback();
}).send();
} else {
item->history()->session().api().request(MTPmessages_ReadMessageContents(
ids
)).done([=](const MTPmessages_AffectedMessages &result)
{
item->history()->session().api().applyAffectedMessages(
item->history()->peer,
result);
callback();
}).send();
}
item->markContentsRead();
},
&st::menuIconTTLAny);
}
} // namespace AyuUi

View file

@ -30,5 +30,6 @@ void AddHideMessageAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item);
void AddUserMessagesAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item);
void AddMessageDetailsAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item);
void AddReadUntilAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item);
void AddBurnAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item);
}

View file

@ -2608,6 +2608,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
}
AyuUi::AddReadUntilAction(_menu, item);
AyuUi::AddBurnAction(_menu, item);
};
const auto addReplyAction = [&](HistoryItem *item) {

View file

@ -276,7 +276,7 @@ std::unique_ptr<Data::Media> HistoryItem::CreateMedia(
});
}, [&](const MTPDmessageMediaPhoto &media) -> Result {
const auto photo = media.vphoto();
if (media.vttl_seconds() && false) { // AyuGram: show expiring messages
if (false) { // AyuGram: show expiring messages
LOG(("App Error: "
"Unexpected MTPMessageMediaPhoto "
"with ttl_seconds in CreateMedia."));
@ -438,6 +438,7 @@ HistoryItem::HistoryItem(
createServiceFromMtp(data);
applyTTL(data);
} else {
auto skipSetText = false;
createComponents(data);
if (media) {
setMedia(*media);
@ -445,13 +446,25 @@ HistoryItem::HistoryItem(
media->match(
[&](const MTPDmessageMediaPhoto &media)
{
auto time = media.vttl_seconds()->v;
if (!data.is_media_unread()) {
createServiceFromMtp(data);
skipSetText = true;
}
const auto time = media.vttl_seconds()->v;
setAyuHint(formatTTL(time));
_unsupportedTTL = time;
},
[&](const MTPDmessageMediaDocument &media)
{
auto time = media.vttl_seconds()->v;
if (!data.is_media_unread()) {
createServiceFromMtp(data);
skipSetText = true;
}
const auto time = media.vttl_seconds()->v;
setAyuHint(formatTTL(time));
_unsupportedTTL = time;
},
[&](const MTPDmessageMediaWebPage &media)
{
@ -482,7 +495,9 @@ HistoryItem::HistoryItem(
&history->session(),
data.ventities().value_or_empty())
};
setText(_media ? textWithEntities : EnsureNonEmpty(textWithEntities));
if (!skipSetText) {
setText(_media ? textWithEntities : EnsureNonEmpty(textWithEntities));
}
if (const auto groupedId = data.vgrouped_id()) {
setGroupId(
MessageGroupId::FromRaw(

View file

@ -566,6 +566,10 @@ public:
[[nodiscard]] bool canUpdateDate() const;
void customEmojiRepaint();
[[nodiscard]] int unsupportedTTL() const {
return _unsupportedTTL;
}
[[nodiscard]] bool needsUpdateForVideoQualities(const MTPMessage &data);
[[nodiscard]] TimeId ttlDestroyAt() const {
@ -687,6 +691,7 @@ private:
crl::time _reactionsLastRefreshed = 0;
bool _deleted = false;
int _unsupportedTTL = 0;
TimeId _date = 0;
TimeId _ttlDestroyAt = 0;

View file

@ -1044,6 +1044,7 @@ void AddMessageActions(
if (request.item) {
AyuUi::AddReadUntilAction(menu, request.item);
AyuUi::AddBurnAction(menu, request.item);
}
}