Reload voice chat when user opens a voice chat link.

This commit is contained in:
levlam 2021-06-03 20:16:14 +03:00
parent d77220c8ac
commit 126a20c318
4 changed files with 36 additions and 12 deletions

View File

@ -654,31 +654,35 @@ unique_ptr<LinkManager::InternalLink> LinkManager::parse_tg_link_query(Slice que
// resolve?domain=<username>&post=12345&single // resolve?domain=<username>&post=12345&single
return td::make_unique<InternalLinkMessage>(); return td::make_unique<InternalLinkMessage>();
} }
auto username = get_arg("domain");
for (auto &arg : url_query.args_) { for (auto &arg : url_query.args_) {
if (arg.first == "voicechat") { if (arg.first == "voicechat") {
// resolve?domain=<username>&voicechat // resolve?domain=<username>&voicechat
// resolve?domain=<username>&voicechat=<invite_hash> // resolve?domain=<username>&voicechat=<invite_hash>
return td::make_unique<InternalLinkVoiceChat>(get_arg("domain"), arg.second); if (Scheduler::context() != nullptr) {
send_closure(G()->messages_manager(), &MessagesManager::reload_voice_chat_on_search, username);
}
return td::make_unique<InternalLinkVoiceChat>(std::move(username), arg.second);
} }
if (arg.first == "start" && is_valid_start_parameter(arg.second)) { if (arg.first == "start" && is_valid_start_parameter(arg.second)) {
// resolve?domain=<bot_username>?start=<parameter> // resolve?domain=<bot_username>?start=<parameter>
return td::make_unique<InternalLinkBotStart>(get_arg("domain"), arg.second); return td::make_unique<InternalLinkBotStart>(std::move(username), arg.second);
} }
if (arg.first == "startgroup" && is_valid_start_parameter(arg.second)) { if (arg.first == "startgroup" && is_valid_start_parameter(arg.second)) {
// resolve?domain=<bot_username>?startgroup=<parameter> // resolve?domain=<bot_username>?startgroup=<parameter>
return td::make_unique<InternalLinkBotStartInGroup>(get_arg("domain"), arg.second); return td::make_unique<InternalLinkBotStartInGroup>(std::move(username), arg.second);
} }
if (arg.first == "game" && !arg.second.empty()) { if (arg.first == "game" && !arg.second.empty()) {
// resolve?domain=<bot_username>?game=<short_name> // resolve?domain=<bot_username>?game=<short_name>
return td::make_unique<InternalLinkGame>(get_arg("domain"), arg.second); return td::make_unique<InternalLinkGame>(std::move(username), arg.second);
} }
} }
if (get_arg("domain") == "telegrampassport") { if (username == "telegrampassport") {
// resolve?domain=telegrampassport&bot_id=<bot_user_id>&scope=<scope>&public_key=<public_key>&nonce=<nonce> // resolve?domain=telegrampassport&bot_id=<bot_user_id>&scope=<scope>&public_key=<public_key>&nonce=<nonce>
return get_internal_link_passport(url_query.args_); return get_internal_link_passport(url_query.args_);
} }
// resolve?domain=<username> // resolve?domain=<username>
return td::make_unique<InternalLinkPublicDialog>(get_arg("domain")); return td::make_unique<InternalLinkPublicDialog>(std::move(username));
} }
} else if (path.size() == 1 && path[0] == "login") { } else if (path.size() == 1 && path[0] == "login") {
// login?code=123456 // login?code=123456
@ -887,27 +891,31 @@ unique_ptr<LinkManager::InternalLink> LinkManager::parse_t_me_link_query(Slice q
// /<username>/12345?single&thread=<thread_id>&comment=<message_id> // /<username>/12345?single&thread=<thread_id>&comment=<message_id>
return td::make_unique<InternalLinkMessage>(); return td::make_unique<InternalLinkMessage>();
} }
auto username = path[0];
for (auto &arg : url_query.args_) { for (auto &arg : url_query.args_) {
if (arg.first == "voicechat") { if (arg.first == "voicechat") {
// /<username>?voicechat // /<username>?voicechat
// /<username>?voicechat=<invite_hash> // /<username>?voicechat=<invite_hash>
return td::make_unique<InternalLinkVoiceChat>(path[0], arg.second); if (Scheduler::context() != nullptr) {
send_closure(G()->messages_manager(), &MessagesManager::reload_voice_chat_on_search, username);
}
return td::make_unique<InternalLinkVoiceChat>(std::move(username), arg.second);
} }
if (arg.first == "start" && is_valid_start_parameter(arg.second)) { if (arg.first == "start" && is_valid_start_parameter(arg.second)) {
// /<bot_username>?start=<parameter> // /<bot_username>?start=<parameter>
return td::make_unique<InternalLinkBotStart>(path[0], arg.second); return td::make_unique<InternalLinkBotStart>(std::move(username), arg.second);
} }
if (arg.first == "startgroup" && is_valid_start_parameter(arg.second)) { if (arg.first == "startgroup" && is_valid_start_parameter(arg.second)) {
// /<bot_username>?startgroup=<parameter> // /<bot_username>?startgroup=<parameter>
return td::make_unique<InternalLinkBotStartInGroup>(path[0], arg.second); return td::make_unique<InternalLinkBotStartInGroup>(std::move(username), arg.second);
} }
if (arg.first == "game" && !arg.second.empty()) { if (arg.first == "game" && !arg.second.empty()) {
// /<bot_username>?game=<short_name> // /<bot_username>?game=<short_name>
return td::make_unique<InternalLinkGame>(path[0], arg.second); return td::make_unique<InternalLinkGame>(std::move(username), arg.second);
} }
} }
// /<username> // /<username>
return td::make_unique<InternalLinkPublicDialog>(path[0]); return td::make_unique<InternalLinkPublicDialog>(std::move(username));
} }
return nullptr; return nullptr;
} }

View File

@ -29717,6 +29717,15 @@ DialogId MessagesManager::search_public_dialog(const string &username_to_search,
if (dialog_id.is_valid()) { if (dialog_id.is_valid()) {
if (have_input_peer(dialog_id, AccessRights::Read)) { if (have_input_peer(dialog_id, AccessRights::Read)) {
if (!force && reload_voice_chat_on_search_usernames_.count(username)) {
reload_voice_chat_on_search_usernames_.erase(username);
if (dialog_id.get_type() == DialogType::Channel) {
td_->contacts_manager_->reload_channel_full(dialog_id.get_channel_id(), std::move(promise),
"search_public_dialog");
return DialogId();
}
}
if (td_->auth_manager_->is_bot()) { if (td_->auth_manager_->is_bot()) {
force_create_dialog(dialog_id, "search_public_dialog", true); force_create_dialog(dialog_id, "search_public_dialog", true);
} else { } else {
@ -29743,6 +29752,10 @@ DialogId MessagesManager::search_public_dialog(const string &username_to_search,
return DialogId(); return DialogId();
} }
void MessagesManager::reload_voice_chat_on_search(const string &username) {
reload_voice_chat_on_search_usernames_.insert(clean_username(username));
}
void MessagesManager::send_get_dialog_notification_settings_query(DialogId dialog_id, Promise<Unit> &&promise) { void MessagesManager::send_get_dialog_notification_settings_query(DialogId dialog_id, Promise<Unit> &&promise) {
if (td_->auth_manager_->is_bot() || dialog_id.get_type() == DialogType::SecretChat) { if (td_->auth_manager_->is_bot() || dialog_id.get_type() == DialogType::SecretChat) {
LOG(WARNING) << "Can't get notification settings for " << dialog_id; LOG(WARNING) << "Can't get notification settings for " << dialog_id;

View File

@ -364,6 +364,8 @@ class MessagesManager : public Actor {
DialogId search_public_dialog(const string &username_to_search, bool force, Promise<Unit> &&promise); DialogId search_public_dialog(const string &username_to_search, bool force, Promise<Unit> &&promise);
void reload_voice_chat_on_search(const string &username);
Result<MessageId> send_message( Result<MessageId> send_message(
DialogId dialog_id, MessageId top_thread_message_id, MessageId reply_to_message_id, DialogId dialog_id, MessageId top_thread_message_id, MessageId reply_to_message_id,
tl_object_ptr<td_api::messageSendOptions> &&options, tl_object_ptr<td_api::ReplyMarkup> &&reply_markup, tl_object_ptr<td_api::messageSendOptions> &&options, tl_object_ptr<td_api::ReplyMarkup> &&reply_markup,
@ -3243,6 +3245,7 @@ class MessagesManager : public Actor {
std::unordered_map<string, ResolvedUsername> resolved_usernames_; std::unordered_map<string, ResolvedUsername> resolved_usernames_;
std::unordered_map<string, DialogId> inaccessible_resolved_usernames_; std::unordered_map<string, DialogId> inaccessible_resolved_usernames_;
std::unordered_set<string> reload_voice_chat_on_search_usernames_;
struct PendingOnGetDialogs { struct PendingOnGetDialogs {
FolderId folder_id; FolderId folder_id;

View File

@ -887,7 +887,7 @@ class SearchPublicChatRequest : public RequestActor<> {
public: public:
SearchPublicChatRequest(ActorShared<Td> td, uint64 request_id, string username) SearchPublicChatRequest(ActorShared<Td> td, uint64 request_id, string username)
: RequestActor(std::move(td), request_id), username_(std::move(username)) { : RequestActor(std::move(td), request_id), username_(std::move(username)) {
set_tries(3); set_tries(4); // 1 for server request + 1 for reload voice chat + 1 for reload dialog + 1 for result
} }
}; };