Add td_api::CallProblem.
GitOrigin-RevId: 421cd01239ef43d3073556f3a222db17d5d0d3e5
This commit is contained in:
parent
a5a7e30ec5
commit
1afdf258ab
@ -1627,6 +1627,30 @@ callStateDiscarded reason:CallDiscardReason need_rating:Bool need_debug_informat
|
|||||||
callStateError error:error = CallState;
|
callStateError error:error = CallState;
|
||||||
|
|
||||||
|
|
||||||
|
//@class CallProblem @description Describes a type of a problem that happened during a call
|
||||||
|
|
||||||
|
//@description The user heard his own voice
|
||||||
|
callProblemEcho = CallProblem;
|
||||||
|
|
||||||
|
//@description The user heard background noice
|
||||||
|
callProblemNoice = CallProblem;
|
||||||
|
|
||||||
|
//@description The other side kept disappearing
|
||||||
|
callProblemInterruptions = CallProblem;
|
||||||
|
|
||||||
|
//@description The speech was distorted
|
||||||
|
callProblemDistortedSpeech = CallProblem;
|
||||||
|
|
||||||
|
//@description The user couldn't hear the other side
|
||||||
|
callProblemSilentLocal = CallProblem;
|
||||||
|
|
||||||
|
//@description The other side couldn't hear the user
|
||||||
|
callProblemSilentRemote = CallProblem;
|
||||||
|
|
||||||
|
//@description The call ended unexpectedly
|
||||||
|
callProblemDropped = CallProblem;
|
||||||
|
|
||||||
|
|
||||||
//@description Describes a call @id Call identifier, not persistent @user_id Peer user identifier @is_outgoing True, if the call is outgoing @state Call state
|
//@description Describes a call @id Call identifier, not persistent @user_id Peer user identifier @is_outgoing True, if the call is outgoing @state Call state
|
||||||
call id:int32 user_id:int32 is_outgoing:Bool state:CallState = Call;
|
call id:int32 user_id:int32 is_outgoing:Bool state:CallState = Call;
|
||||||
|
|
||||||
@ -3415,8 +3439,8 @@ acceptCall call_id:int32 protocol:callProtocol = Ok;
|
|||||||
//@description Discards a call @call_id Call identifier @is_disconnected True, if the user was disconnected @duration The call duration, in seconds @connection_id Identifier of the connection used during the call
|
//@description Discards a call @call_id Call identifier @is_disconnected True, if the user was disconnected @duration The call duration, in seconds @connection_id Identifier of the connection used during the call
|
||||||
discardCall call_id:int32 is_disconnected:Bool duration:int32 connection_id:int64 = Ok;
|
discardCall call_id:int32 is_disconnected:Bool duration:int32 connection_id:int64 = Ok;
|
||||||
|
|
||||||
//@description Sends a call rating @call_id Call identifier @rating Call rating; 1-5 @comment An optional user comment if the rating is less than 5
|
//@description Sends a call rating @call_id Call identifier @rating Call rating; 1-5 @comment An optional user comment if the rating is less than 5 @problems List of problems with the call, specified by the user
|
||||||
sendCallRating call_id:int32 rating:int32 comment:string = Ok;
|
sendCallRating call_id:int32 rating:int32 comment:string problems:vector<CallProblem> = Ok;
|
||||||
|
|
||||||
//@description Sends debug information for a call @call_id Call identifier @debug_information Debug information in application-specific format
|
//@description Sends debug information for a call @call_id Call identifier @debug_information Debug information in application-specific format
|
||||||
sendCallDebugInformation call_id:int32 debug_information:string = Ok;
|
sendCallDebugInformation call_id:int32 debug_information:string = Ok;
|
||||||
|
Binary file not shown.
@ -29,9 +29,10 @@
|
|||||||
#include "td/utils/Random.h"
|
#include "td/utils/Random.h"
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
// CallProtocol
|
|
||||||
CallProtocol CallProtocol::from_telegram_api(const telegram_api::phoneCallProtocol &protocol) {
|
CallProtocol CallProtocol::from_telegram_api(const telegram_api::phoneCallProtocol &protocol) {
|
||||||
CallProtocol res;
|
CallProtocol res;
|
||||||
res.udp_p2p = protocol.udp_p2p_;
|
res.udp_p2p = protocol.udp_p2p_;
|
||||||
@ -110,7 +111,6 @@ tl_object_ptr<td_api::CallState> CallState::as_td_api() const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CallActor
|
|
||||||
CallActor::CallActor(CallId call_id, ActorShared<> parent, Promise<int64> promise)
|
CallActor::CallActor(CallId call_id, ActorShared<> parent, Promise<int64> promise)
|
||||||
: parent_(std::move(parent)), call_id_promise_(std::move(promise)), local_call_id_(call_id) {
|
: parent_(std::move(parent)), call_id_promise_(std::move(promise)), local_call_id_(call_id) {
|
||||||
}
|
}
|
||||||
@ -186,11 +186,53 @@ void CallActor::accept_call(CallProtocol &&protocol, Promise<> promise) {
|
|||||||
loop();
|
loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallActor::rate_call(int32 rating, string comment, Promise<> promise) {
|
void CallActor::rate_call(int32 rating, string comment, vector<td_api::object_ptr<td_api::CallProblem>> &&problems,
|
||||||
|
Promise<> promise) {
|
||||||
if (!call_state_.need_rating) {
|
if (!call_state_.need_rating) {
|
||||||
return promise.set_error(Status::Error(400, "Unexpected sendCallRating"));
|
return promise.set_error(Status::Error(400, "Unexpected sendCallRating"));
|
||||||
}
|
}
|
||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
|
|
||||||
|
if (rating == 5) {
|
||||||
|
comment.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unordered_set<string> tags;
|
||||||
|
for (auto &problem : problems) {
|
||||||
|
if (problem == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *tag = [problem_id = problem->get_id()] {
|
||||||
|
switch (problem_id) {
|
||||||
|
case td_api::callProblemEcho::ID:
|
||||||
|
return "echo";
|
||||||
|
case td_api::callProblemNoice::ID:
|
||||||
|
return "noise";
|
||||||
|
case td_api::callProblemInterruptions::ID:
|
||||||
|
return "interruptions";
|
||||||
|
case td_api::callProblemDistortedSpeech::ID:
|
||||||
|
return "distorted_speech";
|
||||||
|
case td_api::callProblemSilentLocal::ID:
|
||||||
|
return "silent_local";
|
||||||
|
case td_api::callProblemSilentRemote::ID:
|
||||||
|
return "silent_remote";
|
||||||
|
case td_api::callProblemDropped::ID:
|
||||||
|
return "dropped";
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
if (tags.insert(tag).second) {
|
||||||
|
if (!comment.empty()) {
|
||||||
|
comment += ' ';
|
||||||
|
}
|
||||||
|
comment += '#';
|
||||||
|
comment += tag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto tl_query = telegram_api::phone_setCallRating(0, false /*ignored*/, get_input_phone_call("rate_call"), rating,
|
auto tl_query = telegram_api::phone_setCallRating(0, false /*ignored*/, get_input_phone_call("rate_call"), rating,
|
||||||
std::move(comment));
|
std::move(comment));
|
||||||
auto query = G()->net_query_creator().create(create_storer(tl_query));
|
auto query = G()->net_query_creator().create(create_storer(tl_query));
|
||||||
|
@ -81,7 +81,8 @@ class CallActor : public NetQueryCallback {
|
|||||||
bool is_video, Promise<CallId> &&promise);
|
bool is_video, Promise<CallId> &&promise);
|
||||||
void discard_call(bool is_disconnected, int32 duration, bool is_video, int64 connection_id, Promise<> promise);
|
void discard_call(bool is_disconnected, int32 duration, bool is_video, int64 connection_id, Promise<> promise);
|
||||||
void accept_call(CallProtocol &&protocol, Promise<> promise);
|
void accept_call(CallProtocol &&protocol, Promise<> promise);
|
||||||
void rate_call(int32 rating, string comment, Promise<> promise);
|
void rate_call(int32 rating, string comment, vector<td_api::object_ptr<td_api::CallProblem>> &&problems,
|
||||||
|
Promise<> promise);
|
||||||
void send_call_debug_information(string data, Promise<> promise);
|
void send_call_debug_information(string data, Promise<> promise);
|
||||||
|
|
||||||
void update_call(tl_object_ptr<telegram_api::PhoneCall> call);
|
void update_call(tl_object_ptr<telegram_api::PhoneCall> call);
|
||||||
|
@ -71,12 +71,13 @@ void CallManager::accept_call(CallId call_id, CallProtocol &&protocol, Promise<>
|
|||||||
send_closure(actor, &CallActor::accept_call, std::move(protocol), std::move(promise));
|
send_closure(actor, &CallActor::accept_call, std::move(protocol), std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallManager::rate_call(CallId call_id, int32 rating, string comment, Promise<> promise) {
|
void CallManager::rate_call(CallId call_id, int32 rating, string comment,
|
||||||
|
vector<td_api::object_ptr<td_api::CallProblem>> &&problems, Promise<> promise) {
|
||||||
auto actor = get_call_actor(call_id);
|
auto actor = get_call_actor(call_id);
|
||||||
if (actor.empty()) {
|
if (actor.empty()) {
|
||||||
return promise.set_error(Status::Error(400, "Call not found"));
|
return promise.set_error(Status::Error(400, "Call not found"));
|
||||||
}
|
}
|
||||||
send_closure(actor, &CallActor::rate_call, rating, std::move(comment), std::move(promise));
|
send_closure(actor, &CallActor::rate_call, rating, std::move(comment), std::move(problems), std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallManager::send_call_debug_information(CallId call_id, string data, Promise<> promise) {
|
void CallManager::send_call_debug_information(CallId call_id, string data, Promise<> promise) {
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "td/telegram/CallActor.h"
|
#include "td/telegram/CallActor.h"
|
||||||
#include "td/telegram/CallId.h"
|
#include "td/telegram/CallId.h"
|
||||||
|
|
||||||
|
#include "td/telegram/td_api.h"
|
||||||
#include "td/telegram/telegram_api.h"
|
#include "td/telegram/telegram_api.h"
|
||||||
|
|
||||||
#include "td/actor/actor.h"
|
#include "td/actor/actor.h"
|
||||||
@ -32,7 +33,8 @@ class CallManager : public Actor {
|
|||||||
void discard_call(CallId call_id, bool is_disconnected, int32 duration, bool is_video, int64 connection_id,
|
void discard_call(CallId call_id, bool is_disconnected, int32 duration, bool is_video, int64 connection_id,
|
||||||
Promise<> promise);
|
Promise<> promise);
|
||||||
void accept_call(CallId call_id, CallProtocol &&protocol, Promise<> promise);
|
void accept_call(CallId call_id, CallProtocol &&protocol, Promise<> promise);
|
||||||
void rate_call(CallId call_id, int32 rating, string comment, Promise<> promise);
|
void rate_call(CallId call_id, int32 rating, string comment,
|
||||||
|
vector<td_api::object_ptr<td_api::CallProblem>> &&problems, Promise<> promise);
|
||||||
void send_call_debug_information(CallId call_id, string data, Promise<> promise);
|
void send_call_debug_information(CallId call_id, string data, Promise<> promise);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -5925,7 +5925,7 @@ void Td::on_request(uint64 id, td_api::sendCallRating &request) {
|
|||||||
CLEAN_INPUT_STRING(request.comment_);
|
CLEAN_INPUT_STRING(request.comment_);
|
||||||
CREATE_OK_REQUEST_PROMISE();
|
CREATE_OK_REQUEST_PROMISE();
|
||||||
send_closure(G()->call_manager(), &CallManager::rate_call, CallId(request.call_id_), request.rating_,
|
send_closure(G()->call_manager(), &CallManager::rate_call, CallId(request.call_id_), request.rating_,
|
||||||
std::move(request.comment_), std::move(promise));
|
std::move(request.comment_), std::move(request.problems_), std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Td::on_request(uint64 id, td_api::sendCallDebugInformation &request) {
|
void Td::on_request(uint64 id, td_api::sendCallDebugInformation &request) {
|
||||||
|
@ -2491,8 +2491,19 @@ class CliClient final : public Actor {
|
|||||||
send_request(td_api::make_object<td_api::acceptCall>(
|
send_request(td_api::make_object<td_api::acceptCall>(
|
||||||
as_call_id(args), td_api::make_object<td_api::callProtocol>(true, true, 65, 65)));
|
as_call_id(args), td_api::make_object<td_api::callProtocol>(true, true, 65, 65)));
|
||||||
} else if (op == "scr" || op == "SendCallRating") {
|
} else if (op == "scr" || op == "SendCallRating") {
|
||||||
|
string call_id;
|
||||||
|
string rating;
|
||||||
|
std::tie(call_id, rating) = split(args);
|
||||||
|
|
||||||
|
vector<td_api::object_ptr<td_api::CallProblem>> problems;
|
||||||
|
problems.emplace_back(td_api::make_object<td_api::callProblemNoice>());
|
||||||
|
problems.emplace_back(td_api::make_object<td_api::callProblemNoice>());
|
||||||
|
problems.emplace_back(nullptr);
|
||||||
|
problems.emplace_back(td_api::make_object<td_api::callProblemNoice>());
|
||||||
|
problems.emplace_back(td_api::make_object<td_api::callProblemEcho>());
|
||||||
|
problems.emplace_back(td_api::make_object<td_api::callProblemDistortedSpeech>());
|
||||||
send_request(
|
send_request(
|
||||||
td_api::make_object<td_api::sendCallRating>(as_call_id(args), 5, "Wow, such good call! (TDLib test)"));
|
td_api::make_object<td_api::sendCallRating>(as_call_id(call_id), to_integer<int32>(rating), "Wow, such good call! (TDLib test)", std::move(problems)));
|
||||||
} else if (op == "scdi" || op == "SendCallDebugInformation") {
|
} else if (op == "scdi" || op == "SendCallDebugInformation") {
|
||||||
send_request(td_api::make_object<td_api::sendCallDebugInformation>(as_call_id(args), "{}"));
|
send_request(td_api::make_object<td_api::sendCallDebugInformation>(as_call_id(args), "{}"));
|
||||||
} else if (op == "gcil") {
|
} else if (op == "gcil") {
|
||||||
|
Loading…
Reference in New Issue
Block a user