/* 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 "api/api_transcribes.h" #include "history/history_item.h" #include "history/history.h" #include "main/main_session.h" #include "data/data_session.h" #include "data/data_peer.h" #include "apiwrap.h" namespace Api { Transcribes::Transcribes(not_null api) : _session(&api->session()) , _api(&api->instance()) { } void Transcribes::toggle(not_null item) { const auto id = item->fullId(); auto i = _map.find(id); if (i == _map.end()) { load(item); //_session->data().requestItemRepaint(item); _session->data().requestItemResize(item); } else if (!i->second.requestId) { i->second.shown = !i->second.shown; _session->data().requestItemResize(item); } } const Transcribes::Entry &Transcribes::entry( not_null item) const { static auto empty = Entry(); const auto i = _map.find(item->fullId()); return (i != _map.end()) ? i->second : empty; } void Transcribes::apply(const MTPDupdateTranscribedAudio &update) { const auto id = update.vtranscription_id().v; const auto i = _ids.find(id); if (i == _ids.end()) { return; } const auto j = _map.find(i->second); if (j == _map.end()) { return; } const auto text = qs(update.vtext()); j->second.result = text; j->second.pending = update.is_pending(); if (const auto item = _session->data().message(i->second)) { _session->data().requestItemResize(item); } } void Transcribes::load(not_null item) { if (!item->isHistoryEntry() || item->isLocal()) { return; } const auto id = item->fullId(); const auto requestId = _api.request(MTPmessages_TranscribeAudio( item->history()->peer->input, MTP_int(item->id) )).done([=](const MTPmessages_TranscribedAudio &result) { result.match([&](const MTPDmessages_transcribedAudio &data) { auto &entry = _map[id]; entry.requestId = 0; entry.pending = data.is_pending(); entry.result = qs(data.vtext()); _ids.emplace(data.vtranscription_id().v, id); if (const auto item = _session->data().message(id)) { _session->data().requestItemResize(item); } }); }).fail([=](const MTP::Error &error) { auto &entry = _map[id]; entry.requestId = 0; entry.pending = false; entry.failed = true; if (error.type() == qstr("MSG_VOICE_TOO_LONG")) { entry.toolong = true; } else if (const auto item = _session->data().message(id)) { _session->data().requestItemResize(item); } }).send(); auto &entry = _map.emplace(id).first->second; entry.requestId = requestId; entry.shown = true; entry.failed = false; entry.pending = false; } } // namespace Api