Update API scheme.

This commit is contained in:
John Preston 2021-03-08 12:49:07 +04:00
parent f41abe0a28
commit ccd440ea0b
6 changed files with 62 additions and 32 deletions

View file

@ -92,7 +92,7 @@ inputPhotoFileLocation#40181ffe id:long access_hash:long file_reference:bytes th
inputPhotoLegacyFileLocation#d83466f3 id:long access_hash:long file_reference:bytes volume_id:long local_id:int secret:long = InputFileLocation;
inputPeerPhotoFileLocation#27d69997 flags:# big:flags.0?true peer:InputPeer volume_id:long local_id:int = InputFileLocation;
inputStickerSetThumb#dbaeae9 stickerset:InputStickerSet volume_id:long local_id:int = InputFileLocation;
inputGroupCallStream#d1cc2a5f call:InputGroupCall date:int = InputFileLocation;
inputGroupCallStream#bba51639 call:InputGroupCall time_ms:long scale:int = InputFileLocation;
peerUser#9db1bc6d user_id:int = Peer;
peerChat#bad0e5bb chat_id:int = Peer;
@ -1240,6 +1240,8 @@ messages.chatAdminsWithInvites#b69b72d7 admins:Vector<ChatAdminWithInvites> user
messages.checkedHistoryImportPeer#a24de717 confirm_text:string = messages.CheckedHistoryImportPeer;
phone.joinAsPeers#afe5623f peers:Vector<Peer> chats:Vector<Chat> users:Vector<User> = phone.JoinAsPeers;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@ -1623,6 +1625,7 @@ phone.checkGroupCall#b74a7bea call:InputGroupCall source:int = Bool;
phone.toggleGroupCallRecord#c02a66d7 flags:# start:flags.0?true call:InputGroupCall title:flags.1?string = Updates;
phone.editGroupCallParticipant#d975eb80 flags:# muted:flags.0?true call:InputGroupCall participant:InputPeer volume:flags.1?int raise_hand:flags.2?Bool = Updates;
phone.editGroupCallTitle#1ca6ac0a call:InputGroupCall title:string = Updates;
phone.getGroupCallJoinAs#ef7c213a peer:InputPeer = phone.JoinAsPeers;
langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference;
langpack.getStrings#efea3803 lang_pack:string lang_code:string keys:Vector<string> = Vector<LangPackString>;

View file

@ -163,20 +163,18 @@ void ChooseJoinAsProcess::start(
not_null<PeerData*> peer,
Context context,
Fn<void(object_ptr<Ui::BoxContent>)> showBox,
Fn<void(QString)> showToast,
Fn<void(JoinInfo)> done,
PeerData *currentJoinAs) {
Expects(done != nullptr);
const auto session = &peer->session();
if (_request) {
const auto already = _request->peer;
_request->context = context;
_request->showBox = std::move(showBox);
_request->done = std::move(done);
if (already == peer) {
return;
} else if (&already->session() == session) {
_request->peer = peer;
if (_request->peer == peer) {
_request->context = context;
_request->showBox = std::move(showBox);
_request->showToast = std::move(showToast);
_request->done = std::move(done);
return;
}
session->api().request(_request->id).cancel();
@ -186,6 +184,7 @@ void ChooseJoinAsProcess::start(
ChannelsListRequest{
.peer = peer,
.showBox = std::move(showBox),
.showToast = std::move(showToast),
.done = std::move(done),
.context = context });
session->account().sessionChanges(
@ -204,39 +203,52 @@ void ChooseJoinAsProcess::start(
}
};
using Flag = MTPchannels_GetAdminedPublicChannels::Flag;
_request->id = session->api().request(
MTPchannels_GetAdminedPublicChannels(
MTP_flags(Flag::f_for_groupcall))
).done([=](const MTPmessages_Chats &result) {
const auto &chats = result.match([](const auto &data) {
return data.vchats().v;
});
_request->id = session->api().request(MTPphone_GetGroupCallJoinAs(
_request->peer->input
)).done([=](const MTPphone_JoinAsPeers &result) {
const auto peer = _request->peer;
const auto self = peer->session().user();
auto info = JoinInfo{ .peer = peer, .joinAs = self };
if (chats.size() == 1) {
auto list = result.match([&](const MTPDphone_joinAsPeers &data) {
session->data().processUsers(data.vusers());
session->data().processChats(data.vchats());
const auto &peers = data.vpeers().v;
auto list = std::vector<not_null<PeerData*>>();
list.reserve(peers.size());
for (const auto &peer : peers) {
const auto peerId = peerFromMTP(peer);
if (const auto peer = session->data().peerLoaded(peerId)) {
if (!ranges::contains(list, not_null{ peer })) {
list.push_back(peer);
}
}
}
return list;
});
if (list.empty()) {
_request->showToast("No way to join this voice chat :(");
return;
} else if (list.size() == 1 && list.front() == self) {
info.possibleJoinAs = std::move(list);
finish(info);
return;
}
auto list = std::vector<not_null<PeerData*>>();
list.reserve(chats.size() + 1);
list.push_back(self);
for (const auto &chat : chats) {
list.push_back(session->data().processChat(chat));
}
const auto selected = [&]() -> PeerData* {
info.joinAs = [&]() -> not_null<PeerData*> {
const auto selectedId = peer->groupCallDefaultJoinAs();
if (!selectedId) {
return self;
}
const auto loaded = session->data().peerLoaded(selectedId);
return (loaded && ranges::contains(list, not_null{ loaded }))
return (currentJoinAs && ranges::contains(list, not_null{ currentJoinAs }))
? not_null(currentJoinAs)
: (loaded && ranges::contains(list, not_null{ loaded }))
? not_null(loaded)
: self;
: ranges::contains(list, self)
? self
: list.front();
}();
info.joinAs = currentJoinAs ? currentJoinAs : selected;
info.possibleJoinAs = std::move(list);
auto box = Box(
ChooseJoinAsBox,
context,

View file

@ -35,6 +35,7 @@ public:
not_null<PeerData*> peer,
Context context,
Fn<void(object_ptr<Ui::BoxContent>)> showBox,
Fn<void(QString)> showToast,
Fn<void(JoinInfo)> done,
PeerData *currentJoinAs = nullptr);
@ -42,6 +43,7 @@ private:
struct ChannelsListRequest {
not_null<PeerData*> peer;
Fn<void(object_ptr<Ui::BoxContent>)> showBox;
Fn<void(QString)> showToast;
Fn<void(JoinInfo)> done;
base::has_weak_ptr guard;
QPointer<Ui::BoxContent> box;

View file

@ -164,13 +164,18 @@ void GroupCallSettingsBox(
const auto callback = [=](Group::JoinInfo info) {
call->rejoinAs(info);
};
auto showBox = [=](object_ptr<Ui::BoxContent> next) {
const auto showBox = [=](object_ptr<Ui::BoxContent> next) {
box->getDelegate()->show(std::move(next));
};
const auto showToast = [=](QString text) {
const auto container = box->getDelegate()->outerContainer();
Ui::Toast::Show(container, text);
};
state->joinAsProcess.start(
peer,
context,
showBox,
showToast,
callback,
call->joinAs());
});

View file

@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_session.h"
#include "media/audio/media_audio_track.h"
#include "platform/platform_specific.h"
#include "ui/toast/toast.h"
#include "base/unixtime.h"
#include "mainwidget.h"
#include "mtproto/mtproto_config.h"
@ -66,6 +67,8 @@ void Instance::startOrJoinGroupCall(not_null<PeerData*> peer) {
: Group::ChooseJoinAsProcess::Context::Create;
_chooseJoinAs.start(peer, context, [=](object_ptr<Ui::BoxContent> box) {
Ui::show(std::move(box), Ui::LayerOption::KeepOther);
}, [=](QString text) {
Ui::Toast::Show(text);
}, [=](Group::JoinInfo info) {
const auto call = info.peer->groupCall();
createGroupCall(

View file

@ -172,7 +172,8 @@ StorageFileLocation::StorageFileLocation(
_id = data.vid().v;
_accessHash = data.vaccess_hash().v;
});
_localId = data.vdate().v;
_volumeId = data.vtime_ms().v;
_localId = data.vscale().v;
});
}
@ -260,6 +261,7 @@ MTPInputFileLocation StorageFileLocation::tl(int32 self) const {
case Type::GroupCallStream:
return MTP_inputGroupCallStream(
MTP_inputGroupCall(MTP_long(_id), MTP_long(_accessHash)),
MTP_long(_volumeId),
MTP_int(_localId));
}
@ -372,7 +374,7 @@ bool StorageFileLocation::valid() const {
return (_dcId != 0) && (_id != 0);
case Type::GroupCallStream:
return (_dcId != 0) && (_id != 0) && (_localId != 0);
return (_dcId != 0) && (_id != 0) && (_volumeId != 0);
}
return false;
}
@ -419,7 +421,10 @@ Storage::Cache::Key StorageFileLocation::cacheKey() const {
case Type::GroupCallStream:
return Key{
shifted | sliced | (uint64(uint32(_localId)) << 16),
(shifted
| sliced
| (uint32(_localId) << 16)
| (_volumeId << 20)),
_id };
}
return Key();