Files
AyuGramDesktop/Telegram/SourceFiles/lang/translate_provider.cpp
T

122 lines
3.2 KiB
C++

/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "lang/translate_provider.h"
#include "api/api_text_entities.h"
#include "data/data_msg_id.h"
#include "data/data_peer.h"
#include "data/data_session.h"
#include "history/history_item.h"
#include "main/main_session.h"
#include "mtproto/sender.h"
namespace Ui {
namespace {
enum class TranslateProviderKind {
MTProtoServer,
};
[[nodiscard]] TranslateProviderKind CurrentTranslateProviderKind() {
return TranslateProviderKind::MTProtoServer;
}
class MTProtoTranslateProvider final : public TranslateProvider {
public:
explicit MTProtoTranslateProvider(not_null<Main::Session*> session)
: _api(&session->mtp()) {
}
[[nodiscard]] bool supportsMessageId() const override {
return true;
}
void request(
TranslateProviderRequest request,
LanguageId to,
Fn<void(std::optional<TextWithEntities>)> done) override {
using Flag = MTPmessages_TranslateText::Flag;
const auto flags = request.msgId
? (Flag::f_peer | Flag::f_id)
: !request.text.text.isEmpty()
? Flag::f_text
: Flag(0);
if (!flags) {
done(std::nullopt);
return;
}
const auto callback = std::make_shared<
Fn<void(std::optional<TextWithEntities>)>>(std::move(done));
_api.request(MTPmessages_TranslateText(
MTP_flags(flags),
request.msgId ? request.peer->input() : MTP_inputPeerEmpty(),
(request.msgId
? MTP_vector<MTPint>(1, MTP_int(request.msgId))
: MTPVector<MTPint>()),
(request.msgId
? MTPVector<MTPTextWithEntities>()
: MTP_vector<MTPTextWithEntities>(1, MTP_textWithEntities(
MTP_string(request.text.text),
Api::EntitiesToMTP(
&request.peer->session(),
request.text.entities,
Api::ConvertOption::SkipLocal)))),
MTP_string(to.twoLetterCode())
)).done([=](const MTPmessages_TranslatedText &result) {
const auto &data = result.data();
const auto &list = data.vresult().v;
(*callback)(list.isEmpty()
? std::optional<TextWithEntities>()
: std::optional<TextWithEntities>(Api::ParseTextWithEntities(
&request.peer->session(),
list.front())));
}).fail([=](const MTP::Error &) {
(*callback)(std::nullopt);
}).send();
}
private:
MTP::Sender _api;
};
} // namespace
std::unique_ptr<TranslateProvider> CreateTranslateProvider(
not_null<Main::Session*> session) {
switch (CurrentTranslateProviderKind()) {
case TranslateProviderKind::MTProtoServer:
return std::make_unique<MTProtoTranslateProvider>(session);
}
return std::make_unique<MTProtoTranslateProvider>(session);
}
TranslateProviderRequest PrepareTranslateProviderRequest(
not_null<TranslateProvider*> provider,
not_null<PeerData*> peer,
MsgId msgId,
TextWithEntities text) {
auto result = TranslateProviderRequest{
.peer = peer,
.msgId = IsServerMsgId(msgId) ? msgId : MsgId(),
.text = std::move(text),
};
if (provider->supportsMessageId()) {
return result;
}
if (result.msgId) {
if (const auto item = peer->owner().message(peer, result.msgId)) {
result.text = item->originalText();
}
result.msgId = 0;
}
return result;
}
} // namespace Ui