mirror of https://github.com/procxx/kepka.git
Use Main::Session in entities parsing.
This commit is contained in:
parent
7a5f4e8a01
commit
bdbcd8e540
|
@ -93,6 +93,7 @@ void SendExistingMedia(
|
||||||
};
|
};
|
||||||
TextUtilities::Trim(caption);
|
TextUtilities::Trim(caption);
|
||||||
auto sentEntities = EntitiesToMTP(
|
auto sentEntities = EntitiesToMTP(
|
||||||
|
session,
|
||||||
caption.entities,
|
caption.entities,
|
||||||
ConvertOption::SkipLocal);
|
ConvertOption::SkipLocal);
|
||||||
if (!sentEntities.v.isEmpty()) {
|
if (!sentEntities.v.isEmpty()) {
|
||||||
|
|
|
@ -18,11 +18,13 @@ using namespace TextUtilities;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
EntitiesInText EntitiesFromMTP(const QVector<MTPMessageEntity> &entities) {
|
EntitiesInText EntitiesFromMTP(
|
||||||
|
Main::Session *session,
|
||||||
|
const QVector<MTPMessageEntity> &entities) {
|
||||||
auto result = EntitiesInText();
|
auto result = EntitiesInText();
|
||||||
if (!entities.isEmpty()) {
|
if (!entities.isEmpty()) {
|
||||||
result.reserve(entities.size());
|
result.reserve(entities.size());
|
||||||
for_const (auto &entity, entities) {
|
for (const auto &entity : entities) {
|
||||||
switch (entity.type()) {
|
switch (entity.type()) {
|
||||||
case mtpc_messageEntityUrl: { auto &d = entity.c_messageEntityUrl(); result.push_back({ EntityType::Url, d.voffset().v, d.vlength().v }); } break;
|
case mtpc_messageEntityUrl: { auto &d = entity.c_messageEntityUrl(); result.push_back({ EntityType::Url, d.voffset().v, d.vlength().v }); } break;
|
||||||
case mtpc_messageEntityTextUrl: { auto &d = entity.c_messageEntityTextUrl(); result.push_back({ EntityType::CustomUrl, d.voffset().v, d.vlength().v, Clean(qs(d.vurl())) }); } break;
|
case mtpc_messageEntityTextUrl: { auto &d = entity.c_messageEntityTextUrl(); result.push_back({ EntityType::CustomUrl, d.voffset().v, d.vlength().v, Clean(qs(d.vurl())) }); } break;
|
||||||
|
@ -32,28 +34,30 @@ EntitiesInText EntitiesFromMTP(const QVector<MTPMessageEntity> &entities) {
|
||||||
case mtpc_messageEntityPhone: break; // Skipping phones.
|
case mtpc_messageEntityPhone: break; // Skipping phones.
|
||||||
case mtpc_messageEntityMention: { auto &d = entity.c_messageEntityMention(); result.push_back({ EntityType::Mention, d.voffset().v, d.vlength().v }); } break;
|
case mtpc_messageEntityMention: { auto &d = entity.c_messageEntityMention(); result.push_back({ EntityType::Mention, d.voffset().v, d.vlength().v }); } break;
|
||||||
case mtpc_messageEntityMentionName: {
|
case mtpc_messageEntityMentionName: {
|
||||||
auto &d = entity.c_messageEntityMentionName();
|
const auto &d = entity.c_messageEntityMentionName();
|
||||||
auto data = [&d] {
|
const auto data = [&] {
|
||||||
if (auto user = Auth().data().userLoaded(d.vuser_id().v)) {
|
if (session) {
|
||||||
return MentionNameDataFromFields({
|
if (const auto user = session->data().userLoaded(d.vuser_id().v)) {
|
||||||
d.vuser_id().v,
|
return MentionNameDataFromFields({
|
||||||
user->accessHash() });
|
d.vuser_id().v,
|
||||||
|
user->accessHash() });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return MentionNameDataFromFields(d.vuser_id().v);
|
return MentionNameDataFromFields(d.vuser_id().v);
|
||||||
};
|
}();
|
||||||
result.push_back({ EntityType::MentionName, d.voffset().v, d.vlength().v, data() });
|
result.push_back({ EntityType::MentionName, d.voffset().v, d.vlength().v, data });
|
||||||
} break;
|
} break;
|
||||||
case mtpc_inputMessageEntityMentionName: {
|
case mtpc_inputMessageEntityMentionName: {
|
||||||
auto &d = entity.c_inputMessageEntityMentionName();
|
const auto &d = entity.c_inputMessageEntityMentionName();
|
||||||
auto data = ([&d]() -> QString {
|
const auto data = [&] {
|
||||||
if (d.vuser_id().type() == mtpc_inputUserSelf) {
|
if (session && d.vuser_id().type() == mtpc_inputUserSelf) {
|
||||||
return MentionNameDataFromFields(Auth().userId());
|
return MentionNameDataFromFields(session->userId());
|
||||||
} else if (d.vuser_id().type() == mtpc_inputUser) {
|
} else if (d.vuser_id().type() == mtpc_inputUser) {
|
||||||
auto &user = d.vuser_id().c_inputUser();
|
auto &user = d.vuser_id().c_inputUser();
|
||||||
return MentionNameDataFromFields({ user.vuser_id().v, user.vaccess_hash().v });
|
return MentionNameDataFromFields({ user.vuser_id().v, user.vaccess_hash().v });
|
||||||
}
|
}
|
||||||
return QString();
|
return QString();
|
||||||
})();
|
}();
|
||||||
if (!data.isEmpty()) {
|
if (!data.isEmpty()) {
|
||||||
result.push_back({ EntityType::MentionName, d.voffset().v, d.vlength().v, data });
|
result.push_back({ EntityType::MentionName, d.voffset().v, d.vlength().v, data });
|
||||||
}
|
}
|
||||||
|
@ -74,11 +78,12 @@ EntitiesInText EntitiesFromMTP(const QVector<MTPMessageEntity> &entities) {
|
||||||
}
|
}
|
||||||
|
|
||||||
MTPVector<MTPMessageEntity> EntitiesToMTP(
|
MTPVector<MTPMessageEntity> EntitiesToMTP(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
const EntitiesInText &entities,
|
const EntitiesInText &entities,
|
||||||
ConvertOption option) {
|
ConvertOption option) {
|
||||||
auto v = QVector<MTPMessageEntity>();
|
auto v = QVector<MTPMessageEntity>();
|
||||||
v.reserve(entities.size());
|
v.reserve(entities.size());
|
||||||
for_const (auto &entity, entities) {
|
for (const auto &entity : entities) {
|
||||||
if (entity.length() <= 0) continue;
|
if (entity.length() <= 0) continue;
|
||||||
if (option == ConvertOption::SkipLocal
|
if (option == ConvertOption::SkipLocal
|
||||||
&& entity.type() != EntityType::Bold
|
&& entity.type() != EntityType::Bold
|
||||||
|
@ -103,15 +108,15 @@ MTPVector<MTPMessageEntity> EntitiesToMTP(
|
||||||
case EntityType::Cashtag: v.push_back(MTP_messageEntityCashtag(offset, length)); break;
|
case EntityType::Cashtag: v.push_back(MTP_messageEntityCashtag(offset, length)); break;
|
||||||
case EntityType::Mention: v.push_back(MTP_messageEntityMention(offset, length)); break;
|
case EntityType::Mention: v.push_back(MTP_messageEntityMention(offset, length)); break;
|
||||||
case EntityType::MentionName: {
|
case EntityType::MentionName: {
|
||||||
auto inputUser = ([](const QString &data) -> MTPInputUser {
|
auto inputUser = [&](const QString &data) -> MTPInputUser {
|
||||||
auto fields = MentionNameDataToFields(data);
|
auto fields = MentionNameDataToFields(data);
|
||||||
if (fields.userId == Auth().userId()) {
|
if (session && fields.userId == session->userId()) {
|
||||||
return MTP_inputUserSelf();
|
return MTP_inputUserSelf();
|
||||||
} else if (fields.userId) {
|
} else if (fields.userId) {
|
||||||
return MTP_inputUser(MTP_int(fields.userId), MTP_long(fields.accessHash));
|
return MTP_inputUser(MTP_int(fields.userId), MTP_long(fields.accessHash));
|
||||||
}
|
}
|
||||||
return MTP_inputUserEmpty();
|
return MTP_inputUserEmpty();
|
||||||
})(entity.data());
|
}(entity.data());
|
||||||
if (inputUser.type() != mtpc_inputUserEmpty) {
|
if (inputUser.type() != mtpc_inputUserEmpty) {
|
||||||
v.push_back(MTP_inputMessageEntityMentionName(offset, length, inputUser));
|
v.push_back(MTP_inputMessageEntityMentionName(offset, length, inputUser));
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,14 +9,23 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
#include "ui/text/text_entity.h"
|
#include "ui/text/text_entity.h"
|
||||||
|
|
||||||
|
namespace Main {
|
||||||
|
class Session;
|
||||||
|
} // namespace Main
|
||||||
|
|
||||||
namespace Api {
|
namespace Api {
|
||||||
|
|
||||||
EntitiesInText EntitiesFromMTP(const QVector<MTPMessageEntity> &entities);
|
|
||||||
enum class ConvertOption {
|
enum class ConvertOption {
|
||||||
WithLocal,
|
WithLocal,
|
||||||
SkipLocal,
|
SkipLocal,
|
||||||
};
|
};
|
||||||
MTPVector<MTPMessageEntity> EntitiesToMTP(
|
|
||||||
|
[[nodiscard]] EntitiesInText EntitiesFromMTP(
|
||||||
|
Main::Session *session,
|
||||||
|
const QVector<MTPMessageEntity> &entities);
|
||||||
|
|
||||||
|
[[nodiscard]] MTPVector<MTPMessageEntity> EntitiesToMTP(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
const EntitiesInText &entities,
|
const EntitiesInText &entities,
|
||||||
ConvertOption option = ConvertOption::WithLocal);
|
ConvertOption option = ConvertOption::WithLocal);
|
||||||
|
|
||||||
|
|
|
@ -411,7 +411,7 @@ void ApiWrap::requestTermsUpdate() {
|
||||||
const auto &terms = data.vterms_of_service();
|
const auto &terms = data.vterms_of_service();
|
||||||
const auto &fields = terms.c_help_termsOfService();
|
const auto &fields = terms.c_help_termsOfService();
|
||||||
Core::App().lockByTerms(
|
Core::App().lockByTerms(
|
||||||
Window::TermsLock::FromMTP(fields));
|
Window::TermsLock::FromMTP(&session(), fields));
|
||||||
requestNext(data);
|
requestNext(data);
|
||||||
} break;
|
} break;
|
||||||
default: Unexpected("Type in requestTermsUpdate().");
|
default: Unexpected("Type in requestTermsUpdate().");
|
||||||
|
@ -2442,6 +2442,7 @@ void ApiWrap::saveDraftsToCloud() {
|
||||||
flags |= MTPmessages_SaveDraft::Flag::f_entities;
|
flags |= MTPmessages_SaveDraft::Flag::f_entities;
|
||||||
}
|
}
|
||||||
auto entities = Api::EntitiesToMTP(
|
auto entities = Api::EntitiesToMTP(
|
||||||
|
&session(),
|
||||||
TextUtilities::ConvertTextTagsToEntities(textWithTags.tags),
|
TextUtilities::ConvertTextTagsToEntities(textWithTags.tags),
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
|
|
||||||
|
@ -4674,6 +4675,7 @@ void ApiWrap::editUploadedFile(
|
||||||
}
|
}
|
||||||
|
|
||||||
auto sentEntities = Api::EntitiesToMTP(
|
auto sentEntities = Api::EntitiesToMTP(
|
||||||
|
&session(),
|
||||||
item->originalText().entities,
|
item->originalText().entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
|
|
||||||
|
@ -4826,8 +4828,11 @@ void ApiWrap::sendMessage(MessageToSend &&message) {
|
||||||
if (silentPost) {
|
if (silentPost) {
|
||||||
sendFlags |= MTPmessages_SendMessage::Flag::f_silent;
|
sendFlags |= MTPmessages_SendMessage::Flag::f_silent;
|
||||||
}
|
}
|
||||||
auto localEntities = Api::EntitiesToMTP(sending.entities);
|
auto localEntities = Api::EntitiesToMTP(
|
||||||
|
&session(),
|
||||||
|
sending.entities);
|
||||||
auto sentEntities = Api::EntitiesToMTP(
|
auto sentEntities = Api::EntitiesToMTP(
|
||||||
|
&session(),
|
||||||
sending.entities,
|
sending.entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
if (!sentEntities.v.isEmpty()) {
|
if (!sentEntities.v.isEmpty()) {
|
||||||
|
@ -5118,6 +5123,7 @@ void ApiWrap::sendMediaWithRandomId(
|
||||||
auto caption = item->originalText();
|
auto caption = item->originalText();
|
||||||
TextUtilities::Trim(caption);
|
TextUtilities::Trim(caption);
|
||||||
auto sentEntities = Api::EntitiesToMTP(
|
auto sentEntities = Api::EntitiesToMTP(
|
||||||
|
&session(),
|
||||||
caption.entities,
|
caption.entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
|
|
||||||
|
@ -5794,6 +5800,7 @@ void ApiWrap::rescheduleMessage(
|
||||||
Api::SendOptions options) {
|
Api::SendOptions options) {
|
||||||
const auto text = item->originalText().text;
|
const auto text = item->originalText().text;
|
||||||
const auto sentEntities = Api::EntitiesToMTP(
|
const auto sentEntities = Api::EntitiesToMTP(
|
||||||
|
&session(),
|
||||||
item->originalText().entities,
|
item->originalText().entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
const auto media = item->media();
|
const auto media = item->media();
|
||||||
|
|
|
@ -934,6 +934,7 @@ void EditCaptionBox::save() {
|
||||||
TextUtilities::Trim(sending);
|
TextUtilities::Trim(sending);
|
||||||
|
|
||||||
const auto sentEntities = Api::EntitiesToMTP(
|
const auto sentEntities = Api::EntitiesToMTP(
|
||||||
|
&item->history()->session(),
|
||||||
sending.entities,
|
sending.entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
if (!sentEntities.v.isEmpty()) {
|
if (!sentEntities.v.isEmpty()) {
|
||||||
|
|
|
@ -383,7 +383,9 @@ bool HandleUnknown(
|
||||||
const auto callback = [=](const MTPDhelp_deepLinkInfo &result) {
|
const auto callback = [=](const MTPDhelp_deepLinkInfo &result) {
|
||||||
const auto text = TextWithEntities{
|
const auto text = TextWithEntities{
|
||||||
qs(result.vmessage()),
|
qs(result.vmessage()),
|
||||||
Api::EntitiesFromMTP(result.ventities().value_or_empty())
|
Api::EntitiesFromMTP(
|
||||||
|
session,
|
||||||
|
result.ventities().value_or_empty())
|
||||||
};
|
};
|
||||||
if (result.is_update_app()) {
|
if (result.is_update_app()) {
|
||||||
const auto box = std::make_shared<QPointer<Ui::BoxContent>>();
|
const auto box = std::make_shared<QPointer<Ui::BoxContent>>();
|
||||||
|
|
|
@ -45,14 +45,19 @@ Draft::Draft(
|
||||||
, previewCancelled(previewCancelled) {
|
, previewCancelled(previewCancelled) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void applyPeerCloudDraft(PeerId peerId, const MTPDdraftMessage &draft) {
|
void ApplyPeerCloudDraft(
|
||||||
const auto history = Auth().data().history(peerId);
|
not_null<Main::Session*> session,
|
||||||
|
PeerId peerId,
|
||||||
|
const MTPDdraftMessage &draft) {
|
||||||
|
const auto history = session->data().history(peerId);
|
||||||
const auto textWithTags = TextWithTags {
|
const auto textWithTags = TextWithTags {
|
||||||
qs(draft.vmessage()),
|
qs(draft.vmessage()),
|
||||||
TextUtilities::ConvertEntitiesToTextTags(
|
TextUtilities::ConvertEntitiesToTextTags(
|
||||||
Api::EntitiesFromMTP(draft.ventities().value_or_empty()))
|
Api::EntitiesFromMTP(
|
||||||
|
session,
|
||||||
|
draft.ventities().value_or_empty()))
|
||||||
};
|
};
|
||||||
auto replyTo = draft.vreply_to_msg_id().value_or_empty();
|
const auto replyTo = draft.vreply_to_msg_id().value_or_empty();
|
||||||
if (history->skipCloudDraft(textWithTags.text, replyTo, draft.vdate().v)) {
|
if (history->skipCloudDraft(textWithTags.text, replyTo, draft.vdate().v)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -67,8 +72,11 @@ void applyPeerCloudDraft(PeerId peerId, const MTPDdraftMessage &draft) {
|
||||||
history->applyCloudDraft();
|
history->applyCloudDraft();
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearPeerCloudDraft(PeerId peerId, TimeId date) {
|
void ClearPeerCloudDraft(
|
||||||
const auto history = Auth().data().history(peerId);
|
not_null<Main::Session*> session,
|
||||||
|
PeerId peerId,
|
||||||
|
TimeId date) {
|
||||||
|
const auto history = session->data().history(peerId);
|
||||||
if (history->skipCloudDraft(QString(), MsgId(0), date)) {
|
if (history->skipCloudDraft(QString(), MsgId(0), date)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,20 @@ namespace Ui {
|
||||||
class InputField;
|
class InputField;
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
||||||
|
namespace Main {
|
||||||
|
class Session;
|
||||||
|
} // namespace Main
|
||||||
|
|
||||||
namespace Data {
|
namespace Data {
|
||||||
|
|
||||||
void applyPeerCloudDraft(PeerId peerId, const MTPDdraftMessage &draft);
|
void ApplyPeerCloudDraft(
|
||||||
void clearPeerCloudDraft(PeerId peerId, TimeId date);
|
not_null<Main::Session*> session,
|
||||||
|
PeerId peerId,
|
||||||
|
const MTPDdraftMessage &draft);
|
||||||
|
void ClearPeerCloudDraft(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
|
PeerId peerId,
|
||||||
|
TimeId date);
|
||||||
|
|
||||||
struct Draft {
|
struct Draft {
|
||||||
Draft() = default;
|
Draft() = default;
|
||||||
|
|
|
@ -45,6 +45,14 @@ PollData::PollData(not_null<Data::Session*> owner, PollId id)
|
||||||
, _owner(owner) {
|
, _owner(owner) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Data::Session &PollData::owner() const {
|
||||||
|
return *_owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
Main::Session &PollData::session() const {
|
||||||
|
return _owner->session();
|
||||||
|
}
|
||||||
|
|
||||||
bool PollData::closeByTimer() {
|
bool PollData::closeByTimer() {
|
||||||
if (closed()) {
|
if (closed()) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -151,6 +159,7 @@ bool PollData::applyResults(const MTPPollResults &results) {
|
||||||
auto newSolution = TextWithEntities{
|
auto newSolution = TextWithEntities{
|
||||||
results.vsolution().value_or_empty(),
|
results.vsolution().value_or_empty(),
|
||||||
Api::EntitiesFromMTP(
|
Api::EntitiesFromMTP(
|
||||||
|
&_owner->session(),
|
||||||
results.vsolution_entities().value_or_empty())
|
results.vsolution_entities().value_or_empty())
|
||||||
};
|
};
|
||||||
if (solution != newSolution) {
|
if (solution != newSolution) {
|
||||||
|
@ -293,6 +302,7 @@ MTPInputMedia PollDataToInputMedia(
|
||||||
TextUtilities::PrepareForSending(solution, prepareFlags);
|
TextUtilities::PrepareForSending(solution, prepareFlags);
|
||||||
TextUtilities::Trim(solution);
|
TextUtilities::Trim(solution);
|
||||||
const auto sentEntities = Api::EntitiesToMTP(
|
const auto sentEntities = Api::EntitiesToMTP(
|
||||||
|
&poll->session(),
|
||||||
solution.entities,
|
solution.entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
if (!solution.text.isEmpty()) {
|
if (!solution.text.isEmpty()) {
|
||||||
|
|
|
@ -11,6 +11,10 @@ namespace Data {
|
||||||
class Session;
|
class Session;
|
||||||
} // namespace Data
|
} // namespace Data
|
||||||
|
|
||||||
|
namespace Main {
|
||||||
|
class Session;
|
||||||
|
} // namespace Main
|
||||||
|
|
||||||
struct PollAnswer {
|
struct PollAnswer {
|
||||||
QString text;
|
QString text;
|
||||||
QByteArray option;
|
QByteArray option;
|
||||||
|
@ -31,6 +35,9 @@ inline bool operator!=(const PollAnswer &a, const PollAnswer &b) {
|
||||||
struct PollData {
|
struct PollData {
|
||||||
PollData(not_null<Data::Session*> owner, PollId id);
|
PollData(not_null<Data::Session*> owner, PollId id);
|
||||||
|
|
||||||
|
[[nodiscard]] Data::Session &owner() const;
|
||||||
|
[[nodiscard]] Main::Session &session() const;
|
||||||
|
|
||||||
enum class Flag {
|
enum class Flag {
|
||||||
Closed = 0x01,
|
Closed = 0x01,
|
||||||
PublicVotes = 0x02,
|
PublicVotes = 0x02,
|
||||||
|
|
|
@ -152,7 +152,7 @@ void ScheduledMessages::sendNowSimpleMessage(
|
||||||
// we know for sure that a message can't have fields such as the author,
|
// we know for sure that a message can't have fields such as the author,
|
||||||
// views count, etc.
|
// views count, etc.
|
||||||
|
|
||||||
const auto &history = local->history();
|
const auto history = local->history();
|
||||||
auto flags = NewMessageFlags(history->peer)
|
auto flags = NewMessageFlags(history->peer)
|
||||||
| MTPDmessage::Flag::f_entities
|
| MTPDmessage::Flag::f_entities
|
||||||
| MTPDmessage::Flag::f_from_id
|
| MTPDmessage::Flag::f_from_id
|
||||||
|
@ -175,7 +175,9 @@ void ScheduledMessages::sendNowSimpleMessage(
|
||||||
MTP_string(local->originalText().text),
|
MTP_string(local->originalText().text),
|
||||||
MTP_messageMediaEmpty(),
|
MTP_messageMediaEmpty(),
|
||||||
MTPReplyMarkup(),
|
MTPReplyMarkup(),
|
||||||
Api::EntitiesToMTP(local->originalText().entities),
|
Api::EntitiesToMTP(
|
||||||
|
&history->session(),
|
||||||
|
local->originalText().entities),
|
||||||
MTP_int(1),
|
MTP_int(1),
|
||||||
MTPint(),
|
MTPint(),
|
||||||
MTP_string(),
|
MTP_string(),
|
||||||
|
@ -234,7 +236,7 @@ void ScheduledMessages::checkEntitiesAndUpdate(const MTPDmessage &data) {
|
||||||
Assert(existing->date() == kScheduledUntilOnlineTimestamp);
|
Assert(existing->date() == kScheduledUntilOnlineTimestamp);
|
||||||
existing->updateSentContent({
|
existing->updateSentContent({
|
||||||
qs(data.vmessage()),
|
qs(data.vmessage()),
|
||||||
Api::EntitiesFromMTP(data.ventities().value_or_empty())
|
Api::EntitiesFromMTP(_session, data.ventities().value_or_empty())
|
||||||
}, data.vmedia());
|
}, data.vmedia());
|
||||||
existing->updateReplyMarkup(data.vreply_markup());
|
existing->updateReplyMarkup(data.vreply_markup());
|
||||||
existing->updateForwardedInfo(data.vfwd_from());
|
existing->updateForwardedInfo(data.vfwd_from());
|
||||||
|
@ -410,7 +412,9 @@ HistoryItem *ScheduledMessages::append(
|
||||||
message.match([&](const MTPDmessage &data) {
|
message.match([&](const MTPDmessage &data) {
|
||||||
existing->updateSentContent({
|
existing->updateSentContent({
|
||||||
qs(data.vmessage()),
|
qs(data.vmessage()),
|
||||||
Api::EntitiesFromMTP(data.ventities().value_or_empty())
|
Api::EntitiesFromMTP(
|
||||||
|
_session,
|
||||||
|
data.ventities().value_or_empty())
|
||||||
}, data.vmedia());
|
}, data.vmedia());
|
||||||
existing->updateReplyMarkup(data.vreply_markup());
|
existing->updateReplyMarkup(data.vreply_markup());
|
||||||
existing->updateForwardedInfo(data.vfwd_from());
|
existing->updateForwardedInfo(data.vfwd_from());
|
||||||
|
|
|
@ -1703,7 +1703,9 @@ bool Session::checkEntitiesAndViewsUpdate(const MTPDmessage &data) {
|
||||||
if (const auto existing = message(peerToChannel(peer), data.vid().v)) {
|
if (const auto existing = message(peerToChannel(peer), data.vid().v)) {
|
||||||
existing->updateSentContent({
|
existing->updateSentContent({
|
||||||
qs(data.vmessage()),
|
qs(data.vmessage()),
|
||||||
Api::EntitiesFromMTP(data.ventities().value_or_empty())
|
Api::EntitiesFromMTP(
|
||||||
|
&session(),
|
||||||
|
data.ventities().value_or_empty())
|
||||||
}, data.vmedia());
|
}, data.vmedia());
|
||||||
existing->updateReplyMarkup(data.vreply_markup());
|
existing->updateReplyMarkup(data.vreply_markup());
|
||||||
existing->updateForwardedInfo(data.vfwd_from());
|
existing->updateForwardedInfo(data.vfwd_from());
|
||||||
|
@ -3725,7 +3727,7 @@ void Session::insertCheckedServiceNotification(
|
||||||
MTP_string(sending.text),
|
MTP_string(sending.text),
|
||||||
media,
|
media,
|
||||||
MTPReplyMarkup(),
|
MTPReplyMarkup(),
|
||||||
Api::EntitiesToMTP(sending.entities),
|
Api::EntitiesToMTP(&session(), sending.entities),
|
||||||
MTPint(),
|
MTPint(),
|
||||||
MTPint(),
|
MTPint(),
|
||||||
MTPstring(),
|
MTPstring(),
|
||||||
|
|
|
@ -111,14 +111,16 @@ bool MediaCanHaveCaption(const MTPMessage &message) {
|
||||||
return (mediaType == mtpc_messageMediaDocument || mediaType == mtpc_messageMediaPhoto);
|
return (mediaType == mtpc_messageMediaDocument || mediaType == mtpc_messageMediaPhoto);
|
||||||
}
|
}
|
||||||
|
|
||||||
TextWithEntities ExtractEditedText(const MTPMessage &message) {
|
TextWithEntities ExtractEditedText(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
|
const MTPMessage &message) {
|
||||||
if (message.type() != mtpc_message) {
|
if (message.type() != mtpc_message) {
|
||||||
return TextWithEntities();
|
return TextWithEntities();
|
||||||
}
|
}
|
||||||
const auto &data = message.c_message();
|
const auto &data = message.c_message();
|
||||||
return {
|
return {
|
||||||
TextUtilities::Clean(qs(data.vmessage())),
|
TextUtilities::Clean(qs(data.vmessage())),
|
||||||
Api::EntitiesFromMTP(data.ventities().value_or_empty())
|
Api::EntitiesFromMTP(session, data.ventities().value_or_empty())
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,19 +378,20 @@ void GenerateItems(
|
||||||
Fn<void(OwnedItem item)> callback) {
|
Fn<void(OwnedItem item)> callback) {
|
||||||
Expects(history->peer->isChannel());
|
Expects(history->peer->isChannel());
|
||||||
|
|
||||||
auto id = event.vid().v;
|
const auto session = &history->session();
|
||||||
auto from = Auth().data().user(event.vuser_id().v);
|
const auto id = event.vid().v;
|
||||||
auto channel = history->peer->asChannel();
|
const auto from = Auth().data().user(event.vuser_id().v);
|
||||||
auto &action = event.vaction();
|
const auto channel = history->peer->asChannel();
|
||||||
auto date = event.vdate().v;
|
const auto &action = event.vaction();
|
||||||
auto addPart = [&](not_null<HistoryItem*> item) {
|
const auto date = event.vdate().v;
|
||||||
|
const auto addPart = [&](not_null<HistoryItem*> item) {
|
||||||
return callback(OwnedItem(delegate, item));
|
return callback(OwnedItem(delegate, item));
|
||||||
};
|
};
|
||||||
|
|
||||||
using Flag = MTPDmessage::Flag;
|
using Flag = MTPDmessage::Flag;
|
||||||
auto fromName = from->name;
|
const auto fromName = from->name;
|
||||||
auto fromLink = from->createOpenLink();
|
const auto fromLink = from->createOpenLink();
|
||||||
auto fromLinkText = textcmdLink(1, fromName);
|
const auto fromLinkText = textcmdLink(1, fromName);
|
||||||
|
|
||||||
auto addSimpleServiceMessage = [&](const QString &text, PhotoData *photo = nullptr) {
|
auto addSimpleServiceMessage = [&](const QString &text, PhotoData *photo = nullptr) {
|
||||||
auto message = HistoryService::PreparedText { text };
|
auto message = HistoryService::PreparedText { text };
|
||||||
|
@ -542,7 +545,7 @@ void GenerateItems(
|
||||||
};
|
};
|
||||||
|
|
||||||
auto createEditMessage = [&](const MTPDchannelAdminLogEventActionEditMessage &action) {
|
auto createEditMessage = [&](const MTPDchannelAdminLogEventActionEditMessage &action) {
|
||||||
auto newValue = ExtractEditedText(action.vnew_message());
|
auto newValue = ExtractEditedText(session, action.vnew_message());
|
||||||
auto canHaveCaption = MediaCanHaveCaption(action.vnew_message());
|
auto canHaveCaption = MediaCanHaveCaption(action.vnew_message());
|
||||||
auto text = (!canHaveCaption
|
auto text = (!canHaveCaption
|
||||||
? tr::lng_admin_log_edited_message
|
? tr::lng_admin_log_edited_message
|
||||||
|
@ -554,7 +557,7 @@ void GenerateItems(
|
||||||
fromLinkText);
|
fromLinkText);
|
||||||
addSimpleServiceMessage(text);
|
addSimpleServiceMessage(text);
|
||||||
|
|
||||||
auto oldValue = ExtractEditedText(action.vprev_message());
|
auto oldValue = ExtractEditedText(session, action.vprev_message());
|
||||||
auto detachExistingItem = false;
|
auto detachExistingItem = false;
|
||||||
auto body = history->createItem(
|
auto body = history->createItem(
|
||||||
PrepareLogMessage(
|
PrepareLogMessage(
|
||||||
|
|
|
@ -2700,7 +2700,10 @@ void History::applyDialog(
|
||||||
|
|
||||||
const auto draft = data.vdraft();
|
const auto draft = data.vdraft();
|
||||||
if (draft && draft->type() == mtpc_draftMessage) {
|
if (draft && draft->type() == mtpc_draftMessage) {
|
||||||
Data::applyPeerCloudDraft(peer->id, draft->c_draftMessage());
|
Data::ApplyPeerCloudDraft(
|
||||||
|
&session(),
|
||||||
|
peer->id,
|
||||||
|
draft->c_draftMessage());
|
||||||
}
|
}
|
||||||
owner().histories().dialogEntryApplied(this);
|
owner().histories().dialogEntryApplied(this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -458,7 +458,9 @@ HistoryMessage::HistoryMessage(
|
||||||
}
|
}
|
||||||
const auto textWithEntities = TextWithEntities{
|
const auto textWithEntities = TextWithEntities{
|
||||||
TextUtilities::Clean(qs(data.vmessage())),
|
TextUtilities::Clean(qs(data.vmessage())),
|
||||||
Api::EntitiesFromMTP(data.ventities().value_or_empty())
|
Api::EntitiesFromMTP(
|
||||||
|
&history->session(),
|
||||||
|
data.ventities().value_or_empty())
|
||||||
};
|
};
|
||||||
setText(_media ? textWithEntities : EnsureNonEmpty(textWithEntities));
|
setText(_media ? textWithEntities : EnsureNonEmpty(textWithEntities));
|
||||||
if (const auto groupedId = data.vgrouped_id()) {
|
if (const auto groupedId = data.vgrouped_id()) {
|
||||||
|
@ -1072,7 +1074,9 @@ void HistoryMessage::applyEdition(const MTPDmessage &message) {
|
||||||
|
|
||||||
const auto textWithEntities = TextWithEntities{
|
const auto textWithEntities = TextWithEntities{
|
||||||
qs(message.vmessage()),
|
qs(message.vmessage()),
|
||||||
Api::EntitiesFromMTP(message.ventities().value_or_empty())
|
Api::EntitiesFromMTP(
|
||||||
|
&history()->session(),
|
||||||
|
message.ventities().value_or_empty())
|
||||||
};
|
};
|
||||||
setReplyMarkup(message.vreply_markup());
|
setReplyMarkup(message.vreply_markup());
|
||||||
if (!isLocalUpdateMedia()) {
|
if (!isLocalUpdateMedia()) {
|
||||||
|
|
|
@ -2984,8 +2984,9 @@ void HistoryWidget::saveEditMsg() {
|
||||||
if (webPageId == CancelledWebPageId) {
|
if (webPageId == CancelledWebPageId) {
|
||||||
sendFlags |= MTPmessages_EditMessage::Flag::f_no_webpage;
|
sendFlags |= MTPmessages_EditMessage::Flag::f_no_webpage;
|
||||||
}
|
}
|
||||||
auto localEntities = Api::EntitiesToMTP(sending.entities);
|
auto localEntities = Api::EntitiesToMTP(&session(), sending.entities);
|
||||||
auto sentEntities = Api::EntitiesToMTP(
|
auto sentEntities = Api::EntitiesToMTP(
|
||||||
|
&session(),
|
||||||
sending.entities,
|
sending.entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
if (!sentEntities.v.isEmpty()) {
|
if (!sentEntities.v.isEmpty()) {
|
||||||
|
@ -4660,7 +4661,7 @@ void HistoryWidget::sendFileConfirmed(
|
||||||
session().user()).flags;
|
session().user()).flags;
|
||||||
TextUtilities::PrepareForSending(caption, prepareFlags);
|
TextUtilities::PrepareForSending(caption, prepareFlags);
|
||||||
TextUtilities::Trim(caption);
|
TextUtilities::Trim(caption);
|
||||||
auto localEntities = Api::EntitiesToMTP(caption.entities);
|
auto localEntities = Api::EntitiesToMTP(&session(), caption.entities);
|
||||||
|
|
||||||
if (itemToEdit) {
|
if (itemToEdit) {
|
||||||
if (const auto id = itemToEdit->groupId()) {
|
if (const auto id = itemToEdit->groupId()) {
|
||||||
|
|
|
@ -175,24 +175,28 @@ std::unique_ptr<Result> Result::Create(
|
||||||
const auto &r = message->c_botInlineMessageMediaAuto();
|
const auto &r = message->c_botInlineMessageMediaAuto();
|
||||||
const auto message = qs(r.vmessage());
|
const auto message = qs(r.vmessage());
|
||||||
const auto entities = Api::EntitiesFromMTP(
|
const auto entities = Api::EntitiesFromMTP(
|
||||||
|
session,
|
||||||
r.ventities().value_or_empty());
|
r.ventities().value_or_empty());
|
||||||
if (result->_type == Type::Photo) {
|
if (result->_type == Type::Photo) {
|
||||||
if (!result->_photo) {
|
if (!result->_photo) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
result->sendData = std::make_unique<internal::SendPhoto>(
|
result->sendData = std::make_unique<internal::SendPhoto>(
|
||||||
|
session,
|
||||||
result->_photo,
|
result->_photo,
|
||||||
message,
|
message,
|
||||||
entities);
|
entities);
|
||||||
} else if (result->_type == Type::Game) {
|
} else if (result->_type == Type::Game) {
|
||||||
result->createGame();
|
result->createGame();
|
||||||
result->sendData = std::make_unique<internal::SendGame>(
|
result->sendData = std::make_unique<internal::SendGame>(
|
||||||
|
session,
|
||||||
result->_game);
|
result->_game);
|
||||||
} else {
|
} else {
|
||||||
if (!result->_document) {
|
if (!result->_document) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
result->sendData = std::make_unique<internal::SendFile>(
|
result->sendData = std::make_unique<internal::SendFile>(
|
||||||
|
session,
|
||||||
result->_document,
|
result->_document,
|
||||||
message,
|
message,
|
||||||
entities);
|
entities);
|
||||||
|
@ -205,8 +209,9 @@ std::unique_ptr<Result> Result::Create(
|
||||||
case mtpc_botInlineMessageText: {
|
case mtpc_botInlineMessageText: {
|
||||||
const auto &r = message->c_botInlineMessageText();
|
const auto &r = message->c_botInlineMessageText();
|
||||||
result->sendData = std::make_unique<internal::SendText>(
|
result->sendData = std::make_unique<internal::SendText>(
|
||||||
|
session,
|
||||||
qs(r.vmessage()),
|
qs(r.vmessage()),
|
||||||
Api::EntitiesFromMTP(r.ventities().value_or_empty()),
|
Api::EntitiesFromMTP(session, r.ventities().value_or_empty()),
|
||||||
r.is_no_webpage());
|
r.is_no_webpage());
|
||||||
if (result->_type == Type::Photo) {
|
if (result->_type == Type::Photo) {
|
||||||
if (!result->_photo) {
|
if (!result->_photo) {
|
||||||
|
@ -230,7 +235,9 @@ std::unique_ptr<Result> Result::Create(
|
||||||
// #TODO layer 72 save period and send live location?..
|
// #TODO layer 72 save period and send live location?..
|
||||||
auto &r = message->c_botInlineMessageMediaGeo();
|
auto &r = message->c_botInlineMessageMediaGeo();
|
||||||
if (r.vgeo().type() == mtpc_geoPoint) {
|
if (r.vgeo().type() == mtpc_geoPoint) {
|
||||||
result->sendData = std::make_unique<internal::SendGeo>(r.vgeo().c_geoPoint());
|
result->sendData = std::make_unique<internal::SendGeo>(
|
||||||
|
session,
|
||||||
|
r.vgeo().c_geoPoint());
|
||||||
} else {
|
} else {
|
||||||
badAttachment = true;
|
badAttachment = true;
|
||||||
}
|
}
|
||||||
|
@ -242,7 +249,13 @@ std::unique_ptr<Result> Result::Create(
|
||||||
case mtpc_botInlineMessageMediaVenue: {
|
case mtpc_botInlineMessageMediaVenue: {
|
||||||
auto &r = message->c_botInlineMessageMediaVenue();
|
auto &r = message->c_botInlineMessageMediaVenue();
|
||||||
if (r.vgeo().type() == mtpc_geoPoint) {
|
if (r.vgeo().type() == mtpc_geoPoint) {
|
||||||
result->sendData = std::make_unique<internal::SendVenue>(r.vgeo().c_geoPoint(), qs(r.vvenue_id()), qs(r.vprovider()), qs(r.vtitle()), qs(r.vaddress()));
|
result->sendData = std::make_unique<internal::SendVenue>(
|
||||||
|
session,
|
||||||
|
r.vgeo().c_geoPoint(),
|
||||||
|
qs(r.vvenue_id()),
|
||||||
|
qs(r.vprovider()),
|
||||||
|
qs(r.vtitle()),
|
||||||
|
qs(r.vaddress()));
|
||||||
} else {
|
} else {
|
||||||
badAttachment = true;
|
badAttachment = true;
|
||||||
}
|
}
|
||||||
|
@ -253,7 +266,11 @@ std::unique_ptr<Result> Result::Create(
|
||||||
|
|
||||||
case mtpc_botInlineMessageMediaContact: {
|
case mtpc_botInlineMessageMediaContact: {
|
||||||
auto &r = message->c_botInlineMessageMediaContact();
|
auto &r = message->c_botInlineMessageMediaContact();
|
||||||
result->sendData = std::make_unique<internal::SendContact>(qs(r.vfirst_name()), qs(r.vlast_name()), qs(r.vphone_number()));
|
result->sendData = std::make_unique<internal::SendContact>(
|
||||||
|
session,
|
||||||
|
qs(r.vfirst_name()),
|
||||||
|
qs(r.vlast_name()),
|
||||||
|
qs(r.vphone_number()));
|
||||||
if (const auto markup = r.vreply_markup()) {
|
if (const auto markup = r.vreply_markup()) {
|
||||||
result->_mtpKeyboard = std::make_unique<MTPReplyMarkup>(*markup);
|
result->_mtpKeyboard = std::make_unique<MTPReplyMarkup>(*markup);
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,7 @@ QString SendDataCommon::getErrorOnSend(
|
||||||
SendDataCommon::SentMTPMessageFields SendText::getSentMessageFields() const {
|
SendDataCommon::SentMTPMessageFields SendText::getSentMessageFields() const {
|
||||||
SentMTPMessageFields result;
|
SentMTPMessageFields result;
|
||||||
result.text = MTP_string(_message);
|
result.text = MTP_string(_message);
|
||||||
result.entities = Api::EntitiesToMTP(_entities);
|
result.entities = Api::EntitiesToMTP(&session(), _entities);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
#include "history/history_location_manager.h"
|
#include "history/history_location_manager.h"
|
||||||
|
|
||||||
|
namespace Main {
|
||||||
|
class Session;
|
||||||
|
} // namespace Main
|
||||||
|
|
||||||
class History;
|
class History;
|
||||||
|
|
||||||
namespace InlineBots {
|
namespace InlineBots {
|
||||||
|
@ -22,11 +26,16 @@ namespace internal {
|
||||||
// For each type of message that can be sent there will be a subclass.
|
// For each type of message that can be sent there will be a subclass.
|
||||||
class SendData {
|
class SendData {
|
||||||
public:
|
public:
|
||||||
SendData() = default;
|
explicit SendData(not_null<Main::Session*> session) : _session(session) {
|
||||||
|
}
|
||||||
SendData(const SendData &other) = delete;
|
SendData(const SendData &other) = delete;
|
||||||
SendData &operator=(const SendData &other) = delete;
|
SendData &operator=(const SendData &other) = delete;
|
||||||
virtual ~SendData() = default;
|
virtual ~SendData() = default;
|
||||||
|
|
||||||
|
[[nodiscard]] Main::Session &session() const {
|
||||||
|
return *_session;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool isValid() const = 0;
|
virtual bool isValid() const = 0;
|
||||||
|
|
||||||
virtual void addToHistory(
|
virtual void addToHistory(
|
||||||
|
@ -54,6 +63,9 @@ public:
|
||||||
virtual QString getLayoutTitle(const Result *owner) const;
|
virtual QString getLayoutTitle(const Result *owner) const;
|
||||||
virtual QString getLayoutDescription(const Result *owner) const;
|
virtual QString getLayoutDescription(const Result *owner) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
not_null<Main::Session*> _session;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// This class implements addHistory() for most of the types hiding
|
// This class implements addHistory() for most of the types hiding
|
||||||
|
@ -61,6 +73,8 @@ public:
|
||||||
// Only SendFile and SendPhoto work by their own.
|
// Only SendFile and SendPhoto work by their own.
|
||||||
class SendDataCommon : public SendData {
|
class SendDataCommon : public SendData {
|
||||||
public:
|
public:
|
||||||
|
using SendData::SendData;
|
||||||
|
|
||||||
struct SentMTPMessageFields {
|
struct SentMTPMessageFields {
|
||||||
MTPString text = MTP_string();
|
MTPString text = MTP_string();
|
||||||
MTPVector<MTPMessageEntity> entities = MTP_vector<MTPMessageEntity>();
|
MTPVector<MTPMessageEntity> entities = MTP_vector<MTPMessageEntity>();
|
||||||
|
@ -91,10 +105,12 @@ public:
|
||||||
class SendText : public SendDataCommon {
|
class SendText : public SendDataCommon {
|
||||||
public:
|
public:
|
||||||
SendText(
|
SendText(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
const QString &message,
|
const QString &message,
|
||||||
const EntitiesInText &entities,
|
const EntitiesInText &entities,
|
||||||
bool/* noWebPage*/)
|
bool/* noWebPage*/)
|
||||||
: _message(message)
|
: SendDataCommon(session)
|
||||||
|
, _message(message)
|
||||||
, _entities(entities) {
|
, _entities(entities) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +129,11 @@ private:
|
||||||
// Message with geo location point media.
|
// Message with geo location point media.
|
||||||
class SendGeo : public SendDataCommon {
|
class SendGeo : public SendDataCommon {
|
||||||
public:
|
public:
|
||||||
explicit SendGeo(const MTPDgeoPoint &point) : _location(point) {
|
SendGeo(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
|
const MTPDgeoPoint &point)
|
||||||
|
: SendDataCommon(session)
|
||||||
|
, _location(point) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid() const override {
|
bool isValid() const override {
|
||||||
|
@ -137,13 +157,19 @@ private:
|
||||||
// Message with venue media.
|
// Message with venue media.
|
||||||
class SendVenue : public SendDataCommon {
|
class SendVenue : public SendDataCommon {
|
||||||
public:
|
public:
|
||||||
SendVenue(const MTPDgeoPoint &point, const QString &venueId,
|
SendVenue(
|
||||||
const QString &provider, const QString &title, const QString &address)
|
not_null<Main::Session*> session,
|
||||||
: _location(point)
|
const MTPDgeoPoint &point,
|
||||||
, _venueId(venueId)
|
const QString &venueId,
|
||||||
, _provider(provider)
|
const QString &provider,
|
||||||
, _title(title)
|
const QString &title,
|
||||||
, _address(address) {
|
const QString &address)
|
||||||
|
: SendDataCommon(session)
|
||||||
|
, _location(point)
|
||||||
|
, _venueId(venueId)
|
||||||
|
, _provider(provider)
|
||||||
|
, _title(title)
|
||||||
|
, _address(address) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid() const override {
|
bool isValid() const override {
|
||||||
|
@ -168,10 +194,15 @@ private:
|
||||||
// Message with shared contact media.
|
// Message with shared contact media.
|
||||||
class SendContact : public SendDataCommon {
|
class SendContact : public SendDataCommon {
|
||||||
public:
|
public:
|
||||||
SendContact(const QString &firstName, const QString &lastName, const QString &phoneNumber)
|
SendContact(
|
||||||
: _firstName(firstName)
|
not_null<Main::Session*> session,
|
||||||
, _lastName(lastName)
|
const QString &firstName,
|
||||||
, _phoneNumber(phoneNumber) {
|
const QString &lastName,
|
||||||
|
const QString &phoneNumber)
|
||||||
|
: SendDataCommon(session)
|
||||||
|
, _firstName(firstName)
|
||||||
|
, _lastName(lastName)
|
||||||
|
, _phoneNumber(phoneNumber) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid() const override {
|
bool isValid() const override {
|
||||||
|
@ -191,10 +222,12 @@ private:
|
||||||
class SendPhoto : public SendData {
|
class SendPhoto : public SendData {
|
||||||
public:
|
public:
|
||||||
SendPhoto(
|
SendPhoto(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
PhotoData *photo,
|
PhotoData *photo,
|
||||||
const QString &message,
|
const QString &message,
|
||||||
const EntitiesInText &entities)
|
const EntitiesInText &entities)
|
||||||
: _photo(photo)
|
: SendData(session)
|
||||||
|
, _photo(photo)
|
||||||
, _message(message)
|
, _message(message)
|
||||||
, _entities(entities) {
|
, _entities(entities) {
|
||||||
}
|
}
|
||||||
|
@ -231,10 +264,12 @@ private:
|
||||||
class SendFile : public SendData {
|
class SendFile : public SendData {
|
||||||
public:
|
public:
|
||||||
SendFile(
|
SendFile(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
DocumentData *document,
|
DocumentData *document,
|
||||||
const QString &message,
|
const QString &message,
|
||||||
const EntitiesInText &entities)
|
const EntitiesInText &entities)
|
||||||
: _document(document)
|
: SendData(session)
|
||||||
|
, _document(document)
|
||||||
, _message(message)
|
, _message(message)
|
||||||
, _entities(entities) {
|
, _entities(entities) {
|
||||||
}
|
}
|
||||||
|
@ -270,8 +305,9 @@ private:
|
||||||
// Message with game.
|
// Message with game.
|
||||||
class SendGame : public SendData {
|
class SendGame : public SendData {
|
||||||
public:
|
public:
|
||||||
SendGame(GameData *game)
|
SendGame(not_null<Main::Session*> session, GameData *game)
|
||||||
: _game(game) {
|
: SendData(session)
|
||||||
|
, _game(game) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid() const override {
|
bool isValid() const override {
|
||||||
|
|
|
@ -248,7 +248,9 @@ void CodeWidget::codeSubmitDone(const MTPauth_Authorization &result) {
|
||||||
}, [&](const MTPDauth_authorizationSignUpRequired &data) {
|
}, [&](const MTPDauth_authorizationSignUpRequired &data) {
|
||||||
if (const auto terms = data.vterms_of_service()) {
|
if (const auto terms = data.vterms_of_service()) {
|
||||||
terms->match([&](const MTPDhelp_termsOfService &data) {
|
terms->match([&](const MTPDhelp_termsOfService &data) {
|
||||||
getData()->termsLock = Window::TermsLock::FromMTP(data);
|
getData()->termsLock = Window::TermsLock::FromMTP(
|
||||||
|
nullptr,
|
||||||
|
data);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
getData()->termsLock = Window::TermsLock();
|
getData()->termsLock = Window::TermsLock();
|
||||||
|
|
|
@ -146,7 +146,7 @@ void Widget::handleUpdate(const MTPUpdate &update) {
|
||||||
}, [&](const MTPDupdateServiceNotification &data) {
|
}, [&](const MTPDupdateServiceNotification &data) {
|
||||||
const auto text = TextWithEntities{
|
const auto text = TextWithEntities{
|
||||||
qs(data.vmessage()),
|
qs(data.vmessage()),
|
||||||
Api::EntitiesFromMTP(data.ventities().v)
|
Api::EntitiesFromMTP(nullptr, data.ventities().v)
|
||||||
};
|
};
|
||||||
Ui::show(Box<InformBox>(text));
|
Ui::show(Box<InformBox>(text));
|
||||||
}, [](const auto &) {});
|
}, [](const auto &) {});
|
||||||
|
|
|
@ -3788,7 +3788,7 @@ void MainWidget::feedUpdates(const MTPUpdates &updates, uint64 randomId) {
|
||||||
}
|
}
|
||||||
item->updateSentContent({
|
item->updateSentContent({
|
||||||
sent.text,
|
sent.text,
|
||||||
Api::EntitiesFromMTP(list.value_or_empty())
|
Api::EntitiesFromMTP(&session(), list.value_or_empty())
|
||||||
}, d.vmedia());
|
}, d.vmedia());
|
||||||
item->contributeToSlowmode(d.vdate().v);
|
item->contributeToSlowmode(d.vdate().v);
|
||||||
if (!wasAlready) {
|
if (!wasAlready) {
|
||||||
|
@ -4297,7 +4297,7 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
||||||
const auto &d = update.c_updateServiceNotification();
|
const auto &d = update.c_updateServiceNotification();
|
||||||
const auto text = TextWithEntities {
|
const auto text = TextWithEntities {
|
||||||
qs(d.vmessage()),
|
qs(d.vmessage()),
|
||||||
Api::EntitiesFromMTP(d.ventities().v)
|
Api::EntitiesFromMTP(&session(), d.ventities().v)
|
||||||
};
|
};
|
||||||
if (IsForceLogoutNotification(d)) {
|
if (IsForceLogoutNotification(d)) {
|
||||||
Core::App().forceLogOut(text);
|
Core::App().forceLogOut(text);
|
||||||
|
@ -4571,9 +4571,10 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
||||||
const auto &data = update.c_updateDraftMessage();
|
const auto &data = update.c_updateDraftMessage();
|
||||||
const auto peerId = peerFromMTP(data.vpeer());
|
const auto peerId = peerFromMTP(data.vpeer());
|
||||||
data.vdraft().match([&](const MTPDdraftMessage &data) {
|
data.vdraft().match([&](const MTPDdraftMessage &data) {
|
||||||
Data::applyPeerCloudDraft(peerId, data);
|
Data::ApplyPeerCloudDraft(&session(), peerId, data);
|
||||||
}, [&](const MTPDdraftMessageEmpty &data) {
|
}, [&](const MTPDdraftMessageEmpty &data) {
|
||||||
Data::clearPeerCloudDraft(
|
Data::ClearPeerCloudDraft(
|
||||||
|
&session(),
|
||||||
peerId,
|
peerId,
|
||||||
data.vdate().value_or_empty());
|
data.vdate().value_or_empty());
|
||||||
});
|
});
|
||||||
|
|
|
@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "media/clip/media_clip_reader.h"
|
#include "media/clip/media_clip_reader.h"
|
||||||
#include "mtproto/facade.h"
|
#include "mtproto/facade.h"
|
||||||
#include "lottie/lottie_animation.h"
|
#include "lottie/lottie_animation.h"
|
||||||
|
#include "history/history.h"
|
||||||
#include "history/history_item.h"
|
#include "history/history_item.h"
|
||||||
#include "boxes/send_files_box.h"
|
#include "boxes/send_files_box.h"
|
||||||
#include "boxes/confirm_box.h"
|
#include "boxes/confirm_box.h"
|
||||||
|
@ -129,6 +130,7 @@ MTPInputSingleMedia PrepareAlbumItemMedia(
|
||||||
auto caption = item->originalText();
|
auto caption = item->originalText();
|
||||||
TextUtilities::Trim(caption);
|
TextUtilities::Trim(caption);
|
||||||
auto sentEntities = Api::EntitiesToMTP(
|
auto sentEntities = Api::EntitiesToMTP(
|
||||||
|
&item->history()->session(),
|
||||||
caption.entities,
|
caption.entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
const auto flags = !sentEntities.v.isEmpty()
|
const auto flags = !sentEntities.v.isEmpty()
|
||||||
|
|
|
@ -453,7 +453,7 @@ void Helper::applyInfo(
|
||||||
info.date = data.vdate().v;
|
info.date = data.vdate().v;
|
||||||
info.text = TextWithEntities{
|
info.text = TextWithEntities{
|
||||||
qs(data.vmessage()),
|
qs(data.vmessage()),
|
||||||
Api::EntitiesFromMTP(data.ventities().v) };
|
Api::EntitiesFromMTP(&user->session(), data.ventities().v) };
|
||||||
if (info.text.empty()) {
|
if (info.text.empty()) {
|
||||||
remove();
|
remove();
|
||||||
} else if (_userInformation[user] != info) {
|
} else if (_userInformation[user] != info) {
|
||||||
|
@ -544,6 +544,7 @@ void Helper::saveInfo(
|
||||||
TextUtilities::Trim(text);
|
TextUtilities::Trim(text);
|
||||||
|
|
||||||
const auto entities = Api::EntitiesToMTP(
|
const auto entities = Api::EntitiesToMTP(
|
||||||
|
&user->session(),
|
||||||
text.entities,
|
text.entities,
|
||||||
Api::ConvertOption::SkipLocal);
|
Api::ConvertOption::SkipLocal);
|
||||||
_userInfoSaving[user].requestId = _api.request(MTPhelp_EditUserInfo(
|
_userInfoSaving[user].requestId = _api.request(MTPhelp_EditUserInfo(
|
||||||
|
|
|
@ -185,13 +185,15 @@ void PasscodeLockWidget::setInnerFocus() {
|
||||||
_passcode->setFocusFast();
|
_passcode->setFocusFast();
|
||||||
}
|
}
|
||||||
|
|
||||||
TermsLock TermsLock::FromMTP(const MTPDhelp_termsOfService &data) {
|
TermsLock TermsLock::FromMTP(
|
||||||
|
Main::Session *session,
|
||||||
|
const MTPDhelp_termsOfService &data) {
|
||||||
const auto minAge = data.vmin_age_confirm();
|
const auto minAge = data.vmin_age_confirm();
|
||||||
return {
|
return {
|
||||||
bytes::make_vector(data.vid().c_dataJSON().vdata().v),
|
bytes::make_vector(data.vid().c_dataJSON().vdata().v),
|
||||||
TextWithEntities {
|
TextWithEntities {
|
||||||
TextUtilities::Clean(qs(data.vtext())),
|
TextUtilities::Clean(qs(data.vtext())),
|
||||||
Api::EntitiesFromMTP(data.ventities().v) },
|
Api::EntitiesFromMTP(session, data.ventities().v) },
|
||||||
(minAge ? std::make_optional(minAge->v) : std::nullopt),
|
(minAge ? std::make_optional(minAge->v) : std::nullopt),
|
||||||
data.is_popup()
|
data.is_popup()
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,6 +19,10 @@ class RoundButton;
|
||||||
class CheckView;
|
class CheckView;
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
||||||
|
namespace Main {
|
||||||
|
class Session;
|
||||||
|
} // namespace Main
|
||||||
|
|
||||||
namespace Window {
|
namespace Window {
|
||||||
|
|
||||||
class Controller;
|
class Controller;
|
||||||
|
@ -83,7 +87,9 @@ struct TermsLock {
|
||||||
return !(*this == other);
|
return !(*this == other);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TermsLock FromMTP(const MTPDhelp_termsOfService &data);
|
static TermsLock FromMTP(
|
||||||
|
Main::Session *session,
|
||||||
|
const MTPDhelp_termsOfService &data);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue