Skip to content

Commit 5f930cc

Browse files
committed
Added initial ability to rate voice transcriptions.
1 parent 7defad5 commit 5f930cc

14 files changed

+394
-2
lines changed

Telegram/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,8 @@ PRIVATE
12801280
menu/menu_antispam_validator.h
12811281
menu/menu_item_download_files.cpp
12821282
menu/menu_item_download_files.h
1283+
menu/menu_item_rate_transcribe_session.cpp
1284+
menu/menu_item_rate_transcribe_session.h
12831285
menu/menu_mute.cpp
12841286
menu/menu_mute.h
12851287
menu/menu_send.cpp

Telegram/Resources/langs/lang.strings

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4310,6 +4310,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
43104310
"lng_context_remove_from_group" = "Remove from group";
43114311
"lng_context_add_to_group" = "Add to group";
43124312

4313+
"lng_context_rate_transcription" = "Rate transcription";
4314+
"lng_toast_sent_rate_transcription" = "Thank you for your feedback!";
4315+
43134316
"lng_context_copy_link" = "Copy Link";
43144317
"lng_context_copy_message_link" = "Copy Message Link";
43154318
"lng_context_copy_post_link" = "Copy Post Link";

Telegram/SourceFiles/api/api_transcribes.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ For license and copyright information please follow this link:
1717
#include "history/history_item_helpers.h"
1818
#include "main/main_app_config.h"
1919
#include "main/main_session.h"
20+
#include "main/main_session_settings.h"
2021

2122
namespace Api {
2223

@@ -25,6 +26,32 @@ Transcribes::Transcribes(not_null<ApiWrap*> api)
2526
, _api(&api->instance()) {
2627
}
2728

29+
bool Transcribes::isRated(not_null<HistoryItem*> item) const {
30+
const auto fullId = item->fullId();
31+
for (const auto &[transcribeId, id] : _ids) {
32+
if (id == fullId) {
33+
return _session->settings().isTranscriptionRated(transcribeId);
34+
}
35+
}
36+
return false;
37+
}
38+
39+
void Transcribes::rate(not_null<HistoryItem*> item, bool isGood) {
40+
const auto fullId = item->fullId();
41+
for (const auto &[transcribeId, id] : _ids) {
42+
if (id == fullId) {
43+
_api.request(MTPmessages_RateTranscribedAudio(
44+
item->history()->peer->input,
45+
MTP_int(item->id),
46+
MTP_long(transcribeId),
47+
MTP_bool(isGood))).send();
48+
_session->settings().markTranscriptionAsRated(transcribeId);
49+
_session->saveSettings();
50+
return;
51+
}
52+
}
53+
}
54+
2855
bool Transcribes::freeFor(not_null<HistoryItem*> item) const {
2956
if (const auto channel = item->history()->peer->asMegagroup()) {
3057
const auto owner = &channel->owner();

Telegram/SourceFiles/api/api_transcribes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class Transcribes final {
3737
void apply(const MTPDupdateTranscribedAudio &update);
3838

3939
[[nodiscard]] bool freeFor(not_null<HistoryItem*> item) const;
40+
[[nodiscard]] bool isRated(not_null<HistoryItem*> item) const;
41+
void rate(not_null<HistoryItem*> item, bool isGood);
4042

4143
[[nodiscard]] bool trialsSupport();
4244
[[nodiscard]] TimeId trialsRefreshAt();

Telegram/SourceFiles/chat_helpers/chat_helpers.style

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,4 +1626,17 @@ frozenInfoBox: Box(defaultBox) {
16261626
shadowIgnoreTopSkip: true;
16271627
}
16281628

1629+
menuTranscribeItemPadding: margins(0px, 10px, 0px, 10px);
1630+
menuTranscribeDummyButton: IconButton(defaultIconButton) {
1631+
width: 40px;
1632+
height: 40px;
1633+
1634+
icon: icon {{ "chat/input_attach", historyComposeIconFgOver }};
1635+
iconOver: icon {{ "chat/input_attach", historyComposeIconFgOver }};
1636+
1637+
rippleAreaPosition: point(3px, 3px);
1638+
rippleAreaSize: 34px;
1639+
ripple: defaultRippleAnimationBgOver;
1640+
}
1641+
16291642
roundVideoFont: font(14px semibold);

Telegram/SourceFiles/history/history_inner_widget.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ For license and copyright information please follow this link:
7373
#include "main/main_session_settings.h"
7474
#include "mainwidget.h"
7575
#include "menu/menu_item_download_files.h"
76+
#include "menu/menu_item_rate_transcribe.h"
77+
#include "menu/menu_item_rate_transcribe_session.h"
7678
#include "menu/menu_sponsored.h"
7779
#include "core/application.h"
7880
#include "apiwrap.h"
@@ -2500,6 +2502,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
25002502
}, &st::menuIconStickers);
25012503
}
25022504
};
2505+
auto rateTranscriptionItem = (HistoryItem*)(nullptr);
25032506
const auto addDocumentActions = [&](not_null<DocumentData*> document, HistoryItem *item) {
25042507
if (document->loading()) {
25052508
_menu->addAction(tr::lng_context_cancel_download(tr::now), [=] {
@@ -2559,6 +2562,11 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
25592562
document);
25602563
}, &st::menuIconStickers);
25612564
}
2565+
if (item
2566+
&& (lnkIsVoice || document->isVideoMessage())
2567+
&& Menu::HasRateTranscribeItem(item)) {
2568+
rateTranscriptionItem = item;
2569+
}
25622570
};
25632571

25642572
#ifdef _DEBUG // Sometimes we need to save emoji to files.
@@ -2972,6 +2980,12 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
29722980
&st::menuIconGiftPremium);
29732981
}
29742982
}
2983+
} else if (!rateTranscriptionItem && media->document()) {
2984+
if ((media->document()->isVoiceMessage()
2985+
|| media->document()->isVideoMessage())
2986+
&& Menu::HasRateTranscribeItem(item)) {
2987+
rateTranscriptionItem = item;
2988+
}
29752989
}
29762990
}
29772991
if (!item->isService() && view && actionText.isEmpty()) {
@@ -3139,6 +3153,13 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
31393153
_controller);
31403154
}
31413155

3156+
if (!_menu->empty() && rateTranscriptionItem) {
3157+
_menu->insertAction(0, base::make_unique_q<Menu::RateTranscribe>(
3158+
_menu,
3159+
_menu->st().menu,
3160+
Menu::RateTranscribeCallbackFactory(rateTranscriptionItem)));
3161+
}
3162+
31423163
if (_menu->empty()) {
31433164
_menu = nullptr;
31443165
return;

Telegram/SourceFiles/history/view/history_view_context_menu.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ For license and copyright information please follow this link:
4444
#include "ui/boxes/report_box_graphics.h"
4545
#include "ui/ui_utility.h"
4646
#include "menu/menu_item_download_files.h"
47+
#include "menu/menu_item_rate_transcribe.h"
48+
#include "menu/menu_item_rate_transcribe_session.h"
4749
#include "menu/menu_send.h"
4850
#include "ui/boxes/confirm_box.h"
4951
#include "ui/boxes/show_or_premium_box.h"
@@ -338,6 +340,16 @@ void AddDocumentActions(
338340
const auto controller = list->controller();
339341
AddSaveSoundForNotifications(menu, item, document, controller);
340342
}
343+
if ((document->isVoiceMessage()
344+
|| document->isVideoMessage())
345+
&& Menu::HasRateTranscribeItem(item)) {
346+
if (!menu->empty()) {
347+
menu->insertAction(0, base::make_unique_q<Menu::RateTranscribe>(
348+
menu,
349+
menu->st().menu,
350+
Menu::RateTranscribeCallbackFactory(item)));
351+
}
352+
}
341353
AddSaveDocumentAction(menu, item, document, list);
342354
AddCopyFilename(
343355
menu,

Telegram/SourceFiles/main/main_session_settings.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ QByteArray SessionSettings::serialize() const {
5454
+ (_ringtoneVolumes.size()
5555
* (0
5656
+ sizeof(quint64) * 3 // ThreadId
57-
+ sizeof(ushort))); // Volume
57+
+ sizeof(ushort))) // Volume
58+
+ sizeof(qint32) // _ratedTranscriptions size
59+
+ (_ratedTranscriptions.size() * sizeof(quint64));
5860

5961
auto result = QByteArray();
6062
result.reserve(size);
@@ -122,6 +124,10 @@ QByteArray SessionSettings::serialize() const {
122124
<< SerializePeerId(key.monoforumPeerId)
123125
<< ushort(value);
124126
}
127+
stream << qint32(_ratedTranscriptions.size());
128+
for (const auto &transcriptionId : _ratedTranscriptions) {
129+
stream << quint64(transcriptionId);
130+
}
125131
}
126132

127133
Ensures(result.size() == size);
@@ -191,6 +197,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
191197
qint32 lastNonPremiumLimitUpload = 0;
192198
base::flat_map<Data::DefaultNotify, ushort> ringtoneDefaultVolumes;
193199
base::flat_map<ThreadId, ushort> ringtoneVolumes;
200+
base::flat_set<uint64> ratedTranscriptions;
194201

195202
stream >> versionTag;
196203
if (versionTag == kVersionTag) {
@@ -419,7 +426,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
419426
stream >> count;
420427
if (stream.status() == QDataStream::Ok) {
421428
for (auto i = 0; i != count; ++i) {
422-
quint64 period;
429+
auto period = quint64();
423430
stream >> period;
424431
mutePeriods.emplace_back(period);
425432
}
@@ -561,6 +568,23 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
561568
}
562569
}
563570
}
571+
if (!stream.atEnd()) {
572+
auto count = qint32(0);
573+
stream >> count;
574+
if (stream.status() == QDataStream::Ok) {
575+
for (auto i = 0; i != count; ++i) {
576+
auto transcriptionId = quint64();
577+
stream >> transcriptionId;
578+
if (stream.status() != QDataStream::Ok) {
579+
LOG(("App Error: "
580+
"Bad data for SessionSettings::addFromSerialized()"
581+
"with ratedTranscriptions"));
582+
return;
583+
}
584+
ratedTranscriptions.emplace(transcriptionId);
585+
}
586+
}
587+
}
564588
if (stream.status() != QDataStream::Ok) {
565589
LOG(("App Error: "
566590
"Bad data for SessionSettings::addFromSerialized()"));
@@ -610,6 +634,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
610634
_verticalSubsectionTabs = std::move(verticalSubsectionTabs);
611635
_ringtoneDefaultVolumes = std::move(ringtoneDefaultVolumes);
612636
_ringtoneVolumes = std::move(ringtoneVolumes);
637+
_ratedTranscriptions = std::move(ratedTranscriptions);
613638

614639
if (version < 2) {
615640
app.setLastSeenWarningSeen(appLastSeenWarningSeen == 1);
@@ -822,4 +847,12 @@ void SessionSettings::setRingtoneVolume(
822847
}
823848
}
824849

850+
void SessionSettings::markTranscriptionAsRated(uint64 transcriptionId) {
851+
_ratedTranscriptions.emplace(transcriptionId);
852+
}
853+
854+
bool SessionSettings::isTranscriptionRated(uint64 transcriptionId) const {
855+
return _ratedTranscriptions.contains(transcriptionId);
856+
}
857+
825858
} // namespace Main

Telegram/SourceFiles/main/main_session_settings.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ class SessionSettings final {
162162
MsgId topicRootId,
163163
PeerId monoforumPeerId) const;
164164

165+
void markTranscriptionAsRated(uint64 transcriptionId);
166+
[[nodiscard]] bool isTranscriptionRated(uint64 transcriptionId) const;
167+
165168
private:
166169
static constexpr auto kDefaultSupportChatsLimitSlice = 7 * 24 * 60 * 60;
167170
static constexpr auto kPhotoEditorHintMaxShowsCount = 5;
@@ -202,6 +205,8 @@ class SessionSettings final {
202205
= kDefaultSupportChatsLimitSlice;
203206
rpl::variable<bool> _supportAllSearchResults = false;
204207

208+
base::flat_set<uint64> _ratedTranscriptions;
209+
205210
};
206211

207212
} // namespace Main

0 commit comments

Comments
 (0)