mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2026-07-25 06:54:43 +00:00
122 lines
3.2 KiB
C++
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
|