Show message when trying to unquoted forward a quiz (#303)

Fixes #237
This commit is contained in:
blank X 2022-01-29 10:45:55 +00:00 committed by GitHub
parent 8da2234dbb
commit 6af09ec529
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 41 additions and 18 deletions

View file

@ -259,5 +259,6 @@
"ktg_settings_remember_compress_images": "Remember compress images", "ktg_settings_remember_compress_images": "Remember compress images",
"ktg_settings_compress_images_default": "Compress images by default", "ktg_settings_compress_images_default": "Compress images by default",
"ktg_pip_not_supported": "Sorry, Picture-in-Picture mode is not supported here.", "ktg_pip_not_supported": "Sorry, Picture-in-Picture mode is not supported here.",
"ktg_forward_quiz_unquoted": "Sorry, quizzes that are currently open and unvoted on cannot be forwarded unquoted.",
"dummy_last_string": "" "dummy_last_string": ""
} }

View file

@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/ */
#include "data/data_media_types.h" #include "data/data_media_types.h"
#include "kotato/kotato_lang.h"
#include "history/history.h" #include "history/history.h"
#include "history/history_item.h" #include "history/history_item.h"
#include "history/history_location_manager.h" #include "history/history_location_manager.h"
@ -411,7 +412,7 @@ bool Media::forceForwardedInfo() const {
return false; return false;
} }
QString Media::errorTextForForward(not_null<PeerData*> peer) const { QString Media::errorTextForForward(not_null<PeerData*> peer, bool unquoted) const {
return QString(); return QString();
} }
@ -603,7 +604,7 @@ bool MediaPhoto::allowsEditMedia() const {
return true; return true;
} }
QString MediaPhoto::errorTextForForward(not_null<PeerData*> peer) const { QString MediaPhoto::errorTextForForward(not_null<PeerData*> peer, bool unquoted) const {
return Data::RestrictionError( return Data::RestrictionError(
peer, peer,
ChatRestriction::SendMedia ChatRestriction::SendMedia
@ -911,7 +912,7 @@ bool MediaFile::dropForwardedInfo() const {
return _document->isSong(); return _document->isSong();
} }
QString MediaFile::errorTextForForward(not_null<PeerData*> peer) const { QString MediaFile::errorTextForForward(not_null<PeerData*> peer, bool unquoted) const {
if (const auto sticker = _document->sticker()) { if (const auto sticker = _document->sticker()) {
if (const auto error = Data::RestrictionError( if (const auto error = Data::RestrictionError(
peer, peer,
@ -1425,7 +1426,7 @@ TextForMimeData MediaGame::clipboardText() const {
return TextForMimeData(); return TextForMimeData();
} }
QString MediaGame::errorTextForForward(not_null<PeerData*> peer) const { QString MediaGame::errorTextForForward(not_null<PeerData*> peer, bool unquoted) const {
return Data::RestrictionError( return Data::RestrictionError(
peer, peer,
ChatRestriction::SendGames ChatRestriction::SendGames
@ -1573,10 +1574,13 @@ TextForMimeData MediaPoll::clipboardText() const {
return TextForMimeData::Simple(text); return TextForMimeData::Simple(text);
} }
QString MediaPoll::errorTextForForward(not_null<PeerData*> peer) const { QString MediaPoll::errorTextForForward(not_null<PeerData*> peer, bool unquoted) const {
if (_poll->publicVotes() && peer->isChannel() && !peer->isMegagroup()) { if (_poll->publicVotes() && peer->isChannel() && !peer->isMegagroup()) {
return tr::lng_restricted_send_public_polls(tr::now); return tr::lng_restricted_send_public_polls(tr::now);
} }
if (unquoted && _poll->quiz() && !_poll->voted() && !_poll->closed()) {
return ktr("ktg_forward_quiz_unquoted");
}
return Data::RestrictionError( return Data::RestrictionError(
peer, peer,
ChatRestriction::SendPolls ChatRestriction::SendPolls

View file

@ -112,7 +112,7 @@ public:
virtual bool forwardedBecomesUnread() const; virtual bool forwardedBecomesUnread() const;
virtual bool dropForwardedInfo() const; virtual bool dropForwardedInfo() const;
virtual bool forceForwardedInfo() const; virtual bool forceForwardedInfo() const;
virtual QString errorTextForForward(not_null<PeerData*> peer) const; virtual QString errorTextForForward(not_null<PeerData*> peer, bool unquoted = false) const;
[[nodiscard]] virtual bool consumeMessageText( [[nodiscard]] virtual bool consumeMessageText(
const TextWithEntities &text); const TextWithEntities &text);
@ -167,7 +167,7 @@ public:
TextForMimeData clipboardText() const override; TextForMimeData clipboardText() const override;
bool allowsEditCaption() const override; bool allowsEditCaption() const override;
bool allowsEditMedia() const override; bool allowsEditMedia() const override;
QString errorTextForForward(not_null<PeerData*> peer) const override; QString errorTextForForward(not_null<PeerData*> peer, bool unquoted = false) const override;
bool updateInlineResultMedia(const MTPMessageMedia &media) override; bool updateInlineResultMedia(const MTPMessageMedia &media) override;
bool updateSentMedia(const MTPMessageMedia &media) override; bool updateSentMedia(const MTPMessageMedia &media) override;
@ -207,7 +207,7 @@ public:
bool allowsEditMedia() const override; bool allowsEditMedia() const override;
bool forwardedBecomesUnread() const override; bool forwardedBecomesUnread() const override;
bool dropForwardedInfo() const override; bool dropForwardedInfo() const override;
QString errorTextForForward(not_null<PeerData*> peer) const override; QString errorTextForForward(not_null<PeerData*> peer, bool unquoted = false) const override;
bool updateInlineResultMedia(const MTPMessageMedia &media) override; bool updateInlineResultMedia(const MTPMessageMedia &media) override;
bool updateSentMedia(const MTPMessageMedia &media) override; bool updateSentMedia(const MTPMessageMedia &media) override;
@ -366,7 +366,7 @@ public:
QString notificationText() const override; QString notificationText() const override;
QString pinnedTextSubstring() const override; QString pinnedTextSubstring() const override;
TextForMimeData clipboardText() const override; TextForMimeData clipboardText() const override;
QString errorTextForForward(not_null<PeerData*> peer) const override; QString errorTextForForward(not_null<PeerData*> peer, bool unquoted = false) const override;
bool dropForwardedInfo() const override; bool dropForwardedInfo() const override;
bool consumeMessageText(const TextWithEntities &text) override; bool consumeMessageText(const TextWithEntities &text) override;
@ -428,7 +428,7 @@ public:
QString notificationText() const override; QString notificationText() const override;
QString pinnedTextSubstring() const override; QString pinnedTextSubstring() const override;
TextForMimeData clipboardText() const override; TextForMimeData clipboardText() const override;
QString errorTextForForward(not_null<PeerData*> peer) const override; QString errorTextForForward(not_null<PeerData*> peer, bool unquoted = false) const override;
bool updateInlineResultMedia(const MTPMessageMedia &media) override; bool updateInlineResultMedia(const MTPMessageMedia &media) override;
bool updateSentMedia(const MTPMessageMedia &media) override; bool updateSentMedia(const MTPMessageMedia &media) override;

View file

@ -127,14 +127,15 @@ QString GetErrorTextForSending(
not_null<PeerData*> peer, not_null<PeerData*> peer,
const HistoryItemsList &items, const HistoryItemsList &items,
const TextWithTags &comment, const TextWithTags &comment,
bool ignoreSlowmodeCountdown) { bool ignoreSlowmodeCountdown,
bool unquoted) {
if (!peer->canWrite()) { if (!peer->canWrite()) {
return tr::lng_forward_cant(tr::now); return tr::lng_forward_cant(tr::now);
} }
for (const auto &item : items) { for (const auto &item : items) {
if (const auto media = item->media()) { if (const auto media = item->media()) {
const auto error = media->errorTextForForward(peer); const auto error = media->errorTextForForward(peer, unquoted);
if (!error.isEmpty() && error != qstr("skip")) { if (!error.isEmpty() && error != qstr("skip")) {
return error; return error;
} }
@ -415,8 +416,9 @@ MTPMessageReplyHeader NewMessageReplyHeader(const Api::SendAction &action) {
QString GetErrorTextForSending( QString GetErrorTextForSending(
not_null<PeerData*> peer, not_null<PeerData*> peer,
const HistoryItemsList &items, const HistoryItemsList &items,
bool ignoreSlowmodeCountdown) { bool ignoreSlowmodeCountdown,
return GetErrorTextForSending(peer, items, {}, ignoreSlowmodeCountdown); bool unquoted) {
return GetErrorTextForSending(peer, items, {}, ignoreSlowmodeCountdown, unquoted);
} }
struct HistoryMessage::CreateConfig { struct HistoryMessage::CreateConfig {

View file

@ -43,12 +43,14 @@ void RequestDependentMessageData(
[[nodiscard]] QString GetErrorTextForSending( [[nodiscard]] QString GetErrorTextForSending(
not_null<PeerData*> peer, not_null<PeerData*> peer,
const HistoryItemsList &items, const HistoryItemsList &items,
bool ignoreSlowmodeCountdown = false); bool ignoreSlowmodeCountdown = false,
bool unquoted = false);
[[nodiscard]] QString GetErrorTextForSending( [[nodiscard]] QString GetErrorTextForSending(
not_null<PeerData*> peer, not_null<PeerData*> peer,
const HistoryItemsList &items, const HistoryItemsList &items,
const TextWithTags &comment, const TextWithTags &comment,
bool ignoreSlowmodeCountdown = false); bool ignoreSlowmodeCountdown = false,
bool unquoted = false);
void FastShareMessage(not_null<HistoryItem*> item); void FastShareMessage(not_null<HistoryItem*> item);
class HistoryMessage final : public HistoryItem { class HistoryMessage final : public HistoryItem {

View file

@ -5915,6 +5915,17 @@ void HistoryWidget::contextMenuEvent(QContextMenuEvent *e) {
int settingsKey) { int settingsKey) {
if (_history && _toForward.options != newOptions) { if (_history && _toForward.options != newOptions) {
_menu->addAction(ktr(langKey), [=] { _menu->addAction(ktr(langKey), [=] {
const auto error = GetErrorTextForSending(
_history->peer,
_toForward.items,
true,
newOptions != Options::PreserveInfo);
if (!error.isEmpty()) {
Ui::ShowMultilineToast({
.text = error
});
return;
}
_toForward.options = newOptions; _toForward.options = newOptions;
_history->setForwardDraft({ _history->setForwardDraft({
.ids = session().data().itemsToIds(_toForward.items), .ids = session().data().itemsToIds(_toForward.items),

View file

@ -489,7 +489,8 @@ bool MainWidget::setForwardDraft(PeerId peerId, Data::ForwardDraft &&draft) {
const auto error = GetErrorTextForSending( const auto error = GetErrorTextForSending(
peer, peer,
session().data().idsToItems(draft.ids), session().data().idsToItems(draft.ids),
true); true,
draft.options != Data::ForwardOptions::PreserveInfo);
if (!error.isEmpty()) { if (!error.isEmpty()) {
Ui::show(Box<Ui::InformBox>(error), Ui::LayerOption::KeepOther); Ui::show(Box<Ui::InformBox>(error), Ui::LayerOption::KeepOther);
return false; return false;

View file

@ -1249,7 +1249,9 @@ QPointer<Ui::RpWidget> ShowForwardMessagesBox(
const auto error = GetErrorTextForSending( const auto error = GetErrorTextForSending(
peer, peer,
items, items,
comment); comment,
false, /* ignoreSlowmodeCountdown */
newDraft.options != Data::ForwardOptions::PreserveInfo);
if (!error.isEmpty()) { if (!error.isEmpty()) {
return std::make_pair(error, peer); return std::make_pair(error, peer);
} }