From e5f457c30facaa728bf951f9586995c5f3f3232b Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 21 Nov 2023 19:27:25 +0300 Subject: [PATCH] Add updateSpeechRecognitionTrial. --- td/generate/scheme/td_api.tl | 7 +++++ td/telegram/ConfigManager.cpp | 20 ++++++++++++++ td/telegram/ConfigManager.h | 2 +- td/telegram/Global.h | 9 +++++++ td/telegram/Td.cpp | 1 + td/telegram/TranscriptionManager.cpp | 39 ++++++++++++++++++++++++++++ td/telegram/TranscriptionManager.h | 13 ++++++++++ 7 files changed, 90 insertions(+), 1 deletion(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 6eaad9639..72e073b42 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -6415,6 +6415,13 @@ updateActiveEmojiReactions emojis:vector = Update; //@description The type of default reaction has changed @reaction_type The new type of the default reaction updateDefaultReactionType reaction_type:ReactionType = Update; +//@description The parameters of speech recognition without Telegram Premium subscription has changed +//@max_media_duration The maximum allowed duration of media for speech recognition without Telegram Premium subscription +//@weekly_count The total number of allowed speech recognitions per week; 0 if none +//@left_count Number of left speech recognition attempts this week +//@next_recognition_date Point in time (Unix timestamp) when the user can use speech recognition without Telegram Premium subscription again; 0 if now or never +updateSpeechRecognitionTrial max_media_duration:int32 weekly_count:int32 left_count:int32 next_recognition_date:int32 = Update; + //@description The list of supported dice emojis has changed @emojis The new list of supported dice emojis updateDiceEmojis emojis:vector = Update; diff --git a/td/telegram/ConfigManager.cpp b/td/telegram/ConfigManager.cpp index fb3bbc28e..959d8d181 100644 --- a/td/telegram/ConfigManager.cpp +++ b/td/telegram/ConfigManager.cpp @@ -31,6 +31,7 @@ #include "td/telegram/TdDb.h" #include "td/telegram/telegram_api.h" #include "td/telegram/ThemeManager.h" +#include "td/telegram/TranscriptionManager.h" #include "td/mtproto/AuthData.h" #include "td/mtproto/AuthKey.h" @@ -1488,6 +1489,9 @@ void ConfigManager::process_app_config(tl_object_ptr &c FlatHashMap, AccentColorIdHash> light_colors; FlatHashMap, AccentColorIdHash> dark_colors; vector accent_color_ids; + int32 transcribe_audio_trial_weekly_number = 0; + int32 transcribe_audio_trial_duration_max = 0; + int32 transcribe_audio_trial_cooldown_until = 0; if (config->get_id() == telegram_api::jsonObject::ID) { for (auto &key_value : static_cast(config.get())->value_) { Slice key = key_value->key_; @@ -2010,6 +2014,18 @@ void ConfigManager::process_app_config(tl_object_ptr &c } continue; } + if (key == "transcribe_audio_trial_weekly_number") { + transcribe_audio_trial_weekly_number = get_json_value_int(std::move(key_value->value_), key); + continue; + } + if (key == "transcribe_audio_trial_duration_max") { + transcribe_audio_trial_duration_max = get_json_value_int(std::move(key_value->value_), key); + continue; + } + if (key == "transcribe_audio_trial_cooldown_until") { + transcribe_audio_trial_cooldown_until = get_json_value_int(std::move(key_value->value_), key); + continue; + } new_values.push_back(std::move(key_value)); } @@ -2031,6 +2047,10 @@ void ConfigManager::process_app_config(tl_object_ptr &c send_closure(G()->theme_manager(), &ThemeManager::on_update_accent_colors, std::move(light_colors), std::move(dark_colors), std::move(accent_color_ids)); + send_closure(G()->transcription_manager(), &TranscriptionManager::on_update_trial_parameters, + transcribe_audio_trial_weekly_number, transcribe_audio_trial_duration_max, + transcribe_audio_trial_cooldown_until); + Global &options = *G(); if (ignored_restriction_reasons.empty()) { diff --git a/td/telegram/ConfigManager.h b/td/telegram/ConfigManager.h index 55c67cd81..6032a913b 100644 --- a/td/telegram/ConfigManager.h +++ b/td/telegram/ConfigManager.h @@ -102,7 +102,7 @@ class ConfigManager final : public NetQueryCallback { private: struct AppConfig { - static constexpr int32 CURRENT_VERSION = 22; + static constexpr int32 CURRENT_VERSION = 23; int32 version_ = 0; int32 hash_ = 0; telegram_api::object_ptr config_; diff --git a/td/telegram/Global.h b/td/telegram/Global.h index 2cece6dc3..87c2b5744 100644 --- a/td/telegram/Global.h +++ b/td/telegram/Global.h @@ -68,6 +68,7 @@ class TdDb; class TempAuthKeyWatchdog; class ThemeManager; class TopDialogManager; +class TranscriptionManager; class UpdatesManager; class WebPagesManager; @@ -394,6 +395,13 @@ class Global final : public ActorContext { top_dialog_manager_ = top_dialog_manager; } + ActorId transcription_manager() const { + return transcription_manager_; + } + void set_transcription_manager(ActorId transcription_manager) { + transcription_manager_ = transcription_manager; + } + ActorId updates_manager() const { return updates_manager_; } @@ -554,6 +562,7 @@ class Global final : public ActorContext { ActorId story_manager_; ActorId theme_manager_; ActorId top_dialog_manager_; + ActorId transcription_manager_; ActorId updates_manager_; ActorId web_pages_manager_; ActorOwn connection_creator_; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 6669ed5ec..c607fe273 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -4045,6 +4045,7 @@ void Td::init_managers() { G()->set_top_dialog_manager(top_dialog_manager_actor_.get()); transcription_manager_ = make_unique(this, create_reference()); transcription_manager_actor_ = register_actor("TranscriptionManager", transcription_manager_.get()); + G()->set_transcription_manager(transcription_manager_actor_.get()); translation_manager_ = make_unique(this, create_reference()); translation_manager_actor_ = register_actor("TranslationManager", translation_manager_.get()); updates_manager_ = make_unique(this, create_reference()); diff --git a/td/telegram/TranscriptionManager.cpp b/td/telegram/TranscriptionManager.cpp index a66b874bd..941ced95c 100644 --- a/td/telegram/TranscriptionManager.cpp +++ b/td/telegram/TranscriptionManager.cpp @@ -6,6 +6,10 @@ // #include "td/telegram/TranscriptionManager.h" +#include "td/telegram/AuthManager.h" +#include "td/telegram/Global.h" +#include "td/telegram/Td.h" + namespace td { TranscriptionManager::TranscriptionManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) { @@ -15,4 +19,39 @@ void TranscriptionManager::tear_down() { parent_.reset(); } +void TranscriptionManager::on_update_trial_parameters(int32 weekly_number, int32 duration_max, int32 cooldown_until) { + CHECK(!td_->auth_manager_->is_bot()); + weekly_number = max(0, weekly_number); + duration_max = max(0, duration_max); + cooldown_until = max(0, cooldown_until); + int32 left_tries = trial_left_tries_; + if (cooldown_until <= G()->unix_time()) { + cooldown_until = 0; + left_tries = weekly_number; + } else if (left_tries > weekly_number) { + left_tries = weekly_number; + } + if (weekly_number == trial_weekly_number_ && duration_max == trial_duration_max_ && left_tries == trial_left_tries_ && + cooldown_until == trial_cooldown_until_) { + return; + } + + trial_weekly_number_ = weekly_number; + trial_duration_max_ = duration_max; + trial_left_tries_ = left_tries; + trial_cooldown_until_ = cooldown_until; + send_update_speech_recognition_trial(); +} + +void TranscriptionManager::send_update_speech_recognition_trial() const { + CHECK(!td_->auth_manager_->is_bot()); + send_closure(G()->td(), &Td::send_update, get_update_speech_recognition_trial_object()); +} + +td_api::object_ptr +TranscriptionManager::get_update_speech_recognition_trial_object() const { + return td_api::make_object(trial_duration_max_, trial_weekly_number_, + trial_left_tries_, trial_cooldown_until_); +} + } // namespace td diff --git a/td/telegram/TranscriptionManager.h b/td/telegram/TranscriptionManager.h index 9249009f3..90bb96d2b 100644 --- a/td/telegram/TranscriptionManager.h +++ b/td/telegram/TranscriptionManager.h @@ -6,6 +6,8 @@ // #pragma once +#include "td/telegram/td_api.h" + #include "td/actor/actor.h" #include "td/utils/common.h" @@ -18,11 +20,22 @@ class TranscriptionManager final : public Actor { public: TranscriptionManager(Td *td, ActorShared<> parent); + void on_update_trial_parameters(int32 weekly_number, int32 duration_max, int32 cooldown_until); + private: void tear_down() final; + void send_update_speech_recognition_trial() const; + + td_api::object_ptr get_update_speech_recognition_trial_object() const; + Td *td_; ActorShared<> parent_; + + int32 trial_weekly_number_ = 0; + int32 trial_duration_max_ = 0; + int32 trial_left_tries_ = 0; + int32 trial_cooldown_until_ = 0; }; } // namespace td